kubeadm: явно установить токен для узлов, с которыми нужно объединяться

#kubernetes #kubeadm

#kubernetes #kubeadm

Вопрос:

Я настроил свои главные узлы с помощью kubeadm .

Теперь я хочу запустить join команду на своих узлах, чтобы более поздние присоединились к кластеру.

Все, что мне нужно сделать, это запустить

 kubeadm join --token <token> --discovery-token-ca-cert-hash <sha256>
  

где <token> и — значения, ранее возвращенные приведенной ниже командой:

 kubeadm init 
  

Я также пытаюсь написать сценарий вышеупомянутого процесса, и я вижу, что синтаксический анализ фактических токенов из последней команды довольно сложен;

Итак, я размышлял, есть ли способ явно указать <token> и <sha256> во время инициализации кластера, чтобы избежать необходимости выполнять хакерский синтаксический анализ init команды.

Ответ №1:

Я также пытался создать скрипт для этого.

Чтобы получить необходимые значения, я использую эти команды:

 TOKEN=$(sshpass -p $PASSWORD ssh  -o StrictHostKeyChecking=no root@$MASTER_IP sudo kubeadm token list | tail -1 | cut -f 1 -d " ") 


HASH=$(sshpass -p $PASSWORD ssh  -o StrictHostKeyChecking=no  root@$MASTER_IP  openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' )
  

В основном я использую эти команды для ssh на master и получаю эти значения.

Я не нашел более простого способа добиться этого.

Ответ №2:

На самом деле, кажется, есть способ обойти это:

(Я включаю это в ansible задачи, потому что именно здесь я планирую его использовать)

   - name: kubernetes.yml --> Initiate kubernetes cluster
      shell: 'kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address={{ ansible_facts[if_name]["ipv4"]["address"] }}'
      become: yes
      when: inventory_hostname in groups['masters']


    - name: kubernetes.yml --> Get the join command
      shell: kubeadm token create --print-join-command
      register: rv_join_command
      when: inventory_hostname in (groups['masters'] | last)
      become: yes

    - name: kubernetes.yml --> Print the join command
      debug:
        var: rv_join_command.stdout
  

Вывод:

 TASK [kubernetes.yml --> Print the join command] *******************************
ok: [kubernetes-master-1] => 
  rv_join_command.stdout: 'kubeadm join 192.168.30.1:6443 --token ah0dbr.grxg9fke3c28dif3i     --discovery-token-ca-cert-hash sha256:716712ca7f07bfb4aa7df9a8b30ik3t0k3t2259b8c6fc7b68f50334356078 '