Kubeadm: нет программного способа получить хэш CA токена открытия

Созданный на 12 янв. 2018  ·  11Комментарии  ·  Источник: kubernetes/kubeadm

если вы создаете токен с помощью kubeadm token create .. или любого другого механизма, нет никакого способа получить хэш сертификата токена CA, кроме попытки проанализировать читаемый человеком вывод (и, следовательно, нестабильный) kubeadm init. Должен существовать машиночитаемый способ создания токенов с хешами ca, иначе нужно будет использовать --discovery-token-unsafe-skip-ca-verify, даже если есть желание поступить правильно (tm). Альтернативой является либо синтаксический анализ выходных данных kubeadm init, которые могут быть изменены человеком, либо повторная реализация вычисления хэша kubeadm через ca. последнее было бы не так уж плохо, если бы для этого не требовалось читать исходный код, поскольку это непросто, например, ни один из выходных данных cd / etc / kubernetes / pki && sha256sum * не показывает тот же sha, что и вывод kubeadm init.

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 hash (и сам по себе не расширяемый из-за этого формата). re, почему машинно-читаемый, у меня есть дополнительные параметры, которые нужно передать для соединения, и некоторые, которые мне нужно заменить, например, dns для ip.

Да, мне пришлось выгрузить команду соединения в файл, а затем использовать sed, чтобы добавить флаг ignore-preflight-errors, не ужасно, но и не особенно дружелюбно.

Таким образом, мы постоянно стараемся урезать фазы, чтобы сделать их более программными, и убрать флаги, это всего лишь одна пользовательская история. @fabriziopandini, у вас где-то есть проблема с родителями?

@timothysc
Проблема для выпускных этапов - № 454, но она немного устарела и, возможно, имеет смысл начать с новой, как только будет одобрен предстоящий KEP.

Однако, что касается этой проблемы, ИМО, мы должны открыть специальную проблему зонтика, чтобы удовлетворить спрос на машиночитаемый вывод согласованным образом для всех команд, потому что запрос охватывает от kubeadm init/phases до kubeadm token а также kubeadm upgrade (см. # 494).

WDYT? если вас не устраивает, я открою новый номер с зонтиком ...

Я сам столкнулся с этой проблемой. Я смог вычислить sha256sum открытого ключа сертификата CA, используя следующее:

$ 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 ТОКЕН | 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"

для ip в $ (az network public-ip list -g $ rg --query [? tags.module == 'k8sworkers']. ipAddress -o tsv)
делать
ssh $ ip $ joinCommand
сделано

Была ли эта страница полезной?
0 / 5 - 0 рейтинги