Kubeadm: kein programmatischer Weg, um Discovery-Token-Ca-Hash zu erhalten

Erstellt am 12. Jan. 2018  ·  11Kommentare  ·  Quelle: kubernetes/kubeadm

Wenn Sie ein Token über kubeadm token create .. oder einen anderen Mechanismus erstellen, gibt es keine Möglichkeit, den Hash des Token-CA-Zertifikats zu erhalten, außer zu versuchen, die menschenlesbare Ausgabe (und damit nicht stabil) von kubeadm init zu analysieren. Es sollte eine maschinenlesbare Möglichkeit geben, Token mit ca-Hashes zu erstellen, sonst ist man gezwungen --discovery-token-unsafe-skip-ca-verification zu verwenden, selbst wenn der Wunsch besteht, das Richtige zu tun (tm). Atm sind die Alternativen entweder das Parsen der wahrscheinlich geänderten menschlichen Leseausgabe von kubeadm init oder die Neuimplementierung der Hash-Berechnung von kubeadm über die ca. Letzteres wäre nicht so schlimm, wenn es nicht das Lesen des Quellcodes erfordern würde, da es nicht einfach ist, dh keine der Ausgaben von cd /etc/kubernetes/pki && sha256sum * zeigt das gleiche sha wie die Ausgabe von kubeadm init.

kinfeature prioritbacklog

Hilfreichster Kommentar

Haben Sie die aktuelle Version von kubeadm ausprobiert?

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

Alle 11 Kommentare

Haben Sie die aktuelle Version von kubeadm ausprobiert?

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

Es ist immer noch nicht großartig - jeder, der versucht, dies programmgesteuert zu verwenden, muss den Befehl analysieren, um sowohl den Token- als auch den Discovery-Token-Hash zu extrahieren. Es wäre besser, wenn wir ein Ausgabeformular wie json angeben könnten, damit wir es sicher analysieren können

Danke, ich wusste nicht, dass es dafür einen separaten / neuen Befehl gibt. Ich stimme zu, es wäre schöner, dies in json zu haben. Mein vorheriger Workflow für 1.6 und 1.7 war das Generieren von Kubeadm-Token und die Wiederverwendung dieses Werts beim Initiieren und Verbinden cert-Hash (und aufgrund dieses Formats nicht per se erweiterbar). Re, warum maschinenlesbar, ich habe zusätzliche Parameter, die für den Join übergeben werden müssen, und einige, die ich wie DNS für die IP ersetzen muss.

Ja, ich musste den Join-Befehl in einer Datei ablegen und dann sed verwenden, um ein Ignore-Preflight-Errors-Flag hinzuzufügen, nicht schrecklich, aber auch nicht besonders freundlich.

Es wird also ständig versucht, die Phasen zu trimmen, um es programmatischer zu machen und die Flags zu deduplizieren, dies ist nur eine User Story. @fabriziopandini hast du irgendwo ein übergeordnetes Problem dafür?

@timothysc
Das Thema für Abschlussphasen ist #454, aber es ist irgendwie veraltet und es kann sinnvoll sein, mit einem neuen zu beginnen, sobald die kommende KEP genehmigt ist.

In Bezug auf dieses Problem sollten wir jedoch IMO ein spezielles Dachthema eröffnen, um die Nachfrage nach maschinenlesbarer Ausgabe auf konsistente Weise über alle Befehle hinweg zu bewältigen, da die Anfrage von kubeadm init/phases bis kubeadm token und auch kubeadm upgrade (siehe #494).

WDYT? wenn es für dich in ordnung ist, eröffne ich die neue schirmausgabe...

Ich bin gerade selbst auf dieses Thema gestoßen. Ich konnte die sha256sum des öffentlichen Schlüssels des CA-Zertifikats wie folgt berechnen:

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

Nicht hübsch...

Ich verwende die regulären Ausdrücke. Ich habe mit Ansible getestet.

- 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

Ergebnis:

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

Schließen, da es mehrere Problemumgehungen gibt.

Dies wird nicht empfohlen, aber in https://github.com/cablespaghetti/kubeadm-aws/blob/master/worker.sh#L45 --discovery-token-unsafe-skip-ca-verification funktioniert auch

in Azure mithilfe von Tags für Worker- und Master-Ressourcen:
rg ist eine Variable mit dem RG-Namen

masterPrivateIp=$(az Netzwerk-NIC-Liste -g $rg --query "[?tags.module == 'k8smasters'].ipConfigurations[0].privateIpAddress" -o tsv)
tokenId=$(ssh $masterIp "kubeadm token list | 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"

for ip in $(az network public-ip list -g $rg --query [?tags.module == 'k8sworkers'].ipAddress -o tsv)
tun
ssh $ip $joinCommand
getan

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen