
Ich habe einen Kubernetes-Cluster (v1.20.0) mit 3 Mastern und 3 Knoten installiert kubeadm init
, kubeadm join
alles auf Ubuntu 20.04. Jetzt muss ich die Konfiguration aktualisieren und
- Fügen Sie
--cloud-provider=external
das Kubelet-Startup-Flag auf allen Knoten hinzu, die ich verwenden werdevsphere-csi-treiber - Ändern Sie die
--service-cidr
aufgrund von Netzwerkanforderungen
Ich bin mir jedoch nicht ganz sicher, wie ich diese Änderungen richtig vornehme.
Kubelet
Es /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
gibt dort einen Verweis darauf, /etc/default/kubelet
aber das wird als letztes Mittel angesehen und es wird .NodeRegistration.KubeletExtraArgs
stattdessen eine Aktualisierung empfohlen:
...
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
...
Wo ist das .NodeRegistration.KubeletExtraArgs
und wie ändere ich es für alle Knoten im Cluster?
Steuerebene
Soweit ich weiß, werden der API-Server und der Controller-Manager als statische Pods auf jedem Master ausgeführt und lesen ihre Konfiguration von /etc/kubernetes/manifests/kube-<type>.yaml
. Mein erster Gedanke war, die notwendigen Änderungen an diesen Dateien vorzunehmen, aber laut den Kubernetes-Dokumenten aufUpgrade eines Kubeadm-Clusters, kubeadm wird:
* Fetches the kubeadm ClusterConfiguration from the cluster.
* Optionally backups the kube-apiserver certificate.
* Upgrades the static Pod manifests for the control plane components.
Da ich die Manifeste manuell geändert habe, werden sie in der ClusterConfiguration ( kubectl -n kube-system get cm kubeadm-config -o yaml
) nicht aktualisiert. Würden meine Änderungen auf diese Weise ein Upgrade überstehen? Ich nehme an, ich könnte die ClusterConfiguration auch manuell bearbeiten, kubeadm edit cm ...
aber das scheint fehleranfällig zu sein und man vergisst leicht jedes Mal, sie zu ändern.
Laut der Dokumentation gibt es eine Möglichkeit,Anpassen der Control-Plane-Konfigurationaber das scheint nur der Fall zu sein, wenn der Cluster zum ersten Mal installiert wird. kubeadm config print init-defaults
Wie der Name schon sagt, werden mir beispielsweise nur die Standardwerte angezeigt, nicht das, was derzeit im Cluster ausgeführt wird. Der Versuch, die Clusterkonfiguration zu extrahieren kubectl -n kube-system get cm kubeadm-config -o yaml
und auszuführen, kubeadm init --config <config>
schlägt auf alle möglichen Arten fehl, da der Cluster bereits initialisiert ist.
Kubeadm kann laufenInitialisierungsphase Steuerebeneupload-config
Dadurch werden die statischen Pod-Manifeste aktualisiert, die Clusterkonfiguration bleibt jedoch unberührt, sodass ich diese Phase ebenfalls ausführen müsste .
Basierend auf dem oben Gesagten scheint der Workflow
- Extrahieren Sie die ClusterConfiguration
kubeadm -n kube-system get cm kubeadm-config
und speichern Sie sie in einer YAML-Datei - Passen Sie die YAML-Datei mit den gewünschten Änderungen an
- Änderungen übernehmen mit
kubeadm init phase control-plane all --config <yaml>
- Geänderte Konfiguration hochladen
kubeadm init phase upload-config all --config <yaml>
- Verteilen Sie die geänderte YAML-Datei an alle Master
- Für jeden Master bewerben Sie sich mit
kubeadm init phase control-plane all --config <yaml>
Was mir hier Sorgen bereitet, ist die offensichtliche Trennung zwischen den statischen Pod-Manifesten und der Clusterkonfiguration. Änderungen werden nicht besonders oft vorgenommen, daher vergisst man leicht, dass Änderungen an einer Stelle auch Änderungen an der anderen erfordern – manuell.
Gibt es keine Möglichkeit, die Kubelet- und Control-Plane-Einstellungen zu aktualisieren, die die Konsistenz zwischen den Kubernetes-Komponenten und Kubeadm sicherstellen? Ich bin noch recht neu bei Kubernetes und es gibteine Mengean Dokumentation dazu, also tut mir leid, wenn ich hier etwas Offensichtliches übersehen habe.
Antwort1
Ich werde versuchen, auf beide Ihrer Fragen einzugehen.
1. Fügen Sie auf allen Knoten das Startflag --cloud-provider=external kubelet hinzu
Wo ist dieses .NodeRegistration.KubeletExtraArgs und wie ändere ich es für alle Knoten im Cluster?
KubeletExtraArgs
sind alle von Kubelet unterstützten Argumente und Parameter. Sie sind dokumentiertHier. Sie müssen den Befehl mit den entsprechenden Flags verwenden kubelet
, um ihn zu ändern. Beachten Sie auch, dass das Flag, das Sie verwenden möchten, in k8s v1.23 entfernt wird:
--cloud-provider string
Der Anbieter für Cloud-Dienste. Wird auf eine leere Zeichenfolge gesetzt, wenn ohne Cloud-Anbieter ausgeführt wird. Wenn festgelegt, bestimmt der Cloud-Anbieter den Namen des Knotens (lesen Sie in der Dokumentation des Cloud-Anbieters nach, ob und wie der Hostname verwendet wird). (VERALTET: wird in 1.23 entfernt, um den Code des Cloud-Anbieters aus Kubelet zu entfernen.)
BEARBEITEN:
Um Ihre Frage bezüglich Folgendem besser zu beantworten:.NodeRegistration.KubeletExtraArgs
Dies sind auch Elemente derkubeadm-Init-Konfigurationsdatei:
Es ist möglich, die Konfiguration
kubeadm init
mit einer Konfigurationsdatei statt mit Befehlszeilenflags durchzuführen, und einige erweiterte Funktionen sind möglicherweise nur als Optionen der Konfigurationsdatei verfügbar. Diese Datei wird mithilfe des--config
Flags übergeben und muss eineClusterConfiguration
Struktur und optional mehrere Strukturen enthalten, die durch getrennt sind .---\n
Das Mischen--config
mit anderen Flags ist in einigen Fällen möglicherweise nicht zulässig.
Weitere Einzelheiten finden Sie auch über dieKnotenregistrierungsoptionensowie weitere Informationen zu den Feldern und der Verwendung der Konfiguration.
Beachten Sie außerdem Folgendes:
KubeletExtraArgs
übergibt zusätzliche Argumente an den Kubelet. Die Argumente hier werden über die Umgebungsdatei an die Kubelet-Befehlszeile übergeben.kubeadm schreibt zur Laufzeit für das Kubelet in die Quelle. Dies überschreibt die generische Basiskonfiguration in kubelet-config-1.X
ConfigMap
Flags haben beim Parsen eine höhere Priorität. Diese Werte sind lokal und spezifisch für den Knoten, auf dem kubeadm ausgeführt wird.
EDIT2:
kubeadm init
soll nur einmal beim Erstellen eines Clusters verwendet werden, wenn Sie es mit Flags oder einer Konfigurationsdatei verwenden. Sie können die Konfigurationen nicht ändern, indem Sie es erneut mit anderen Werten ausführen.HierSie finden Informationen zu kubeadm und seiner Verwendung. Sobald der Cluster eingerichtet ist, sollte kubeadm gelöscht und Änderungen direkt an den statischen Pod-Manifesten vorgenommen werden.
2. Ändern Sie --service-cidr entsprechend den Netzwerkanforderungen
Das ist komplizierter. Sie könnten es ähnlich machen wieHieroderHierDieser Ansatz ist jedoch fehleranfällig und eher nicht zu empfehlen.
Der praktikablere und sicherere Weg wäre, den Cluster einfach mit kubeadm reset
und neu zu erstellen kubeadm init --service-cidr
. Die Option, die CIDRs automatisch zu ändern, war aus der Kubernetes-Perspektive nicht einmal zu erwarten. Kurz gesagt, diekubeadm zurücksetzenist hier der richtige Weg.
Antwort2
In Bezug auf
Ich verstehe, dass sich KubletExtraArgs auf die Befehlszeilenargumente von Kublet bezieht. Was ich nicht verstehe, ist, wo dieses Attribut ist und wie ich es ändern kann.
mehrere Quellen wieDieses hierzeigen auf das Hinzufügen zu
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
Zeilen wie zB
Environment="KUBELET_EXTRA_ARGS=--pod-manifest-path=/etc/kubelet.d/"
um die Umgebung für ein benutzerdefiniertes Verzeichnis für statische Pods hier beispielsweise festzulegen, anstatt die CLI mit
kubelet --pod-manifest-path=/etc/kubelet.d
wie in den Dokumenten vorgeschlagen.
Wenn Sie danach googeln, $KUBELET_EXTRA_ARGS
werden Sie zahlreiche Beispiele zu der oben genannten 10-kubeadm.conf
Datei finden.