Übung: Erkunden der Funktion eines Kubernetes-Clusters

Abgeschlossen

Beim lokalen Ausführen von Kubernetes stehen mehrere Optionen zur Verfügung. Sie können Kubernetes auf physischen Computern oder VMs installieren oder eine cloudbasierte Lösung wie Azure Kubernetes Service (AKS) verwenden.

Ihre Aufgabe ist es in dieser Übung, sich mit einer Kubernetes-Installation sowie mit einem Cluster mit nur einem Knoten vertraut zu machen. In dieser Übung erfahren Sie, wie Sie eine MicroK8s-Umgebung konfigurieren und installieren, die einfach eingerichtet und wieder gelöscht werden kann. Anschließend stellen Sie einen Kubernetes-Dienst bereit und skalieren ihn auf mehrere Instanzen, um eine Website zu hosten.

Hinweis

Dieses Übung ist optional und zeigt, wie Sie die Software und Ressourcen löschen und deinstallieren können, die Sie in dieser Übung einsetzen.

Beachten Sie, dass es auch andere Optionen wie MiniKube und die Kubernetes-Unterstützung in Docker gibt, mit denen Sie dasselbe erreichen.

Was ist MicroK8s?

MicroK8s ermöglicht die Bereitstellung eines Kubernetes-Clusters mit einem Knoten als einzelnes Paket für Workstation- und IoT-Geräte. Canonical, die Erfinder von Ubuntu Linux, hat MicroK8s ursprünglich entwickelt und verwaltet das Produkt auch heute.

Sie können MicroK8s unter Linux, Windows und macOS installieren. Die Installationsanleitung unterscheidet sich jedoch etwas zwischen den Betriebssystemen. Wählen Sie die Option aus, die am besten zu Ihrer Umgebung passt.

Installieren von MicroK8s unter Linux

Die Installation von MicroK8s unter Linux ist die Installationsoption mit der geringsten Anzahl von Schritten. Wechseln Sie zu einem Terminalfenster, und führen Sie die Befehle in den folgenden Schritten aus.

  1. Installieren Sie die MicroK8s-Snap-App. Dieser Schritt kann einige Minuten in Anspruch nehmen, je nach Geschwindigkeit Ihrer Internetverbindung und des Desktops.

    sudo snap install microk8s --classic
    

    Bei erfolgreicher Installation wird folgende Meldung angezeigt.

    2020-03-16T12:50:59+02:00 INFO Waiting for restart...
    microk8s v1.17.3 from Canonical✓ installed
    

Nun können Sie Add-Ons im Cluster installieren.

Installieren von MicroK8s unter Windows

Verwenden Sie Multipass, um MicroK8s unter Windows auszuführen. Multipass ist ein leichtgewichtiger VM-Manager für Linux, Windows und macOS.

  1. Laden Sie die neueste Multipass-Version für Windows von GitHub herunter, und installieren Sie sie.

  2. Führen Sie in einer Befehlskonsole den Startbefehl für Multipass aus, um das Image „microk8s-vm“ zu konfigurieren und auszuführen. Dieser Schritt kann einige Minuten in Anspruch nehmen, je nach Geschwindigkeit Ihrer Internetverbindung und des Desktops.

    multipass launch --name microk8s-vm --memory 4G --disk 40G
    
  3. Nachdem Sie die Startbestätigung für „microk8s-vm“ erhalten haben, führen Sie den Befehl multipass shell microk8s-vm aus, um auf die VM-Instanz zuzugreifen.

    multipass shell microk8s-vm
    

    Sobald multipass funktioniert, können Sie auf die Ubuntu-VM zugreifen, um Ihren Cluster zu hosten und MicroK8s zu installieren.

  4. Installieren Sie die MicroK8s-Snap-App. Dieser Schritt kann einige Minuten in Anspruch nehmen, je nach Geschwindigkeit Ihrer Internetverbindung und des Desktops.

    sudo snap install microk8s --classic
    

    Bei erfolgreicher Installation wird folgende Meldung angezeigt:

    2020-03-16T12:50:59+02:00 INFO Waiting for restart...
    microk8s v1.17.3 from Canonical✓ installed
    

