初始化流程:

  1. kubelet启动
  2. 发现本地没有kubeconfig文件
  3. 寻找bootstrap-kubeconfig文件
  4. 读取bootstrap-kubeconfig中的apiserver地址和bootstrap token,bootstrap的格式参考 https://kubernetes.io/docs/reference/access-authn-authz/bootstrap-tokens/
  5. 使用bootstrap token作为凭证访问apiserver
  6. 该token有权限去创建和获取证书签名请求(CSR) —— bootstrap token的命名具有特定的格式,可以被apiserver识别,username为system:bootstrap:,属于system:bootstrappers用户组,该用户组需要绑定system:node-bootstrapper的clusterrole,以便可以拥有创建csr的权限
  7. kubelet为自己创建一个CSR,签发者(csr.Spec.SignerName)为kubernetes.io/kube-apiserver-client-kubelet
  8. CSR被自动或者手动approved
    1. 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
    2. 通过kubectl等手动approve
  9. kubelet证书在approved之后由controller-manager创建
  10. controller-manager将证书更新到csr的status字段中
  11. kubelet从apiserver获取CSR的证书
  12. kubelet根据取回来的key和证书生成对应的kubeconfig
  13. kubelet使用生成的kubeconfig开始正常工作
  14. 如果配置了证书自动续期,则kubelet会在证书快过期的时候利用旧的kubeconfig来续约旧的证书
  15. 续约的证书被自动或者手动approved签发 —— 自动approve需要system:nodes用户组绑定system:certificates.k8s.io:certificatesigningrequests:selfnodeclient的clusterrole(system:nodes是kubelet之前申请的证书的group,即证书的组织O为system:nodes)

涉及的用户,用户组,权限

  1. bootstrap token的username为system:bootstrap:
  2. system:bootstrappers用户组,bootstrap token都属于该用户组
  3. clusterrole system:node-bootstrapper,拥有创建和获取CSR的权限,system:bootstrappers用户组一般需要绑定该role
  4. clusterrole system:certificates.k8s.io:certificatesigningrequests:nodeclient,属于该group的user申请的CSR可以被controller-manager自动approve,system:bootstrappers用户组一般需要绑定该role
  5. system:nodes用户组,kubelet从apiserver获取的证书一般都属于该用户组,即证书的组织O为system:nodes
  6. clusterrole system:certificates.k8s.io:certificatesigningrequests:selfnodeclient,属于该group的user在证书续期时可以被controller-manager自动approve,system:nodes用户组一般需要绑定该role

前置依赖:

  1. kube-apiserver需要指定client CA: —client-ca-file,客户端使用证书鉴权时,apiserver根据这个CA来校验客户端证书的合法性
  2. kube-apiserver使用static token或者bootstrap token:
    1. 使用static token需要指定—token-auth-file文件
    2. 使用bootstrap token需要开启对应功能: —enable-bootstrap-token-auth=true
  3. kube-controller-manager需要指定和kube-apiserver相同的—client-ca-file,同时需要指定—cluster-signing-cert-file和—cluster-signing-key-file用户签发kubelet证书
  4. 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
  5. kubelet需要指定—bootstrap-kubeconfig