kubelet初始化过程

当kubelet启动后,会执行如下操作:

  • 寻找kubelet.kubeconfig文件
  • 从kubelet.kubeconfig文件检索 API 服务器的 URL 和凭据,通常是 TLS 密钥和签名证书
  • 尝试使用凭据与 API 服务器通信

如果kube-apiserver 成功验证 kubelet 的凭据,会将 kubelet 视为有效节点,并开始为其分配 pod。

注:上述的前提是主机上已经存在kubelet.kubeconfig文件,并且证书已由 kube-apiserver 信任的证书颁发机构 (CA) 签名

以二进制安装k8s为例子,如果是第一次启动kubelet,初始化流程如下:

1、kubelet启动

2、kubelet发现找不到kubelet.kubeconfig文件

3、kubelet搜索并找到bootstrap.kubeconfig文件

4、读取bootstrap.kubeconfig文件,检索apiserver服务器的URL和token,如图:

5、kubelet 连接到 API 服务器,使用令牌进行身份验证

6、kube-apiserver接收到请求的用户名和token后 ,与自身启动时指定的token文件做比对(–token-auth-file=/opt/kubernetes/cfg/token.csv),通过查看用户kubelet-bootstrap是否被授权请求证书

在二进制安装章节,执行过一条授权命令,如下:

kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap

此命令是创建一个集群角色绑定文件kubelet-bootstrap,并将集群角色system:node-bootstrapper绑定到用户kubelet-bootstrap,此用户也具备了system:node-bootstrapper的权限

查看集群角色system:node-bootstrapper可以看到此角色具备证书申请等权限,如图:

7、kubelet 现在拥有有限的凭据来创建和检索证书签名请求 (CSR)

8、kubelet 为自己创建一个 CSR,并将 signerName 设置为kubernetes.io/kube-apiserver-client-kubelet,如图:

9、CSR 通过以下两种方式之一获得批准:

  • 如果配置了自动批准,那么kube-controller-manager会自动批准CSR
  • 如果没有配置,需要手动执行命令批准(kubectl certificate approve)

10、为 kubelet 创建证书,颁发给kubelet

11、kubelet 获得该证书,创建一个合适的 kubeconfig,其中包含密钥和已签名的证书

12、kubelet 开始正常操作

当成功签发证书后,目标节点的 kubelet 会将证书写入到 –cert-dir= 选项指定的目录中,如果不做其余设置,此目录下应该生成4个文件,如图:

  • kubelet.client:与apiserver通信使用使用的证书
  • kubelet.crt:kubelet服务端的自签CA证书,独立于apiserver CA之外,被用于kubelet server(10250)做鉴权使用,此证书删除后将会重新生成,随着kubelet的启动自动生成,与apiserver无关

批准CSR请求:

上述第9步,批准CSR请求分为手动批准和自动批准,自动批准需要通过RBAC授权方式完成,其中有两组不同权限:

  • nodeclient:主要用来第一次请求api-server申请证书
  • selfnodeclient:适用于已经在集群中的节点,但需要更新节点自身的客户端证书

1、首次启动kubelet,需要发起CSR请求,并接收新证书,需要创建一个clusterrolebinding ,将节点所属的组绑定到集群角色system:certificates.k8s.io:certificatesigningrequests:nodeclient(1.18版本后自带),命令如下:

kubectl create clusterrolebinding node-client-auto-approve-csr  --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient  --group=system:kubelet-bootstrap

执行完成后,当有新的kubelet启动后,将会自动批准加入集群,并颁发证书

2、要使 kubelet 能够更新其自己的客户端证书,需创建一个ClusterRoleBinding,将功能齐全的节点所属的组system:nodes绑定到ClusterRole名system:certificates.k8s.io:certificatesigningrequests:selfnodeclient,如下:

kubectl create clusterrolebinding auto-approve-renewals-for-nodes  --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient --group=system:nodes

kubelet.client证书的有效期为5年,可通过如下命令查看,如图:

kubelet.crt证书有效期为1年,如图:

标签