Nun können Sie Add-Ons im Cluster installieren.

Installieren von MicroK8s unter macOS

Verwenden Sie Multipass, um MicroK8s unter macOS auszuführen. Multipass ist ein leichtgewichtiger VM-Manager für Linux, Windows und macOS.

  1. Für die Installation von Multipass unter macOS haben Sie zwei Möglichkeiten. Sie können entweder das neueste Multipass-Release für macOS von GitHub herunterladen und installieren oder Homebrew verwenden, um Multipass mit dem brew cask install multipass-Befehl zu installieren.

    brew install --cask multipass
    
  2. Führen Sie in einer Befehlskonsole den Startbefehl für Multipass aus, um das Image „microk8s-vm“ zu konfigurieren und auszuführen. Dieser Schritt kann einige Minuten in Anspruch nehmen, je nach Geschwindigkeit Ihrer Internetverbindung und des Desktops.

    multipass launch --name microk8s-vm --memory 4G --disk 40G
    
  3. Nachdem Sie die Startbestätigung für „microk8s-vm“ erhalten haben, führen Sie den Befehl multipass shell microk8s-vm aus, um auf die VM-Instanz zuzugreifen.

    multipass shell microk8s-vm
    

    Nun können Sie auf die Ubuntu-VM zugreifen, auf der Ihr Cluster gehostet wird. Sie müssen jedoch noch MicroK8s installieren. Führen Sie die folgenden Schritte aus.

  4. Installieren Sie die MicroK8s-Snap-App. Dieser Schritt kann einige Minuten in Anspruch nehmen, je nach Geschwindigkeit Ihrer Internetverbindung und des Desktops.

    sudo snap install microk8s --classic
    

    Bei erfolgreicher Installation wird folgende Meldung angezeigt:

    2020-03-16T12:50:59+02:00 INFO Waiting for restart...
    microk8s v1.17.3 from Canonical✓ installed
    

Nun können Sie Add-Ons im Cluster installieren.

Vorbereiten des Clusters

Führen Sie den Befehl status in MicroK8s aus, um die Status der auf Ihrem Cluster installierten Add-Ons anzuzeigen. Diese Add-Ons bieten verschiedene Dienste, von denen einige bereits zuvor behandelt wurden. Ein Beispiel hierfür ist die DNS-Funktionalität.

  1. Führen Sie den Befehl microk8s.status --wait-ready aus, um den Status der Installation zu überprüfen.

    sudo microk8s.status --wait-ready
    

    Beachten Sie, dass mehrere deaktivierte Add-Ons in Ihrem Cluster vorhanden sind. Machen Sie sich keine Gedanken über Add-Ons, die Sie nicht erkennen.

    microk8s is running
    addons:
    cilium: disabled
    dashboard: disabled
    dns: disabled
    fluentd: disabled
    gpu: disabled
    helm3: disabled
    helm: disabled
    ingress: disabled
    istio: disabled
    jaeger: disabled
    juju: disabled
    knative: disabled
    kubeflow: disabled
    linkerd: disabled
    metallb: disabled
    metrics-server: disabled
    prometheus: disabled
    rbac: disabled
    registry: disabled
    storage: disabled
    
  2. Aus der Liste müssen Sie die DNS-, Dashboard- und Registrierungs-Add-Ons aktivieren. Hier sind die Zwecke der einzelnen Add-Ons:

    Add-Ons Zweck
    DNS Stellt den coreDNS-Dienst bereit
    Dashboard Stellt den Dienst kubernetes-dashboard und verschiedene weitere Dienste bereit, die seine Funktionalität unterstützen. Es handelt sich um eine allgemeine, webbasierte Benutzeroberfläche für Kubernetes-Cluster.
    Registrierung Stellt eine private Registrierung und weitere Dienste bereit, die deren Funktionalität unterstützen. Verwenden Sie diese Registrierung, um private Container zu speichern.

    Führen Sie den folgenden Befehl aus, um die Add-Ons zu installieren.

    sudo microk8s.enable dns dashboard registry
    

Sie können jetzt auf Ihren Cluster mithilfe von kubectl zugreifen.

