Marken
Trainingskategorien
Microsoft-Technik
Microsoft-Endbenutzer
In diesem Modul des Online-CKA-Vorbereitungskurses Broad Skills behandeln wir die im CNCF-CKA-Prüfungscurriculum identifizierten Themen zu Clusterarchitektur, Installation und Konfiguration. Wenn Sie mit dem Curriculum noch nicht vertraut sind, nehmen Sie sich einen Moment Zeit, um sich vertraut zu machen, da Sie jedes der Themen kennen müssen, um den Test zu bestehen.
Anwendungen, die unter Kubernetes ausgeführt werden, werden in Containern innerhalb von Pods ausgeführt. Es gibt mehrere Möglichkeiten, Anwendungsfehler zu beheben:
$ kubectl logs debugapp
2020-02-28 16:05:48 00:00 [Hinweis] [Entrypoint]: Einstiegspunktskript für MySQL Server 1:10.4.12 maria~bionic gestartet.
2020-02-28 16:05:49 00:00 [Anmerkung] [Einstiegspunkt]: Wechsel zum dedizierten Benutzer 'mysql'
2020-02-28 16:05:49 00:00 [Hinweis] [Entrypoint]: Einstiegspunktskript für MySQL Server 1:10.4.12 maria~bionic gestartet.
2020-02-28 16:05:49 00:00 [ERROR] [Entrypoint]: Datenbank ist nicht initialisiert und Passwortoption ist nicht angegeben
Sie müssen eines von MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD und MYSQL_RANDOM_ROOT_PASSWORD angeben
$
Komponenten der Steuerungsebene wie kube-apiserver, kube-scheduler, etcd und kube-controllermanager werden alle in statischen Pods in einem kubeadm-bootstrapped-Cluster ausgeführt. Manifeste der Komponenten der Steuerungsebene befinden sich im statischen Pfadverzeichnis kubelet des Master-Knotens. Der Standardwert ist: /etc/kubernetes/manifests . Da die Komponenten der Steuerungsebene in einem Cluster als Pods ausgeführt werden, bieten kubectl-Protokolle und kubectl-Ereignisse Einblicke in alle Aktivitäten und mögliche Probleme, mit denen diese Komponenten der Steuerungsebene konfrontiert sind. In Clustern, in denen Komponenten der Steuerungsebene als Daemons auf Systemebene ausgeführt werden, bietet die Verwendung von systemctl und journalctl denselben Ansatz.
$ kubectl logs -n kube-system kube-scheduler-$(hostname)
I0225 19:54:25.957861 1 Serving.go:312] Generiertes selbstsigniertes Zertifikat im Speicher
W0225 19:54:26.142234 1 configmap_cafile_content.go:102] kann das anfängliche CA-Bundle für: "client-ca::kube-system::extension-apiserver-authentication::client-ca-file" nicht laden wegen: configmap " Erweiterung-Apiserver-Authentifizierung" nicht gefunden
W0225 19:54:26.142423 1 configmap_cafile_content.go:102] kann das anfängliche CA-Bundle für: "client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file" nicht laden aufgrund von: configmap "extension-apiserver-authentication" nicht gefunden
W0225 19:54:26.157329 1 authorisation.go:47] Autorisierung ist deaktiviert
W0225 19:54:26.157413 1 authentication.go:92] Authentifizierung ist deaktiviert
I0225 19:54:26.157435 1 deprecated_insecure_serving.go:51] Serving healthz unsicher auf [::]:10251
I0225 19:54:26.159618 1 configmap_cafile_content.go:205] Starten von client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file
I0225 19:54:26.159658 1 shared_informer.go:197] Warten auf Synchronisierung der Caches für client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file
I0225 19:54:26.159628 1 secure_serving.go:178] Serving sicher auf 127.0.0.1:10259
$
Ein Knoten, der Pods in einem Kubernetes-Cluster ausführt, wird durch ein Kubelet dargestellt. Jedes Kubelet benötigt eine Container-Laufzeit (wie Docker), um Container auszuführen. Da die Kubelet- und Container-Laufzeit als Systemagenten ausgeführt werden, müssen Sie Tools auf Hostebene wie systemctl oder journalctl verwenden, um deren Protokolle anzuzeigen.
$ sudo systemctl status kubelet
● kubelet.service - kubelet: Der Kubernetes-Knotenagent
Geladen: geladen (/lib/systemd/system/kubelet.service; aktiviert; Herstellervoreinstellung: aktiviert)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Aktiv: aktivierend (automatischer Neustart) (Ergebnis: Exit-Code) seit Fr 2020-02-28 08:08:03 PST; vor 8s
Dokumente: https://kubernetes.io/docs/home/
Prozess: 2175 ExecStart = /usr/bin/kubelet $ KUBELET_KUBECONFIG_ARGS $ KUBELET_CONFIG_ARGS $ KUBELET_KUBE
Haupt-PID: 2175 (Code=beendet, Status=255)
28.02.2018 08:08:03 labsys systemd[1]: kubelet.service: Hauptprozess beendet, code=beendet, status=255/n/a
28. Feb. 08:08:03 labsys systemd[1]: kubelet.service: Einheit in den Fehlerzustand eingetreten.
28. Feb 08:08:03 labsys systemd[1]: kubelet.service: Fehler mit Ergebnis 'exit-code'.
$ journalctl -u kubelet | Schwanz -5
28. Feb. 08:09:15 labsys kubelet[2771]: I0228 08:09:15.417176 2771 server.go:641] --cgroups-per-qos aktiviert, aber --cgroup-root wurde nicht angegeben. standardmäßig auf /
28. Feb. 08:09:15 labsys kubelet[2771]: F0228 08:09:15.417372 2771 server.go:273] Kubelet konnte nicht ausgeführt werden: Ausführung mit aktiviertem Swap wird nicht unterstützt, bitte deaktivieren Sie Swap! oder setzen Sie das Flag --fail-swap-on auf false. /proc/swaps enthalten: [Dateiname Typ Verwendete Größe Priorität /dev/dm-1 Partition 4194300 0 -1]
28.02.2018 08:09:15 labsys systemd[1]: kubelet.service: Hauptprozess beendet, code=exited, status=255/n/a
28. Feb. 08:09:15 labsys systemd[1]: kubelet.service: Einheit in den Fehlerzustand eingetreten.
28. Feb 08:09:15 labsys systemd[1]: kubelet.service: Fehler mit Ergebnis 'exit-code'.
$
Kubelets (und damit Worker-Knoten) benötigen funktionale Container-Laufzeiten, um Pods zu betreiben. Bei Standardinstallationen muss auch der System-Swap deaktiviert sein.
Jeder Pod, der in einem Kubernetes-Cluster ausgeführt wird, muss eine eigene IP-Adresse haben. Pods erhalten ihre eindeutigen IPs vom Cluster Container Network Interface (CNI)-Plug-in. Um ein CNI-Plugin richtig zu verwenden, muss jedes Kubelet so konfiguriert sein, dass es CNI-Plugins in seinem systemd-Dienst erwartet.
Ohne funktionsfähiges CNI kann das Kubelet das Netzwerk der Container-Laufzeit nicht konfigurieren und meldet dem Cluster keinen „Bereit“-Status:
$ sudo systemctl status kubelet
● kubelet.service - kubelet: Der Kubernetes-Knotenagent
Geladen: geladen (/lib/systemd/system/kubelet.service; aktiviert; Herstellervoreinstellung: aktiviert)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Aktiv: aktiv (läuft) seit Fr. 2020-02-28 08:50:27 PST; vor 5min
Dokumente: https://kubernetes.io/docs/home/
Haupt-PID: 19302 (Würfel)
Aufgaben: 16 (Limit: 512)
Speicher: 45,2 M
CPU: 3.761s
CGroup: /system.slice/kubelet.service
└─19302 / usr / bin / kubelet --bootstrap-kubeconfig = / etc / kubernetes / bootstrap-kubelet.conf --kubeconfig = / etc / kubernetes / kubelet.conf --config = / var / lib / kubelet / config. yaml --cgroup-driver = cgroupfs
28. Feb. 08:55:58 labsys kubelet[19302]: E0228 08:55:58.668145 19302 kubelet.go:2183] Container-Laufzeitnetzwerk nicht bereit: NetworkReady=false Grund:NetworkPluginNotReady message:docker: network plugin i
28. Feb. 08:56:02 labsys kubelet[19302]: W0228 08:56:02.452412 19302 cni.go:237] cni-Konfiguration kann nicht aktualisiert werden: keine Netzwerke in /etc/cni/net.d . gefunden
$
28. Feb. 08:09:15 labsys kubelet[2771]: I0228 08:09:15.417176 2771 server.go:641] --cgroups-per-qos aktiviert, aber --cgroup-root wurde nicht angegeben. standardmäßig auf /
28. Feb. 08:09:15 labsys kubelet[2771]: F0228 08:09:15.417372 2771 server.go:273] Kubelet konnte nicht ausgeführt werden: Ausführung mit aktiviertem Swap wird nicht unterstützt, bitte deaktivieren Sie Swap! oder setzen Sie das Flag --fail-swap-on auf false. /proc/swaps enthalten: [Dateiname Typ Verwendete Größe Priorität /dev/dm-1 Partition 4194300 0 -1]
28.02.2018 08:09:15 labsys systemd[1]: kubelet.service: Hauptprozess beendet, code=exited, status=255/n/a
28. Feb. 08:09:15 labsys systemd[1]: kubelet.service: Einheit in den Fehlerzustand eingetreten.
28. Feb 08:09:15 labsys systemd[1]: kubelet.service: Fehler mit Ergebnis 'exit-code'.
$
Andere Symptome eines nicht funktionierenden oder falsch konfigurierten CNI-Plugins sind:
Andere Netzwerkfehler können Faktoren innerhalb der zugrunde liegenden Infrastruktur des Clusters betreffen, wie beispielsweise Firewallregeln oder vollständige Netzwerkpartitionen, die die Kommunikation verhindern.
Führen Sie den folgenden Befehl aus. Dieser Befehl startet einen Pod, der nicht ausgeführt wird:
kubectl run --restart Never --image redis:0.2 redispod
Rufen Sie die mit diesem Pod verknüpften Ereignisse (in beliebiger Reihenfolge aufgelistet) ab und schreiben Sie sie in eine Datei: /tmp/troubleshooting-answer.txt