初始化流程:
- kubelet启动
- 发现本地没有kubeconfig文件
- 寻找bootstrap-kubeconfig文件
- 读取bootstrap-kubeconfig中的apiserver地址和bootstrap token,bootstrap的格式参考 https://kubernetes.io/docs/reference/access-authn-authz/bootstrap-tokens/
- 使用bootstrap token作为凭证访问apiserver
- 该token有权限去创建和获取证书签名请求(CSR) —— bootstrap token的命名具有特定的格式,可以被apiserver识别,username为system:bootstrap:
,属于system:bootstrappers用户组,该用户组需要绑定system:node-bootstrapper的clusterrole,以便可以拥有创建csr的权限 - kubelet为自己创建一个CSR,签发者(csr.Spec.SignerName)为kubernetes.io/kube-apiserver-client-kubelet
- CSR被自动或者手动approved
- controller-manager自动approve,需要system:bootstrappers用户组绑定system:certificates.k8s.io:certificatesigningrequests:nodeclient的clusterrole。controller-manager的CSRApprovingController会通过SubjectAccessReview API的方式来校验csr中的username和group是否有对应权限,同时检查签发者是否为kubernetes.io/kube-apiserver-client-kubelet
- 通过kubectl等手动approve
- kubelet证书在approved之后由controller-manager创建
- controller-manager将证书更新到csr的status字段中
- kubelet从apiserver获取CSR的证书
- kubelet根据取回来的key和证书生成对应的kubeconfig
- kubelet使用生成的kubeconfig开始正常工作
- 如果配置了证书自动续期,则kubelet会在证书快过期的时候利用旧的kubeconfig来续约旧的证书
- 续约的证书被自动或者手动approved签发 —— 自动approve需要system:nodes用户组绑定system:certificates.k8s.io:certificatesigningrequests:selfnodeclient的clusterrole(system:nodes是kubelet之前申请的证书的group,即证书的组织O为system:nodes)
涉及的用户,用户组,权限
- bootstrap token的username为system:bootstrap:
- system:bootstrappers用户组,bootstrap token都属于该用户组
- clusterrole system:node-bootstrapper,拥有创建和获取CSR的权限,system:bootstrappers用户组一般需要绑定该role
- clusterrole system:certificates.k8s.io:certificatesigningrequests:nodeclient,属于该group的user申请的CSR可以被controller-manager自动approve,system:bootstrappers用户组一般需要绑定该role
- system:nodes用户组,kubelet从apiserver获取的证书一般都属于该用户组,即证书的组织O为system:nodes
- clusterrole system:certificates.k8s.io:certificatesigningrequests:selfnodeclient,属于该group的user在证书续期时可以被controller-manager自动approve,system:nodes用户组一般需要绑定该role
前置依赖:
- kube-apiserver需要指定client CA: —client-ca-file,客户端使用证书鉴权时,apiserver根据这个CA来校验客户端证书的合法性
- kube-apiserver使用static token或者bootstrap token:
- 使用static token需要指定—token-auth-file文件
- 使用bootstrap token需要开启对应功能: —enable-bootstrap-token-auth=true
- kube-controller-manager需要指定和kube-apiserver相同的—client-ca-file,同时需要指定—cluster-signing-cert-file和—cluster-signing-key-file用户签发kubelet证书
- kube-controller-manager自动approve需要为system:bootstrappers用户组和system:nodes用户组绑定对应的角色:system:certificates.k8s.io:certificatesigningrequests:nodeclient,system:certificates.k8s.io:certificatesigningrequests:selfnodeclient,同时csr的签发者为kubernetes.io/kube-apiserver-client-kubelet
- kubelet需要指定—bootstrap-kubeconfig