Untersuchen des Kubernetes-Clusters

MicroK8s stellt eine Version von kubectl bereit, über die Sie mit Ihrem neuen Kubernetes-Cluster interagieren können. Mit dieser Kopie von kubectl kann eine parallele Installation einer anderen systemweiten kubectl-Instanz vorhanden sein, ohne dass sich dies auf ihre Funktionalität auswirkt.

  1. Führen Sie den Befehl snap alias aus, um kubectl als Alias für microk8s.kubectl hinzuzufügen. Dieser Schritt vereinfacht die Verwendung.

    sudo snap alias microk8s.kubectl kubectl
    

    Die folgende Ausgabe wird angezeigt, wenn der Befehl erfolgreich ausgeführt wurde:

    Added:
      - microk8s.kubectl as kubectl
    

Anzeigen der Informationen des Clusterknotens

Sie haben bereits gelernt, dass ein Kubernetes-Cluster aus Steuerungsebenen und Workerknoten besteht. Nun werden Sie sich ansehen, was auf dem neuen Cluster installiert ist.

  1. Überprüfen Sie dazu die Knoten, die in Ihrem Cluster ausgeführt werden.

    Sie wissen, dass MicroK8s eine Clusterinstallation mit nur einem Knoten ist. Daher erwarten Sie, dass nur ein Knoten angezeigt wird. Bedenken Sie jedoch, dass dieser Knoten zugleich die Steuerungsebene und ein Workerknoten im Cluster ist. Bestätigen Sie diese Konfiguration, indem Sie den Befehl kubectl get nodes ausführen. Führen Sie den Befehl kubectl get aus, um Informationen zu allen Ressourcen in Ihrem Cluster abzurufen:

    sudo kubectl get nodes
    

    Das Ergebnis ähnelt dem folgenden Beispiel, in dem gezeigt wird, dass nur ein Knoten im Cluster mit dem Namen microk8s-vm vorhanden ist. Beachten Sie, dass der Knoten sich im Status Bereit befindet. Dieser Status gibt an, dass die Steuerungsebene Workloads auf diesem Knoten planen kann.

    NAME          STATUS   ROLES    AGE   VERSION
    microk8s-vm   Ready    <none>   35m   v1.17.3
    

    Sie können weitere Informationen für die angeforderte Ressource abrufen. Lassen Sie uns beispielsweise annehmen, dass Sie die IP-Adresse des Knotens finden müssen. Führen Sie den Parameter -o wide aus, um zusätzliche Informationen vom API-Server abzurufen:

    sudo kubectl get nodes -o wide
    

    Das Ergebnis ähnelt dem folgenden Beispiel. Beachten Sie, dass Sie jetzt die interne IP-Adresse des Knotens, das auf dem Knoten ausgeführte Betriebssystem, die Kernelversion sowie die Containerruntime sehen können.

    NAME          STATUS   ROLES    AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
    microk8s-vm   Ready    <none>   36m   v1.17.3   192.168.56.132   <none>        Ubuntu 18.04.4 LTS   4.15.0-88-generic   containerd://1.2.5
    
  2. Im nächsten Schritt erkunden Sie die auf Ihrem Cluster ausgeführten Dienste. Führen Sie wie bei Knoten den Befehl kubectl get aus, um Informationen über die Dienste abzurufen, die im Cluster ausgeführt werden.

    sudo kubectl get services -o wide
    

    Das Ergebnis ähnelt dem folgenden Beispiel. Beachten Sie jedoch, dass nur ein Dienst aufgeführt ist. Sie haben zuvor Add-Ons im Cluster installiert und würden erwarten, dass diese Dienste ebenfalls angezeigt werden.

    NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE   SELECTOR
    kubernetes   ClusterIP   10.152.183.1   <none>        443/TCP   37m   <none>
    

    Der Grund dafür, dass nur ein einzelner Dienst aufgeführt wird, liegt darin, dass Kubernetes sogenannte Namespaces verwendet, um einen Cluster logisch in mehrere virtuelle Cluster aufzuteilen.

    Übergeben Sie den Parameter --all-namespaces, um alle Dienste in allen Namespaces abzurufen:

    sudo kubectl get services -o wide --all-namespaces
    

    Das Ergebnis ähnelt dem folgenden Beispiel. Beachten Sie, dass sich in Ihrem Cluster drei Namespaces befinden. Dabei handelt es sich um den Standardnamespace sowie die Namespaces container-registry und kube-system. Hier werden die Instanzen registry, kube-dns und kubernetes-dashboard angezeigt, die Sie installiert haben. Außerdem gibt es unterstützende Dienste, die zusammen mit einigen Add-Ons installiert wurden.

    NAMESPACE            NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE   SELECTOR
    container-registry   registry                    NodePort    10.152.183.36    <none>        5000:32000/TCP           28m   app=registry
    default              kubernetes                  ClusterIP   10.152.183.1     <none>        443/TCP                  37m   <none>
    kube-system          dashboard-metrics-scraper   ClusterIP   10.152.183.130   <none>        8000/TCP                 28m   k8s-app=dashboard-metrics-scraper
    kube-system          heapster                    ClusterIP   10.152.183.115   <none>        80/TCP                   28m   k8s-app=heapster
    kube-system          kube-dns                    ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP,9153/TCP   28m   k8s-app=kube-dns
    kube-system          kubernetes-dashboard        ClusterIP   10.152.183.132   <none>        443/TCP                  28m   k8s-app=kubernetes-dashboard
    kube-system          monitoring-grafana          ClusterIP   10.152.183.88    <none>        80/TCP                   28m   k8s-app=influxGrafana
    kube-system          monitoring-influxdb         ClusterIP   10.152.183.232   <none>        8083/TCP,8086/TCP        28m   k8s-app=influxGrafana
    

    Da Ihnen nun die Dienste angezeigt werden, die im Cluster ausgeführt werden, können Sie jetzt eine Workload auf dem Workerknoten planen.

