【问题标题】:How to generate kubeadm token for secondary control plane node(s)如何为辅助控制平面节点生成 kubeadm 令牌
【发布时间】:2021-01-04 05:49:35
【问题描述】:

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

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

kubeadm token create --print-join-command

我想知道是否要添加新的平面节点(辅助主节点)如何创建相关令牌?

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

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

但它(当然)失败了,因为这个标志不被识别。

我还通过文档发现我们可以通过直接链接到配置文件来做到这一点,例如参考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 链接。

有没有其他方法可以使用平面节点而不是工作节点的命令来创建新令牌?

【问题讨论】:

    标签: kubernetes token kubectl


    【解决方案1】:

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

    来自docs

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

    【讨论】:

    • 我没有得到两个输出我只得到一个。 :( 是不是可能配置有问题?
    • 错误执行阶段预检:无法验证 API 服务器的身份:在集群信息 ConfigMap 中找不到令牌 ID“khs2bu”的 JWS 签名
    【解决方案2】:

    我相信添加更多控制平面没有单独的令牌,您只需在添加时添加--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 join nodeMaster:6443 --token xxxx --discovery-token-ca-cert-hash sha256:xxxx --control-plane --certificate-key xxxx 我的问题是如何生成这些令牌(ca-cert-hash / certificate-key)?我可以在我的主节点 (/etc/kubernetes/pki) 上找到该目录,但与生成的素数相比,密钥是巨大的。
    • 您可以使用kubeadm token create --print-join-command获取它
    • 不幸的是没有:(。它只为我返回这个:(kubeadm join loadBalancerIP:6443 --token 05odrq.712o9lv89kd4jg8x --discovery-token-ca-cert-hash sha256:xxxx我有什么遗漏的吗?
    • 我正在使用自签名证书,我还没有推送我的证书(但这应该没关系)。
    • 以上输出可以,你可以添加--control-plane加入更多大师
    【解决方案3】:

    根据用户的 cmets 看来,当有人运行此命令时:

    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 初始化标志 --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
    

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

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

    【讨论】:

    • 嘿,kubeadm alpha certs certificate-key 的输出与--discovery-token-ca-cert-hash sha256:xxxx 中 SHA256 后的预期值相同?如果没有,您知道如何获取进入 xxxx 的值吗?
    • 您可以使用$ kubeadm token create --print-join-command 获得完全加入,结果类似于:kubeadm join loadbalancer_host_name:port_that_is_listening --token <token string> --discovery-token-ca-cert-hash sha256:xxxx。如果你只想要 sha256:xxxx 一个使用 bash 的小命令 $ openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -pubkey | openssl rsa -pubin -outform DER 2>/dev/null | sha256sum | cut -d' ' -f1 它将导致 xxxx。请记住,这些命令需要在其中一个主节点上执行。
    • 是的,谢谢,选择了第二个选项,效果很好。
    【解决方案4】:

    你需要在master上运行

    kubeadm init phase upload-certs --upload-certs
    

    记住输出。

    那你需要在master上运行

    kubeadm token create --print-join-command
    

    然后从此输出中为 joining-master-node 编写加入命令并将其添加到 --control-plane --certificate-key xxxx

    观看此视频以举例说明: https://www.youtube.com/watch?v=27v36t-3afQ 最有趣的是从 20:40 开始。 由于版本较旧,视频中有一些“实验性”字样。

    【讨论】:

    • 非常有趣。当我更新集群中的 CA 时,我可能会使用这种方法。感谢分享。
    【解决方案5】:

    我想你想要下面的命令。

    显示命令:

    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
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • “显示命令”没有意义。您的意思是“运行命令”吗?展示就是展示。
    猜你喜欢
    • 1970-01-01
    • 2013-11-12
    • 2020-07-21
    • 2014-07-18
    • 1970-01-01
    • 2015-01-14
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多