方法一:基于 Bootstrap Token 的加入方式
原理
- Bootstrap Token 是一种临时的令牌,用于新节点在加入集群时进行身份验证。
- 新节点使用
kubeadm join命令,提供--token和--discovery-token-ca-cert-hash参数,与控制平面 API 服务器建立安全连接。 - 控制平面验证 token 的有效性,并向新节点提供所需的证书和配置文件,使其能够加入集群。
具体步骤
1. 在控制平面节点上生成 Bootstrap Token
使用以下命令生成新的引导令牌:
kubeadm token create --print-join-command
输出示例:
kubeadm join 10.0.24.14:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:430cb53669a7fde6e44338968458d47f3fcdbeda4d73bda7435df34ed20ad5be
--print-join-command参数会直接输出用于加入集群的完整命令,包括token和discovery-token-ca-cert-hash。
2. 在新节点上执行加入命令
在新节点上,以 root 或具有相应权限的用户身份执行上述输出的命令:
kubeadm join 10.0.24.14:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:430cb53669a7fde6e44338968458d47f3fcdbeda4d73bda7435df34ed20ad5be
3. 加入过程解析
- 身份验证:新节点使用
token与控制平面 API 服务器进行身份验证。 - 证书验证:使用
--discovery-token-ca-cert-hash提供的哈希值,确保连接的 API 服务器是可信的。 - 获取配置:验证通过后,新节点从控制平面获取
kubelet所需的配置文件和证书。 - 节点注册:
kubelet启动并与控制平面通信,节点被注册到集群中。
注意事项
- Token 有效期:默认情况下,token 有效期为 24 小时。可以使用
--ttl参数调整有效期。 - Token 管理:使用
kubeadm token list查看现有 token,kubeadm token delete <token-id>删除 token。
方法二:使用 静态 Kubeconfig 文件 的方式(这种是最常规的, 最正确的)
原理
- 预先在控制平面节点上为新节点生成
kubeconfig文件,包含必要的证书和配置信息。 - 将
kubeconfig文件安全地传输到新节点。 - 新节点的
kubelet使用该kubeconfig文件与控制平面通信,完成加入过程。
具体步骤
1. 在控制平面节点上生成 kubeconfig 文件
使用 kubectl 或 kubeadm 生成适用于新节点的 kubeconfig 文件。例如:
kubeadm kubeconfig user --client-name=<node-name> --config=/path/to/cluster/config.yaml > /etc/kubernetes/<node-name>-kubeconfig
或者手动创建 kubeconfig 文件:
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://10.0.24.14:6443 \
--kubeconfig=/etc/kubernetes/<node-name>-kubeconfig
kubectl config set-credentials system:node:<node-name> \
--client-certificate=/etc/kubernetes/pki/nodes/<node-name>.crt \
--client-key=/etc/kubernetes/pki/nodes/<node-name>.key \
--embed-certs=true \
--kubeconfig=/etc/kubernetes/<node-name>-kubeconfig
kubectl config set-context default \
--cluster=kubernetes \
--user=system:node:<node-name> \
--kubeconfig=/etc/kubernetes/<node-name>-kubeconfig
kubectl config use-context default --kubeconfig=/etc/kubernetes/<node-name>-kubeconfig
2. 传输 kubeconfig 文件到新节点
将生成的 /etc/kubernetes/<node-name>-kubeconfig 文件通过安全方式复制到新节点的 /etc/kubernetes/kubelet.conf。
3. 在新节点上启动 kubelet
确保 kubelet 已安装并配置为使用 /etc/kubernetes/kubelet.conf:
systemctl restart kubelet
4. 节点注册
kubelet 启动后,会使用提供的 kubeconfig 与控制平面通信,节点被注册到集群中。
注意事项
- 证书管理:需要为每个节点生成唯一的客户端证书,通常由集群的 CA 签名。
- 安全性:必须安全地传输
kubeconfig文件和证书,防止泄露。
方法三:基于 TLS Bootstrapping 的方式
原理
- 新节点的
kubelet使用临时的引导身份(通常是bootstrap.kubeconfig)向控制平面发起 CSR(证书签名请求)。 - API 服务器根据配置(通常是自动批准 CSR)为新节点签发客户端证书。
kubelet获取证书后,使用正式身份与控制平面通信,完成节点加入。
具体步骤
1. 在控制平面节点上创建引导 Token
生成一个用于 TLS 引导的 token:
kubeadm token create --usage "authentication,signing" --groups "system:bootstrappers:node-bootstrapper"
2. 为引导 Token 绑定适当的 RBAC 规则
确保引导 token 具有请求 CSR 的权限:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubeadm:kubelet-bootstrap
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:node-bootstrapper
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:bootstrappers
应用上述配置:
kubectl apply -f rbac.yaml
3. 在新节点上配置 kubelet
创建 bootstrap.kubeconfig 文件,内容包含引导 token:
kubeadm kubeconfig user --client-name=system:bootstrap:<token-id> --config=/path/to/cluster/config.yaml > /etc/kubernetes/bootstrap-kubelet.conf
或者手动创建:
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://10.0.24.14:6443 \
--kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
kubectl config set-credentials kubelet-bootstrap \
--token=<bootstrap-token> \
--kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
kubectl config use-context default --kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
4. 启动 kubelet
配置 kubelet 使用 bootstrap-kubelet.conf:
systemctl restart kubelet
5. 自动批准 CSR
配置控制平面自动批准节点的 CSR:
kubectl create clusterrolebinding node-client-auto-approve \
--clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient \
--group=system:bootstrappers
kubectl create clusterrolebinding node-server-auto-approve \
--clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient \
--group=system:nodes
6. 节点加入集群
kubelet 启动后,会自动发起 CSR,控制平面批准后,kubelet 获取正式证书并加入集群。
注意事项
- 一句话总结: Kubernetes 提供了 TLS Bootstrapping 机制,通过使用
certificates.k8s.ioAPI 和 bootstrap token 自动生成 Kubelet 所需的证书,简化了工作节点的证书管理流程,实现了节点与kube-apiserver的安全通信,并在生成正式证书后删除初始的 kubeconfig 文件,避免 bootstrap token 泄露。 - 安全性:自动批准 CSR 存在安全风险,需要确保引导 token 的安全性。
- Token 有效期:引导 token 应设置合理的有效期,防止长期暴露。
总结
- 基于 Bootstrap Token 的方式:最常用,使用
kubeadm join和 token,适合大多数场景。 - 使用静态 Kubeconfig 文件:预先生成配置文件,适合需要**手动管理证书**的场景。
- 基于 TLS Bootstrapping 的方式:使用
kubelet的 CSR 机制,自动获取证书,适合自动化程度较高的环境。
在实际应用中,选择适合自己环境和需求的节点加入方式,能够提高集群的安全性和管理效率。