Installieren eines Webservers in einem Cluster

Sie möchten auf einem Webserver im Cluster eine Workload planen, der eine Website für Ihre Kunden bereitstellt. Dafür haben Sie verschiedene Optionen zur Auswahl. In diesem Beispiel verwenden Sie NGINX.

Wie bereits erwähnt, können Sie in Podmanifestdateien Ihre Pods, Replikatgruppen und Bereitstellungen beschreiben, um Workloads zu definieren. Da diese Dateien nicht ausführlich behandelt wurden, verwenden Sie kubectl, um die Informationen direkt an den API-Server zu übergeben.

Obwohl kubectl sehr praktisch ist, ist die Verwendung von Manifestdateien eine bewährte Methode. Mit Manifestdateien können Sie ganz einfach einen Rollforward oder ein Rollback für Ihre Bereitstellungen in Ihrem Cluster ausführen. Diese Dateien helfen auch beim Dokumentieren der Konfiguration eines Clusters.

  1. Führen Sie den Befehl kubectl create deployment aus, um Ihre NGINX-Bereitstellung zu erstellen. Geben Sie den Namen der Bereitstellung sowie das Containerimage an, um eine einzelne Instanz des Pods zu erstellen.

    sudo kubectl create deployment nginx --image=nginx
    

    Das Ergebnis ähnelt dem folgenden Beispiel:

    deployment.apps/nginx created
    
  2. Führen Sie kubectl get deployments aus, um die Informationen zu Ihrer Bereitstellung abzurufen:

    sudo kubectl get deployments
    

    Das Ergebnis ähnelt dem folgenden Beispiel. Beachten Sie, dass der Name der Bereitstellung mit dem Namen übereinstimmt, den Sie festgelegt haben, und dass eine Bereitstellung mit diesem Namen den Status „Ready“ (Bereit) aufweist und verfügbar ist.

    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    nginx   1/1     1            1           18s
    
  3. Die Bereitstellung hat einen Pod erstellt. Führen Sie den Befehl kubectl get pods aus, um Informationen über die Pods Ihres Clusters abzurufen:

    sudo kubectl get pods
    

    Das Ergebnis ähnelt dem folgenden Beispiel. Beachten Sie, dass der Name des Pods ein generierter Wert ist, dem der Namen der Bereitstellung vorangestellt ist, und dass der Status des Pods Running (Wird ausgeführt) lautet.

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-86c57db685-dj6lz   1/1     Running   0          33s
    

