Kubeadm: 没有获得发现令牌 ca 哈希的编程方式

创建于 2018-01-12  ·  11评论  ·  资料来源: kubernetes/kubeadm

如果您通过 kubeadm token create .. 或任何其他机制创建令牌,则除了尝试解析 kubeadm init 的人类可读输出(因此不稳定)之外,无法获取令牌 ca 证书哈希。 应该有一种机器可读的方式来创建带有 ca 哈希的令牌,否则即使希望做正确的事情(tm),也必须使用 --discovery-token-unsafe-skip-ca-verification 。 Atm 的替代方案是解析可能被更改的 kubeadm init 的人工读取输出,或者在 ca 上重新实现 kubeadm 的哈希计算。 如果不需要读取源代码,后者也不会那么糟糕,因为它并不简单,即 cd /etc/kubernetes/pki && sha256sum * 的任何输出都不会显示与 kubeadm init 的输出相同的 sha。

kinfeature prioritbacklog

最有用的评论

您是否尝试过最新版本的 kubeadm ?

# kubeadm token create --print-join-command
kubeadm join --token 5d2dc8.3e93f8449167639b 10.0.2.66:6443 --discovery-token-ca-cert-hash sha256:44a68d4a2c2a86e05cc0d4ee8c9c6b64352c54e450021331c483561e45b34388

所有11条评论

您是否尝试过最新版本的 kubeadm ?

# kubeadm token create --print-join-command
kubeadm join --token 5d2dc8.3e93f8449167639b 10.0.2.66:6443 --discovery-token-ca-cert-hash sha256:44a68d4a2c2a86e05cc0d4ee8c9c6b64352c54e450021331c483561e45b34388

它仍然不是很好 - 任何试图以编程方式使用它的人都必须解析命令才能提取令牌和发现令牌哈希。 如果我们能指定一个像 json 这样的输出形式就更好了,这样我们就可以安全地解析它

谢谢,我没有意识到有一个单独的/新的命令。 我同意,在 json 中有这个会更好。 我之前的 1.6 和 1.7 工作流程是 kubeadm 令牌生成,然后在初始化和加入时重用该值,kubeadm 令牌生成是机器可读的单值行分隔,但它现在实际上是一个死命令,因为它缺少cert 哈希(并且由于该格式本身不可扩展)。 为什么机器可读,我有额外的参数要传递给加入,我需要替换一些参数,比如 ip 的 dns。

是的,我不得不将 join-command 转储到一个文件中,然后使用 sed 添加一个 ignore-preflight-errors 标志,这并不可怕但也不是特别友好。

因此,我们一直在努力修剪阶段以使其更具程序性并消除标记,这只是一个用户故事。 @fabriziopandini你在某个地方有这个问题吗?

@timothysc
毕业阶段的问题是 #454,但它有点过时了,一旦即将到来的 KEP 获得批准,就可以开始一个新的阶段。

但是,关于这个问题,IMO 我们应该打开一个专门的保护伞问题,以在所有命令中以一致的方式解决对机器可读输出的需求,因为请求范围从kubeadm init/phaseskubeadm token还有kubeadm upgrade (见#494)。

WDYT? 如果你没问题,我会打开新的雨伞问题......

我只是自己解决了这个问题。 我能够使用以下方法计算 ca 证书公钥的 sha256sum:

$ openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -pubkey | openssl rsa -pubin -outform DER 2>/dev/null | sha256sum | cut -d' ' -f1

不漂亮...

我使用正则表达式。 我用 Ansible 测试过。

- hosts: localhost
  tasks:
    - shell: kubeadm token create --print-join-command
      register: results
    - debug:
        var: results.stdout
    - set_fact:
        token: "{{ results.stdout | regex_search(regexp, '\\2') | first }}"
      vars:
        regexp: '([^\s]+\s){4}([^\s]+)'
    - debug:
        var: token
    - set_fact:
        hash: "{{ results.stdout | regex_search(regexp, '\\2') | first }}"
      vars:
        regexp: '([^\s]+\s){6}([^\s]+)'
    - debug:
        var: hash

结果:

TASK [debug] *******************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "results.stdout": "kubeadm join 192.168.1.2:6443 --token 3a0fje.octau87o6x30dz8i --discovery-token-ca-cert-hash sha256:1fd18093fb89b364879d5667b7ec84fd24171c30de0070deb6a3801b54a0f85c"
}

TASK [set_fact] ****************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] *******************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "token": "3a0fje.octau87o6x30dz8i"
}

TASK [set_fact] ****************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] *******************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "hash": "sha256:1fd18093fb89b364879d5667b7ec84fd24171c30de0070deb6a3801b54a0f85c"
}

关闭,因为有几种解决方法。

这不是推荐的,但是在https://github.com/cablespaghetti/kubeadm-aws/blob/master/worker.sh#L45 --discovery-token-unsafe-skip-ca-verification也可以使用

在 Azure 上,为工作器和主资源使用标签:
rg 是一个带有 RG 名称的变量

masterPrivateIp=$(az network nic list -g $rg --query "[?tags.module == 'k8smasters'].ipConfigurations[0].privateIpAddress" -o tsv)
tokenId=$(ssh $masterIp "kubeadm 令牌列表 | grep -v TOKEN | cut -d' ' -f1")
tokenSHA=$(ssh $masterIp "openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -pubkey | openssl rsa -pubin -outform DER 2>/dev/null | sha256sum | cut -d' ' -f1 ”)

joinCommand="kubeadm join $master PrivateIp:6443 --token $tokenId --discovery-token-ca-cert-hash sha256:$tokenSHA"

对于 $(az network public-ip list -g $rg --query [?tags.module == 'k8sworkers'].ipAddress -o tsv) 中的 ip

ssh $ip $join 命令
完毕

此页面是否有帮助?
0 / 5 - 0 等级