【问题标题】:Join cluster after init token expired?初始化令牌过期后加入集群?
【发布时间】:2018-04-18 00:23:01
【问题描述】:

几天前我创建了一个包含 1 个主节点和 1 个工作节点的 Kubernetes 集群。现在想再给集群添加一个节点,但是master上原来“kubeadm init”打印的token已经过期(默认24小时后)。

“kubeadm join”命令有一个“--discovery-file”。它需要一个配置文件,我尝试过使用我在这里找到的格式:

https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.8.md

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: <really long certificate data>
    server: https://10.138.0.2:6443
  name: ""
contexts: []
current-context: ""
kind: Config
preferences: {}
users: []

我从我的工作 kubectl 配置文件中复制了相应的数据并创建了一个本地文件“a.config”。

但是,当我尝试命令“sudo kubeadm join --discovery-file a.conf”时,它会失败并显示以下错误消息:

[discovery: Invalid value: "": token [""] was not of form ["^([a-z0-9]{6})\\.([a-z0-9]{16})$"], discovery: Invalid value: "": token must be of form '[a-z0-9]{6}.[a-z0-9]{16}']

我在这里错过了什么?

在我的情况下知道什么程序可以工作?我不希望拆除集群并重新加入。

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    创建一个新的引导令牌并加入

    使用kubeadm token create 创建新的引导令牌,请参阅kubeadm: Managing Tokens

    # login to master node
    # create a new bootstrap token
    $ kubeadm token create
    abcdef.1234567890abcdef
    
    # get root ca cert fingerprint
    $ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
    e18105ef24bacebb23d694dad491e8ef1c2ea9ade944e784b1f03a15a0d5ecea 
    
    # login to the new worker node
    # join to cluster 
    $ kubeadm join --token abcdef.1234567890abcdef --discovery-token-ca-cert-hash sha256:e18105ef24bacebb23d694dad491e8ef1c2ea9ade944e784b1f03a15a0d5ecea 1.2.3.4:6443
    

    注意:--discovery-token-ca-cert-hash 在 Kubernetes 1.8 及更高版本中是首选。

    (备选)使用发现文件建立信任

    --discovery-file 提供了一种带外方式来建立 主节点和引导节点之间的信任。

    如果您正在构建自动配置,请考虑使用此模式 使用 kubeadm。

    发现文件没有提供有效的令牌,所以我们仍然需要kubeadm token create 来创建一个新的。

    kubeadm join --token abcdef.1234567890abcdef --discovery-file a.conf
    

    【讨论】:

    • 我在这里记录了这个过程:github.com/olavt/KubernetesRaspberryPI
    • 请用生成的引导令牌说 what to do 来扩展答案,尤其是与 OP 要求的 --discovery-file 一起使用时。跨度>
    【解决方案2】:

    感谢@silverfox 的回答,但是手动输入这些命令还是有点痛苦,所以我构建了以下命令来帮助我快速完成。

    此命令将创建一个令牌并生成加入命令:

    echo sudo kubeadm join $(kubeadm config view | grep ^controlPlaneEndpoint | awk '{print $2}') --token $(kubeadm token create) --discovery-token-ca-cert-hash sha256:$(openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //')
    

    【讨论】:

      【解决方案3】:

      我知道将新节点加入现有集群的最简单方法是

      kubeadm token create --print-join-command
      

      这将给出这样的输出。

      kubeadm join 192.168.10.15:6443 --token l946pz.6fv0XXXXX8zry --discovery-token-ca-cert-hash sha256:e1e6XXXXXXXXXXXX9ff2aa46bf003419e8b508686af8597XXXXXXXXXXXXXXXXXXX
      

      【讨论】:

      • 这个方法有效,我得到了添加工作节点的join命令
      【解决方案4】:

      正如上面Mansur's answer 中所建议的那样,能够运行以下命令来设置集群。

      # command ran from master node:
      kubeadm token create --print-join-command
      
      # sample output
      kubeadm join <IP_OF_MASTER_NODE>:6443 --token iic9jq.<redacted> --discovery-token-ca-cert-hash <redacted>
      

      使用 sudo- 在另一个节点中运行上面的输出

      sudo kubeadm join <IP_OF_MASTER_NODE>:6443 --token iic9jq.<redacted> --discovery-token-ca-cert-hash <redacted>
      

      当我在没有sudo 的情况下运行上述命令时,出现错误-

      [preflight] Running pre-flight checks
      error execution phase preflight: [preflight] Some fatal errors occurred:
              [ERROR IsPrivilegedUser]: user is not running as root
      [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
      

      当我使用 sudo 运行时,收到了这条成功消息:

      
      This node has joined the cluster:
      * Certificate signing request was sent to apiserver and a response was received.
      * The Kubelet was informed of the new secure connection details.
      
      Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
      

      从主节点跑kubectl get nodes,看到新节点已经加入集群了。

      在运行上述命令之前,集群状态如下-

      # ran on master node
      $ kubectl get nodes
      NAME            STATUS     ROLES    AGE   VERSION
      ip-[REDACTED]   NotReady   master   20m   v1.14.5
      

      运行上述命令后,集群状态如下:

      # ran on master node
      kubectl get nodes
      NAME            STATUS     ROLES    AGE   VERSION
      ip-[REDACTED]   NotReady   master   20m   v1.14.5
      ip-[REDACTED]   NotReady   <none>   14s   v1.14.5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-19
        • 1970-01-01
        • 2017-02-21
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多