Kubeadm: nenhuma maneira programática de obter o token de descoberta ca hash

Criado em 12 jan. 2018  ·  11Comentários  ·  Fonte: kubernetes/kubeadm

se você está criando um token, por meio de criação de token kubeadm .. ou qualquer outro mecanismo, não há nenhuma maneira de obter o hash de certificado ca token fora de tentar analisar a saída legível por humanos (e, portanto, não estável) de init kubeadm. Deve haver uma maneira legível por máquina de criar tokens com ca hashes, caso contrário, será forçado a usar --discovery-token-unsafe-skip-ca-verification mesmo se houver desejo de fazer a coisa certa (tm). Atm, as alternativas são analisar a provável saída de leitura humana alterada de kubeadm init ou reimplementar o cálculo de hash de kubeadm no ca. o último não seria tão ruim se não exigisse a leitura do código-fonte, pois não é tão simples, como, por exemplo, nenhuma das saídas de cd / etc / kubernetes / pki && sha256sum * mostra o mesmo sha que a saída do kubeadm init.

kinfeature prioritbacklog

Comentários muito úteis

Você experimentou a versão recente do kubeadm?

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

Todos 11 comentários

Você experimentou a versão recente do kubeadm?

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

ainda não é ótimo - qualquer pessoa que tentar fazer isso de forma programática terá que analisar o comando para extrair o token e o hash do token de descoberta. Seria melhor se pudéssemos especificar um formulário de saída como json para que possamos analisá-lo com segurança

obrigado, eu não percebi que havia um comando novo / separado para isso. Eu concordo, seria melhor ter isso em JSON. meu fluxo de trabalho anterior para 1.6 e 1.7 era kubeadm token generate e, em seguida, reutilizava esse valor ao iniciar e juntar, o kubeadm token generate era delimitado por linha de valor único legível por máquina, mas agora é efetivamente um comando morto, já que falta o hash cert (e não extensível per se devido a esse formato). Re por que legível por máquina, eu tenho parâmetros adicionais para passar para o join e alguns que preciso substituir, como dns para o ip.

Sim, eu tive que despejar o comando join em um arquivo e então usar o sed para adicionar um sinalizador ignore-preflight-errors, não horrível, mas também não particularmente amigável.

Portanto, há um esforço contínuo para aparar as fases para torná-lo mais programático e desduplicar os sinalizadores. Essa é apenas uma história de usuário. @fabriziopandini , você tem um problema com os pais para isso em algum lugar?

@timothysc
O problema para as fases de graduação é o nº 454, mas está meio desatualizado e pode fazer sentido começar com um novo assim que o próximo KEP for aprovado.

No entanto, com relação a este problema, IMO, devemos abrir um problema guarda-chuva dedicado para lidar com a demanda por saída legível por máquina de uma forma consistente em todos os comandos, porque a solicitação se estende de kubeadm init/phases a kubeadm token e também kubeadm upgrade (consulte # 494).

WDYT? se estiver bom para você, abrirei a nova edição do guarda-chuva ...

Acabei de resolver esse problema sozinho. Consegui calcular o sha256sum da chave pública do ca cert usando o seguinte:

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

Feio...

Eu uso as expressões regulares. Eu testei com o 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

Resultado:

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"
}

Fechando, pois há várias soluções alternativas.

Isso não é recomendado, mas em https://github.com/cablespaghetti/kubeadm-aws/blob/master/worker.sh#L45 --discovery-token-unsafe-skip-ca-verification também funciona

no Azure, usando marcas para recursos de trabalho e mestre:
rg é uma variável com o nome RG

masterPrivateIp = $ (lista nic de rede az -g $ rg --query "[? tags.module == 'k8smasters']. ipConfigurations [0] .privateIpAddress" -o tsv)
tokenId = $ (ssh $ masterIp "lista de tokens 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"

para ip em $ (lista de ip público de rede az -g $ rg --query [? tags.module == 'k8sworkers']. ipAddress -o tsv)
Faz
ssh $ ip $ joinCommand
feito

Esta página foi útil?
0 / 5 - 0 avaliações