In diesem Dokument wird beschrieben, wie Sie abgelaufene Zertifikate für Ihre Anthos-Cluster auf Bare Metal manuell verlängern. TLS-Zertifikate (Transport Layer Security) werden von den Komponenten der Steuerungsebene von Anthos-Clustern auf Bare Metal verwendet. Nach Ablauf dieser Zertifikate können Sie keine Arbeitslasten und Clusterlebenszyklen verwalten, bis die Zertifikate verlängert werden können. Weitere Informationen zu den Auswirkungen abgelaufener Zertifikate finden Sie unter Ablauf des Zertifikats.
Standardmäßig haben TLS-Zertifikate eine Ablauffrist von einem Jahr. Anthos-Cluster auf Bare Metal verlängern diese Zertifikate automatisch während Clusterupgrades und wenn Sie Zertifizierungsstellen rotieren. Wir empfehlen ein regelmäßiges Upgrade Ihrer Cluster, damit sie sicher und unterstützt bleiben und um zu vermeiden, dass TLS-Zertifikate ablaufen.
Fehler, die durch Ablauf des Zertifikats verursacht werden
Wenn die TLS-Zertifikate in Ihrem Cluster ablaufen, können die Kerncontroller keine TLS-Verbindungen mit dem Kubernetes API-Server herstellen. Dieser Mangel an Konnektivität verursacht folgende Fehler:
Unable to connect to the server: x509: Unable to connect to the server
Wenn Sie Ihre Clusterknoten mit
kubectl
abrufen, enthält die Antwort einen Fehler, der auf den Ablauf des Zertifikats verweist:kubectl get nodes --kubeconfig KUBECONFIG_PATH
Ersetzen Sie
KUBECONFIG_PATH
durch den Pfad zur kubeconfig-Datei für Ihren Cluster.Wenn Zertifikate abgelaufen sind, sieht die Antwort in etwa so aus:
Unable to connect to the server: x509: certificate has expired or is not yet valid
could not connect: x509
oderrejected connection
Abgelaufene Zertifikate blockieren den Zugriff auf den etcd-Cluster, da Peers nicht miteinander kommunizieren können. Die etcd-Logs können folgende Fehlereinträge enthalten:
W | rafthttp: health check for peer 6221a1d241bb2d0a could not connect: x509: certificate has expired or is not yet valid I | embed: rejected connection from "10.200.0.4:46108" (error "remote error: tls: bad certificate", ServerName "")
Ablaufdatum des Zertifikats prüfen
Dieser Abschnitt enthält Anleitungen zum Prüfen der Ablaufzeiten für die von Ihrem Cluster verwendeten Zertifikate. Führen Sie auf jedem Knoten der Steuerungsebene die folgenden Schritte aus.
So prüfen Sie die Ablaufzeiten von Zertifikaten:
Melden Sie sich auf einem der Knotenmaschinen der Steuerungsebene an und führen Sie den folgenden Befehl aus:
sudo kubeadm certs check-expiration
Die Befehlsausgabe listet die von
kubeadm
erstellten Zertifikate für die Komponenten der Steuerungsebene und ihr Ablaufdatum auf:CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED admin.conf Nov 28, 2021 19:09 UTC 53m no apiserver Nov 28, 2021 19:09 UTC 53m ca no apiserver-etcd-client Nov 28, 2021 19:09 UTC 53m etcd-ca no apiserver-kubelet-client Nov 28, 2021 19:09 UTC 53m ca no controller-manager.conf Nov 28, 2021 19:09 UTC 53m no etcd-healthcheck-client Nov 28, 2021 19:09 UTC 53m etcd-ca no etcd-peer Nov 28, 2021 19:09 UTC 53m etcd-ca no etcd-server Nov 28, 2021 19:09 UTC 53m etcd-ca no front-proxy-client Nov 28, 2021 19:09 UTC 53m front-proxy-ca no scheduler.conf Nov 28, 2021 19:09 UTC 53m no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED ca Nov 26, 2031 18:06 UTC 9y no etcd-ca Nov 26, 2031 18:06 UTC 9y no front-proxy-ca Nov 26, 2031 18:06 UTC 9y no
Führen Sie den folgenden Befehl aus, um die Ablaufzeiten für
kubelet
-Zertifikate zu prüfen:sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text | grep Validity -A2 sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -text | grep Validity -A2
Die Antwort für jeden Befehl sieht in etwa so aus:
Validity Not Before: Sep 17 22:27:53 2021 GMT Not After : Sep 17 22:33:16 2022 GMT
Wenn alle Knoten der Steuerungsebene gleichzeitig gestartet wurden, liegen die Ablaufzeiten des Zertifikats innerhalb weniger Minuten. Diese Timing-Beziehung gilt für alle Knoten der Steuerungsebene. Sie können die Ablaufzeiten prüfen, indem Sie die vorherigen Befehle auf jedem Knoten der Steuerungsebene ausführen.
Führen Sie auf der Administratorworkstation den folgenden Befehl aus, um die Ablaufzeit des Clientzertifikats in der kubeconfig-Datei des Clusters zu prüfen:
grep 'client-certificate-data' KUBECONFIG_PATH | \ awk '{print $2}' | base64 -d | openssl x509 -text | grep Validity -A2
Die Antwort sieht in etwa so aus:
Validity Not Before: Sep 17 22:27:53 2021 GMT Not After : Sep 17 22:33:16 2022 GMT
Führen Sie den folgenden Befehl aus, um den Ablauf des Zertifikats für die Cluster-kubeconfig im Administratorcluster zu ermitteln:
kubectl get secret/CLUSTER_NAME-kubeconfig -n CLUSTER_NAMESPACE -o --kubeconfig=ADMIN_KUBECONFIG jsonpath='{.data.value}' | base64 --decode | grep client-certificate-data | awk '{print $2}' | base64 -d | openssl x509 -text | grep Validity -A2
Validity Not Before: Sep 17 22:27:53 2021 GMT Not After : Sep 17 22:33:16 2022 GMT
Das kubeconfig-Zertifikat im Administratorcluster und das Zertifikat in der kubeconfig-Datei auf der Administratorworkstation sind identisch. Daher müssen die Ausgabe dieses Befehls und des Befehls aus dem vorherigen Schritt übereinstimmen.
Zertifikate manuell verlängern
Folgen Sie der Anleitung in den folgenden Abschnitten, um TLS-Zertifikate für einen Cluster manuell zu verlängern.
Zertifikate auf den einzelnen Knoten der Steuerungsebene verlängern
Führen Sie auf jedem Knoten der Steuerungsebene des betroffenen Clusters die folgenden Schritte aus:
Sichern Sie den Ordner
/etc/kubernetes
.Führen Sie den folgenden
kubeadm
-Befehl aus, um alle Zertifikate zu verlängern:Der Befehl verlängert die Zertifikate mithilfe der vorhandenen Zertifizierungsstellen auf dem Computer.
sudo kubeadm certs renew all
Die Befehlsausgabe sieht in etwa so aus:
certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed certificate for serving the Kubernetes API renewed certificate the apiserver uses to access etcd renewed certificate for the API server to connect to kubelet renewed certificate embedded in the kubeconfig file for the controller manager to use renewed certificate for liveness probes to healthcheck etcd renewed certificate for etcd nodes to communicate with each other renewed certificate for serving etcd renewed certificate for the front proxy client renewed certificate embedded in the kubeconfig file for the scheduler manager to use renewed
Prüfen Sie mit dem folgenden Befehl, ob die Zertifikate eine neue Ablaufzeit haben:
sudo kubeadm certs check-expiration
Starten Sie Container mit den folgenden Befehlen neu:
Das Aktualisieren dynamischer Zertifikate wird nicht von allen Komponenten der Steuerungsebene unterstützt. Daher werden bei diesem Schritt die folgenden Container neu gestartet:
kube-apiserver
,kube-scheduler
,kube-controller-manager
undetcd
, um die erneuerten Zertifikate aufzunehmen.Wiederholen Sie die folgenden Schritte für jeden der vier Container:
Suchen Sie die Container-ID für jeden Container:
sudo crictl ps | grep CONTAINER_NAME
Ersetzen Sie
CONTAINER_NAME
durch den Namen der folgenden Container:kube-apiserver
,kube-scheduler
,kube-controller-manager
oderetcd
(nichtetcd-defrag
).Die Antwort sieht in etwa so aus:
c331ade490cb6 28df10594cd92 26 hours ago Running kube-apiserver ...
Die Container-ID ist der Wert in der ersten Spalte.
Beenden Sie die einzelnen Container:
sudo crictl stop CONTAINER_ID
Ersetzen Sie CONTAINER_ID durch die Container-ID aus dem vorherigen Schritt.
Wenn der beendete Container beendet wird, erstellt kubelet einen neuen Container und löscht den beendeten. Wenn ein Fehler wie
context deadline exceeded
(FehlercodeDeadlineExceeded
) auftritt, führen Sie den Befehl noch einmal aus.
Prüfen, ob die Verbindung wiederhergestellt wurde
An diesem Punkt sollten kubeadm-Zertifikate auf allen Knoten der Steuerungsebene verlängert werden. Wenn Sie abgelaufene Zertifikate verlängern möchten, führen Sie den folgenden Schritt aus.
Führen Sie den folgenden
kubectl
-Befehl auf einem beliebigen Steuerungsebenenknoten aus, um die Verbindung zum Kubernetes API-Server zu prüfen:kubectl get nodes --kubeconfig=/etc/kubernetes/admin.conf
Die Antwort sollte die Liste der Knoten für den Cluster zurückgeben. Wenn Ihre Zertifikate ordnungsgemäß verlängert werden, werden keine TLS- oder Zertifikatsfehler zurückgegeben.
kubeconfig-Datei des Clusters ersetzen
So ersetzen Sie die kubeconfig-Datei Ihres Clusters durch einen mit den erneuerten Zertifikaten:
Führen Sie auf der Administratorworkstation den folgenden
kubectl
-Befehl aus, um die neue kubeconfig-Datei zu erstellen:kubectl --kubeconfig="ADMIN_KUBECONFIG" get secret/CLUSTER_NAME-kubeconfig \ -n "CLUSTER_NAMESPACE" -o jsonpath='{.data.value}' | base64 --decode > new_kubeconfig.conf
Dabei gilt:
ADMIN_KUBECONFIG: der Pfad zur kubeconfig-Datei des Administratorclusters.
CLUSTER_NAME ist der Name des Clusters, für den Sie Zertifikate verlängern.
CLUSTER_NAMESPACE ist der Namespace des Clusters, für den Sie Zertifikate verlängern.
Die Datei
new_kubeconfig.conf
enthält die aktualisierten Zertifikatsdaten.Prüfen Sie, ob die neue kubeconfig funktioniert, indem Sie einen beliebigen
kubectl
-Befehl mit den neuen Anmeldedaten ausführen:kubectl get nodes --kubeconfig new_kubeconfig.conf
Ersetzen Sie den Inhalt der alten kubeconfig-Datei, die im Clusterverzeichnis auf der Administrator-Workstation gespeichert ist, durch den Inhalt der neuen kubeconfig-Datei
new-kubeconfig.conf
.Der Pfad zur Clusterkonfigurationsdatei ist standardmäßig
bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
.
Kubelet-Zertifikate prüfen und etcd-defrag
neu starten
Führen Sie die folgenden Schritte für jeden Knoten der Steuerungsebene aus, um die manuelle Verlängerung von Clusterzertifikaten abzuschließen:
Melden Sie sich beim Knoten der Steuerungsebene an und prüfen Sie den kubelet-Client und die Ablaufzeit des Zertifikats, indem Sie die folgenden Befehle ausführen:
Kubelet-Zertifikate werden automatisch rotiert, solange die Steuerungsebene erreichbar ist. Der Zeitraum für die automatische Verlängerung von Kubelet-Zertifikaten ist kürzer als der Ablaufzeitraum für Komponentenzertifikate der Steuerungsebene. Daher wurden kubelet-Zertifikate wahrscheinlich bereits vor
sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text | grep Validity -A2 sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -text | grep Validity -A2
Die Ausgabe der beiden Befehle sieht in etwa so aus:
Validity Not Before: Nov 28 18:04:57 2022 GMT Not After : Nov 28 19:04:57 2023 GMT
Verwenden Sie den folgenden Befehl, um den Container
etcd-defrag
neu zu starten:Der Container
etcd-defrag
verwendet das Clientzertifikatapiserver-etcd
für die Kommunikation mit etcd und muss neu gestartet werden, um die aktualisierten Zertifikate abzurufen.kubectl rollout restart daemonset etcd-defrag -n kube-system --kubeconfig KUBECONFIG_PATH
Sie haben die manuellen Schritte zum Verlängern von Clusterzertifikaten abgeschlossen. Prüfen Sie, ob alle Pods ordnungsgemäß ausgeführt werden und ob für die Container der Steuerungsebene keine TLS-Fehler gemeldet werden.