概述:
1. kubernetes API 访问控制
官网文档:
https://kubernetes.io/zh/docs...
kubernetes api分为:认证、受权、准入管制
- 用户通过 kubectl、客户端库或者通过发送 REST 申请拜访 API。 用户(自然人)和 Kubernetes 服务账户 都能够被受权进行 API 拜访。 申请达到 API 服务器后会通过几个阶段,具体阐明如图:
- 首先看一下 Kubernetes API 申请的发动,申请的发动分为两个局部:
- 第一个局部是人机交互的过程。 是大家十分相熟的用 kubectl 对 apiserver 的一个申请过程 应用的是 Users Accounts一般账户;
- 第二个局部是 Pod 中的业务逻辑与 apiserver 之间的交互 应用的是Service Accounts 服务帐号。
- 当咱们的 apiserver 收到申请后,就会开启访问控制流程。这外面分为三个步骤:
- Authentication 认证阶段:判断申请用户是否为可能拜访集群的非法用户。如果用户是个非法用户,那 apiserver会返回一个 401 的状态码,并终止该申请;
- 如果用户非法的话,咱们的 apiserver 会进入到访问控制的第二阶段 Authorization:受权阶段。在该阶段中apiserver 会判断用户是否有权限进行申请中的操作。如果无权进行操作,apiserver 会返回 403的状态码,并同样终止该申请;
- 如果用户有权进行该操作的话,访问控制会进入到第三个阶段:AdmissionControl。在该阶段中 apiserver 的admission controller 会判断申请是否是一个平安合规的申请。如果最终验证通过的话,访问控制流程才会完结。
此时咱们的申请将会转换为一个 Kubernetes objects 相应的变更申请,最终长久化到 ETCD 中。
认证(任意一种) -->受权(个别是rbac 和 node)–> 准入管制(本人抉择)
2. 认证 Authentication
认证有多种,能够启动一种或多种认证形式,只有有一种认证形式通过,就不再对其它形式认证,通常启动X 509 Client Certs和Service Accout Tokens两种认证形式
- 常见的认证:
- 疏导令牌(Token) : 如:节点退出时认证:kubelet
- 动态令牌: 存储于API Server过程可间接加载到的文件中保留的令牌,该文件内容会由API Server缓存于内存中;
- 动态明码:存储于API Server过程可间接加载到的文件中保留的账户和明码令牌,该文件内容会由API Server缓存于内存中;
- ServiceAccount令牌:
- OpenID Connect令牌:OIDC令牌,
- OAuth 2 webhook令牌
- 代理认证等
拜访k8s的API Server的客户端次要分为两类:
- kubectl :用户家目录中的 .kube/config 外面保留了客户端拜访API Server的密钥相干信息,这样当用kubectl拜访k8s时,它就会主动读取该配置文件,向API Server发动认证,而后实现操作申请,应用Users Accounts一般账户。
- pod:Pod中的过程须要拜访API Server,如果是人去拜访或编写的脚本去拜访,这类拜访应用的账号为:UserAccount;而Pod本身去连贯API Server时,应用的账号是:ServiceAccount,生产中后者应用居多。
kubectl 向 apiserver发动的命令,采纳的时http形式,其实就是对URL发动增删改查的操作。
[root@k8s-master ~]# kubectl proxy --port=8888 &[root@k8s-master ~]# curl http://localhost:8888/api/v1/namespaces/default[root@k8s-master ~]# curl http://localhost:8888/apis/apps/v1/namespaces/default/deployments
- 以上两种api的区别是:
api它是一个非凡链接,只有在外围v1群组中的对象能力应用。
apis 它是个别API拜访的入口固定格局名
ServiceAccount令牌认证
- K8S主动为每个Pod注入一个ServiceAccount令牌,在每个名称空间中,会主动存在(由ServiceAccount准入控制器负责)一个ServiceAccount,将被该空间下的每个Pod共享应用。
- 认证令牌保留于该空间下的一个Secret对象中,该对象中共有三个信息:
1.namespace
2.ca.crt
3.token - 资源定义格局:
apiVersion: v1 #ServiceAccount所属的API群组及版本kind: serviceAccount #资源类型标识metadata: name <string> #资源名称 namespace <string> # ServiceAccount是名称空间级别的资源automountServiceAccountToken <boolean> # 是否让Pod主动挂载API令牌secrets <[]object> #以该SA运行的Pod所要应用的Secret对象组成的列表 apiVersion <string> #援用的Secret对象所属的API群组及版本,可省略 kind <string> #援用的资源的类型,这里是指Secret,可省略 name <string> #援用的Secret对象的名称,通常仅给出该字段即可 namespace <string> #援用的Secret对象所属的名称空间 uid <string># 援用的Secret对象的标识符;imagePullSecrets <[]object> # 援用的用于下载Pod中容器镜像的Secret对象列表 之前讲到secret时提到过Pod挂载公有仓库secret,理论应用不不便须要每个Pod独自挂载,放到serviceaccount就不必每个Pod独自挂载 name <string> #docker-registry类型的Secret资源的名称
示例: 查看Pod 默认ServiceAccount及Secret
[root@k8s-master ~]# kubectl get pod NAME READY STATUS RESTARTS AGEcentos-deployment-66d8cd5f8b-9x47c 1/1 Running 1 41hdemodb-0 1/1 Running 0 17hdemodb-1 1/1 Running 0 16h
- 默认状况下没有指定ServiceAccount都会把默认的ServiceAccount挂载到Pod
[root@k8s-master ~]# kubectl describe pod demodb-0 Annotations: <none>... Mounts: /demodb/data from data (rw) /var/run/secrets/kubernetes.io/serviceaccount from default-token-fsshk (ro) #默认的ServiceAccount令牌...Volumes: data: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: data-demodb-0 ReadOnly: false default-token-fsshk: #默认的ServiceAccount令牌 存储卷 Type: Secret (a volume populated by a Secret) SecretName: default-token-fsshk Optional: falseQoS Class: BestEffortNode-Selectors: <none>Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300sEvents: <none>
- 每个名称空间下都主动生成一个默认的secret
[root@k8s-master ~]# kubectl get secretNAME TYPE DATA AGEdefault-token-fsshk kubernetes.io/service-account-token 3 51d harbor-tom kubernetes.io/dockerconfigjson 1 11dmysql-root-authn Opaque 2 11dnginx-ssl-secret kubernetes.io/tls 2 11dweb-basic-authn kubenetes.io/basic-auth 2 11d[root@k8s-master ~]# kubectl get secret -n kube-systemNAME TYPE DATA AGEattachdetach-controller-token-bpprw kubernetes.io/service-account-token 3 51dbootstrap-signer-token-69hd8 kubernetes.io/service-account-token 3 51dbootstrap-token-hbjzpz bootstrap.kubernetes.io/token 5 14dcertificate-controller-token-26sn8 kubernetes.io/service-account-token 3 51dclusterrole-aggregation-controller-token-hlb6c kubernetes.io/service-account-token 3 51dcoredns-token-k6swp kubernetes.io/service-account-token 3 51dcronjob-controller-token-449ng kubernetes.io/service-account-token 3 51ddaemon-set-controller-token-qb22n kubernetes.io/service-account-token 3 51ddefault-token-xjfpp kubernetes.io/service-account-token 3 51d...
- 次要蕴含的3类信息 都是以加密形式显示 1. namespace、2. ca.crt、3. token
[root@k8s-master ~]# kubectl describe secret default-token-xjfpp -n kube-system #查看secret 详细信息Name: default-token-xjfppNamespace: kube-system Labels: <none>Annotations: kubernetes.io/service-account.name: default kubernetes.io/service-account.uid: a7cfad17-e87a-42dd-8f34-46181dd43b05Type: kubernetes.io/service-account-tokenData ====ca.crt: 1066 bytesnamespace: 11 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6Ijh4bkpFMkMxV0FtZmxPTmxsV3ZhY3lIRnZiRjlaUnhFSXdHSnRGc21adUUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZWZhdWx0LXRva2VuLXhqZnBwIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJhN2NmYWQxNy1lODdhLTQyZGQtOGYzNC00NjE4MWRkNDNiMDUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06ZGVmYXVsdCJ9.ifUAhcEjhmSszILrjPkbmKAKuo6nDBPrmQTjz6HjBXw85eTsu-D5CCjGwSaVj7X6xqK3GTwcv-r8518pSv92rfbN5cc9FdpknJGjtuigCrksap1gHcqZvco3BM7KFEaTFpCaxiVvzp6YBh4pVmm4zAJGieE8964m3SwZqXUmf3VP3LyVDrYnlISQXoXy5oEXODe8694H1vwU3wuRmkwLOCV5QthTxFpx5siM7_KFkcBuG-pt0lTbf6d15OXk-WY6J3qkdbmLrJFaofAo-1tas6Fp7ziQnIAkG_lTrbXPHD-rHJf9v1PobVIVvlEe5hKc_V1tE36SEwpIYHb61DfWRw
- Pod 默认的挂载门路 /var/run/secrets/kubernetes.io/serviceaccount
[root@k8s-master authfiles]# kubectl exec -it demodb-0 -- /bin/sh/demodb/data # cd /var/run/secrets/kubernetes.io/serviceaccount/run/secrets/kubernetes.io/serviceaccount # lsca.crt namespace token/run/secrets/kubernetes.io/serviceaccount # cat namespace /run/secrets/kubernetes.io/serviceaccount # cat ca.crt -----BEGIN CERTIFICATE-----MIIC5zCCAc+gAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJlcm5ldGVzMB4XDTIxMDYyODE3NDIxMFoXDTMxMDYyNjE3NDIxMFowFTETMBEGA1UEAxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwQmCJJ0GuIDdzZa8XAJIy7BRUGBT0oI0lVuWc3PD25whr1MBRyUru0u0n7mKVQTzbY0G8USHzwSnX51OoMpU5YwHK6WGLgJ6gdCfjAY6v12e7y+rvjOKYns6ljUf2MnaILnrCy1/u56Lnh1wCH1XkLECP539MFamYkRGxeS9FZlFcgLvJp43VX9V4IWQeumHd91abKVei/41qbbvyDU7l4l7klUmLUTGDlYpf1GPU/Jaom4QLRaEt2csYcNZ8J3yaYGvOloGM150Rsx4vL8DWOqZcUUg/uXujKg1MfWRrD9KvqK1QdP92IE+l6nXUKY34rvoDCmOcL8J0nPyjbyf0CAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOwi2wrUbuvVmbiV2rnnLtz0hsgcMA0GCSqGSIb3DQEBCwUAA4IBAQBCFkEU4gyouDs4hG0pjdlrJRkDw1kKg1JV8m3CqcKUKmJBUT9H9R8LaU2s/6yS5zX3VSdUNgF1V/hpjUJ6bSud9Xfnmbw8lHKUucUSIWU9a+TGTvknDqI8FcC8gKstUAwagxdRwj3KEy7HSAcbMXjKFSdAlQ2Qq7CG8vLXilurHhEEbrzqunbuVjJ80gIWeeo23HkAbjOiTiSokN2AoGyGW9eS3bMLSJgMHzLtX80uWwS75jc32mMrYe59nzGIR2yY2zxkmmj6DOLoMQKyJlqPC2fGKyAv0N79QKAGl7JjbXzYvaV2egWtCk0FHnfah9Fu+/P8pNtY8agSluneeHkL-----END CERTIFICATE-----/run/secrets/kubernetes.io/serviceaccount #