Testen der Websiteinstallation

Testen Sie die NGINX-Installation, indem Sie eine Verbindung mit dem Webserver über die IP-Adresse des Pods herstellen.

  1. Um die Adresse des Pods zu finden, übergeben Sie den Parameter -o wide:

    sudo kubectl get pods -o wide
    

    Das Ergebnis ähnelt dem folgenden Beispiel. Beachten Sie, dass der Befehl sowohl die IP-Adresse des Knotens als auch den Knotennamen zurückgibt, auf dem die Workload geplant ist.

    NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE          NOMINATED NODE   READINESS GATES
    nginx-86c57db685-dj6lz   1/1     Running   0          4m17s   10.1.83.10   microk8s-vm   <none>           <none>
    
  2. Um auf die Website zuzugreifen, führen Sie wget auf der ip-Adresse aus, die zuvor aufgeführt ist:

    wget <POD_IP>
    

    Das Ergebnis ähnelt dem folgenden Beispiel:

    --2020-03-16 13:34:17--  http://10.1.83.10/
    Connecting to 10.1.83.10:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 612 [text/html]
    Saving to: 'index.html'
    
    index.html                                    100%[==============================================================================================>]     612  --.-KB/s    in 0s
    
    2020-03-16 13:34:17 (150 MB/s) - 'index.html' saved [612/612]
    

Skalieren einer Webserverbereitstellung in einem Cluster

Angenommen, es gibt plötzlich eine erhöhte Anzahl von Benutzern, die auf Ihre Website zugreifen, und die Website schlägt aufgrund der Auslastung fehl. Sie können weitere Instanzen der Website in Ihrem Cluster bereitstellen und die Auslastung auf diese Instanzen aufteilen.

Führen Sie den Befehl kubectl scale aus, um die Anzahl der Replikate in Ihrer Bereitstellung zu skalieren. Darin geben Sie die Anzahl der benötigten Replikate und den Namen der Bereitstellung an.

  1. Führen Sie den Befehl kubectl scale aus, um die Gesamtsumme der NGINX-Pods auf drei zu skalieren:

    sudo kubectl scale --replicas=3 deployments/nginx
    

    Das Ergebnis ähnelt dem folgenden Beispiel:

    deployment.apps/nginx scaled
    

    Der Skalierungsbefehl ermöglicht Ihnen, die Anzahl der Instanzen hoch- oder herunterzuskalieren.

  2. Führen Sie den Befehl kubectl get aus, und übergeben Sie nochmals den Parameter -o wide, um die Anzahl der aktiven Pods zu überprüfen:

    sudo kubectl get pods -o wide
    

    Das Ergebnis ähnelt dem folgenden Beispiel. Beachten Sie, dass nun drei Pods angezeigt werden, die ausgeführt werden. Jeder Pod verfügt über eine eindeutige IP-Adresse.

    NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE          NOMINATED NODE   READINESS GATES
    nginx-86c57db685-dj6lz   1/1     Running   0          7m57s   10.1.83.10   microk8s-vm   <none>           <none>
    nginx-86c57db685-lzrwp   1/1     Running   0          9s      10.1.83.12   microk8s-vm   <none>           <none>
    nginx-86c57db685-m7vdd   1/1     Running   0          9s      10.1.83.11   microk8s-vm   <none>           <none>
    ubuntu@microk8s-vm:~$
    

Sie müssten einige zusätzliche Konfigurationen auf den Cluster anwenden, um Ihre Website effektiv als öffentliche Website verfügbar zu machen. Sie müssten beispielsweise einen Lastenausgleich installieren und Knoten-IP-Adressen zuordnen. Diese Art von Konfiguration stellt einen Teil der fortgeschrittenen Konzepte dar, die Sie in Zukunft kennenlernen werden. In der Zusammenfassung gibt es Anweisungen, wenn Sie ihre VM deinstallieren und bereinigen möchten.