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