如何为辅助控制平面节点生成 kubeadm 令牌

How to generate kubeadm token for secondary control plane node(s)

当我们启动主主节点时,该节点使用 ttl 为工作节点和主节点创建令牌。

根据文档kubeadm token(我也测试过并且有效)我们可以发出命令并获取新令牌(默认 ttl 24h):

kubeadm token create --print-join-command

我在想如果要添加一个新的平面节点(secondary master)如何创建相关的token?

我尝试传递一些标志,例如:

kubeadm token create --print-join-command --control-plane

但它失败了(当然),因为无法识别此标志。

我还通过文档发现我们可以通过直接 link 到配置文件来做到这一点,例如参考 kubeadm-join/file or https based discovery:

kubeadm join --discovery-file path/to/file.conf # (local file)
kubeadm join --discovery-file https://url/file.conf # (remote HTTPS URL)

就我而言,我没有本地 conf 文件或计划使用 url link.

是否有任何其他方法可以使用命令为平面节点而不是工作节点创建新令牌?

命令kubeadm token create没有任何标志--control-plane

来自docs

当您 运行 命令 kubeadm token create --print-join-command 时,您会在输出中得到两个命令,并使用带有 --control-plane 标志的命令加入控制平面节点。

我相信没有用于添加更多控制平面的单独令牌,您只需在添加时添加 --control-plane

获取加入命令kubeadm token create --print-join-command

假设证书已经上传并设置到位。 更多详细信息可以在这里找到。 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/

编辑:抱歉延迟更新 kubeadm alpha certs certificate-key 可用于创建密钥

然后上传然后使用kubeadm init phase upload-certs --upload-certs --certificate-key=<above key>

并使用它来创建连接命令kubeadm token create --print-join-command --certificate-key <key created above>

您可以将 --control-plane 传递给上述加入命令以获得额外的控制平面,并忽略工作节点的此标志

根据用户的评论,似乎有人运行此命令时:

kubeadm token create --print-join-command

应填充两个字符串示例:

kubeadm join loadBalancerIP:6443 --token xxxx --discovery-token-ca-cert-hash sha256:xxxx
kubeadm join loadBalancerIP:6443 --token xxxx --discovery-token-ca-cert-hash sha256:xxxx --control-plane --certificate-key xxxx

不幸的是,就我而言,它没有。可能是因为我使用的是来自 kubeadm 的自签名证书,也可能是因为部署在裸机节点上。

尽管如此,我还是设法用不同的方式解决了我的问题。

根据官方文档Steps for the first control plane node:

"您还可以在初始化期间指定一个自定义的 --certificate-key ,稍后可以由 join 使用。要生成这样的密钥,您可以使用以下命令:"

kubeadm alpha certs certificate-key

一旦用户在缩进主主节点(尚未启动的节点)上运行命令,它应该会看到类似的内容:

# kubeadm alpha certs certificate-key
xxxx

然后如文档所述:

”注意:kubeadm init 标志 --config 和 --certificate-key 不能混合使用,因此如果你想使用 kubeadm 配置,你必须在适当的位置添加 certificateKey 字段配置位置(在 InitConfiguration 和 JoinConfiguration 下:controlPlane)。

在我的例子中,我使用了一个 conf 文件,所以我将内容添加到我的文件中:

apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
certificateKey: xxxx
localAPIEndpoint:
  advertiseAddress:
  bindPort: 6443
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
---
etc etc

一旦用户拥有此密钥并使用此密钥启动主要主节点(如上所示),下一步就是为辅助主节点使用完全相同的证书密钥,例如:

kubeadm join loadBalancerIP:6443 --token xxxx --discovery-token-ca-cert-hash sha256:xxxx --control-plane --certificate-key xxxx

注意:建议使用脚本生成此数据,以便在销毁/创建主节点时使用新的证书密钥。

希望这对未来的其他人有所帮助,以免像我一样花那么多钱。

您需要 运行 在 master

kubeadm init phase upload-certs --upload-certs

记住输出。

然后你需要运行 master

kubeadm token create --print-join-command

然后从这个输出中编写加入主节点的加入命令并添加到它--control-plane --certificate-key xxxx

请观看此视频并举例说明: https://www.youtube.com/watch?v=27v36t-3afQ 最有趣的来自 20:40。 由于版本较旧,视频中有 'experimental' 个单词。

我想你需要下面的命令。

显示命令:

echo "$(kubeadm token create --print-join-command) --control-plane"
kubeadm join 192.168.5.50:8443 --token b99yno.3ju18t22w80ishlz --discovery-token-ca-cert-hash sha256:8f16b6d5304f070de0d32a6663ffaa30ac58163f9cfd38be4af405ac78c93b73  --control-plane

运行命令:

echo "$(kubeadm token create --print-join-command) --control-plane"|sh

以下将为您的其他控制器创建加入命令。

echo $(kubeadm token create --print-join-command) --control-plane --certificate-key $(kubeadm init phase upload-certs --upload-certs | grep -vw -e certificate -e Namespace)'