如何加节点到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 参数会直接输出用于加入集群的完整命令,包括 tokendiscovery-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 文件

使用 kubectlkubeadm 生成适用于新节点的 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 机制,自动获取证书,适合自动化程度较高的环境。

在实际应用中,选择适合自己环境和需求的节点加入方式,能够提高集群的安全性和管理效率。