Kubernetes-Anwendungen veröffentlichen

KubernetesKubernetesBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab erfahren Sie, wie Sie Kubernetes-Anwendungen mit verschiedenen Techniken zugänglich machen können. Dazu gehören die Erstellung interner und externer Dienste, die Arbeit mit Labels und die Erkundung der Grundlagen von Ingress. Sie beginnen damit, einen lokalen Kubernetes-Cluster mit Minikube einzurichten. Anschließend stellen Sie eine Beispiel-NGINX-Anwendung bereit und machen sie sowohl intern als auch extern zugänglich. Sie werden auch die Verwendung von Labels zur Organisation und Auswahl von Ressourcen untersuchen. Abschließend lernen Sie etwas über Ingress und sehen ein einfaches Ingress-YAML-Beispiel.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicsGroup(["Basics"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("Initialization") kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/delete("Delete") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/label("Label") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/version("Version") subgraph Lab Skills kubernetes/initialization -.-> lab-434647{{"Kubernetes-Anwendungen veröffentlichen"}} kubernetes/get -.-> lab-434647{{"Kubernetes-Anwendungen veröffentlichen"}} kubernetes/create -.-> lab-434647{{"Kubernetes-Anwendungen veröffentlichen"}} kubernetes/delete -.-> lab-434647{{"Kubernetes-Anwendungen veröffentlichen"}} kubernetes/apply -.-> lab-434647{{"Kubernetes-Anwendungen veröffentlichen"}} kubernetes/describe -.-> lab-434647{{"Kubernetes-Anwendungen veröffentlichen"}} kubernetes/label -.-> lab-434647{{"Kubernetes-Anwendungen veröffentlichen"}} kubernetes/version -.-> lab-434647{{"Kubernetes-Anwendungen veröffentlichen"}} end

Starten des Kubernetes-Clusters

In diesem Schritt erfahren Sie, wie Sie einen lokalen Kubernetes-Cluster mit Minikube starten und überprüfen können. Dies ist ein wesentlicher erster Schritt für die Entwicklung und das Testen von Kubernetes-Anwendungen auf Ihrem lokalen Rechner.

Zunächst starten Sie den Minikube-Cluster:

minikube start

Beispielausgabe:

😄  minikube v1.29.0 on Ubuntu 22.04
✨  Automatically selected the docker driver
📌  Using Docker driver with root permissions
🔥  Creating kubernetes in kubernetes cluster
🔄  Restarting existing kubernetes cluster
🐳  Preparing Kubernetes v1.26.1 on Docker 20.10.23...
🚀  Launching Kubernetes...
🌟  Enabling addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace

Überprüfen Sie den Status des Clusters mit mehreren Befehlen:

minikube status
kubectl get nodes

Beispielausgabe für minikube status:

minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

Beispielausgabe für kubectl get nodes:

NAME       STATUS   ROLES           AGE   VERSION
minikube   Ready    control-plane   1m    v1.26.1

Diese Befehle bestätigen, dass:

  1. Minikube erfolgreich läuft.
  2. Ein lokaler Kubernetes-Cluster erstellt wurde.
  3. Der Cluster einsatzbereit ist.
  4. Sie einen Ein-Knoten-Cluster mit Control-Plane-Funktionalität haben.

Bereitstellung einer Beispielanwendung

In diesem Schritt erfahren Sie, wie Sie eine Kubernetes-Anwendung mithilfe einer YAML-Manifestdatei erstellen und bereitstellen können. Wir werden eine einfache NGINX-Webserver-Bereitstellung erstellen, um den Prozess der Definition und Anwendung von Kubernetes-Ressourcen zu demonstrieren.

Zunächst erstellen Sie ein Verzeichnis für Ihre Kubernetes-Manifestdateien:

mkdir -p ~/project/k8s-manifests
cd ~/project/k8s-manifests

Erstellen Sie eine YAML-Datei für die NGINX-Bereitstellung:

nano nginx-deployment.yaml

Fügen Sie das folgende Bereitstellungsmanifest hinzu:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

Speichern Sie die Datei (Strg+X, dann Y, dann Eingabe).

Wenden Sie die Bereitstellung auf den Kubernetes-Cluster an:

kubectl apply -f nginx-deployment.yaml

Beispielausgabe:

deployment.apps/nginx-deployment created

Überprüfen Sie die Bereitstellung und die Pods:

kubectl get deployments
kubectl get pods

Beispielausgabe für kubectl get deployments:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           1m

Beispielausgabe für kubectl get pods:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-xxx-yyy            1/1     Running   0          1m
nginx-deployment-xxx-zzz            1/1     Running   0          1m
nginx-deployment-xxx-www            1/1     Running   0          1m

Warten Sie, bis die Pods im Zustand "Running" sind, bevor Sie fortfahren.

Lassen Sie uns das YAML-Manifest analysieren:

  • apiVersion: Gibt die Kubernetes-API-Version an.
  • kind: Definiert den Ressourcentyp (Deployment).
  • metadata: Liefert Name und Labels für die Bereitstellung.
  • spec.replicas: Legt die Anzahl der Pod-Replikate fest.
  • selector: Hilft der Bereitstellung, die richtigen Pods zu verwalten.
  • template: Definiert die Pod-Spezifikation.
  • containers: Gibt das Container-Image und den Port an.

Diese Bereitstellung erstellt drei identische NGINX-Pods und zeigt, wie Kubernetes containerisierte Anwendungen verwaltet.

Erstellen eines Services über YAML, um die Anwendung intern oder extern zugänglich zu machen

In diesem Schritt erfahren Sie, wie Sie Kubernetes-Services erstellen können, um Ihre NGINX-Bereitstellung sowohl intern als auch extern zugänglich zu machen. Wir werden zwei häufige Service-Typen demonstrieren: ClusterIP und NodePort.

Zunächst navigieren Sie in Ihr Projektverzeichnis:

cd ~/project/k8s-manifests

Erstellen Sie eine YAML-Datei für einen ClusterIP-Service:

nano nginx-clusterip-service.yaml

Fügen Sie das folgende Service-Manifest hinzu:

apiVersion: v1
kind: Service
metadata:
  name: nginx-clusterip-service
spec:
  selector:
    app: nginx
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 80

Nun erstellen Sie eine YAML-Datei für einen NodePort-Service:

nano nginx-nodeport-service.yaml

Fügen Sie das folgende Service-Manifest hinzu:

apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport-service
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080

Wenden Sie beide Service-Konfigurationen an:

kubectl apply -f nginx-clusterip-service.yaml
kubectl apply -f nginx-nodeport-service.yaml

Beispielausgabe:

service/nginx-clusterip-service created
service/nginx-nodeport-service created

Überprüfen Sie die Services:

kubectl get services

Beispielausgabe:

NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes                  ClusterIP   10.96.0.1        <none>        443/TCP        30m
nginx-clusterip-service     ClusterIP   10.104.xxx.xxx   <none>        80/TCP         1m
nginx-nodeport-service      NodePort    10.108.yyy.yyy   <none>        80:30080/TCP   1m

Um auf den NodePort-Service zuzugreifen, rufen Sie die Minikube-IP ab:

minikube ip

Beispielausgabe:

192.168.49.2

Wichtige Unterschiede zwischen den Service-Typen:

  • ClusterIP: Nur interner Zugriff innerhalb des Clusters
  • NodePort: Macht den Service auf einem statischen Port auf der IP jedes Knotens zugänglich
  • NodePort-Bereich: 30000 - 32767

Überprüfen der Service-Konfiguration

In diesem Schritt erfahren Sie, wie Sie kubectl describe service verwenden können, um die detaillierte Konfiguration von Kubernetes-Services zu untersuchen und deren Netzwerkeigenschaften zu verstehen.

Stellen Sie zunächst sicher, dass Sie sich im Projektverzeichnis befinden:

cd ~/project/k8s-manifests

Beschreiben Sie den ClusterIP-Service im Detail:

kubectl describe service nginx-clusterip-service

Beispielausgabe:

Name:              nginx-clusterip-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.104.xxx.xxx
IPs:               10.104.xxx.xxx
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.0.7:80,10.244.0.8:80,10.244.0.9:80
Session Affinity:  None
Events:            <none>

Nun beschreiben Sie den NodePort-Service:

kubectl describe service nginx-nodeport-service

Beispielausgabe:

Name:                     nginx-nodeport-service
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=nginx
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.108.yyy.yyy
IPs:                      10.108.yyy.yyy
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30080/TCP
Endpoints:                10.244.0.7:80,10.244.0.8:80,10.244.0.9:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

Untersuchen Sie die Service-Endpunkte, um die Netzwerkverbindung zu überprüfen:

kubectl get endpoints

Beispielausgabe:

NAME                        ENDPOINTS                               AGE
kubernetes                  192.168.49.2:8443                       45m
nginx-clusterip-service     10.244.0.7:80,10.244.0.8:80,10.244.0.9:80   15m
nginx-nodeport-service      10.244.0.7:80,10.244.0.8:80,10.244.0.9:80   15m

Wichtige Informationen, die aus der Service-Beschreibung zu verstehen sind:

  • Selector: Zeigt an, welche Pods Teil des Services sind.
  • IP: Cluster-interne IP-Adresse des Services.
  • Endpoints: Liste der Pod-IP-Adressen und -Ports, die den Service bedienen.
  • Port und TargetPort: Definieren, wie der Datenverkehr geroutet wird.
  • NodePort: Externer Port für den Service-Typ NodePort.

Verwenden von Labels zur Organisation und Auswahl von Ressourcen

In diesem Schritt erfahren Sie, wie Sie Labels in Kubernetes verwenden können, um Ressourcen effizient zu organisieren und auszuwählen. Labels sind Schlüssel-Wert-Paare, die Ihnen helfen, Kubernetes-Objekte zu verwalten und zu organisieren.

Zunächst überprüfen Sie die aktuellen Labels auf Ihren Pods:

kubectl get pods --show-labels

Beispielausgabe:

NAME                                READY   STATUS    RESTARTS   AGE   LABELS
nginx-deployment-xxx-yyy            1/1     Running   0          30m   app=nginx,pod-template-hash=xxx
nginx-deployment-xxx-zzz            1/1     Running   0          30m   app=nginx,pod-template-hash=yyy
nginx-deployment-xxx-www            1/1     Running   0          30m   app=nginx,pod-template-hash=zzz

Wählen Sie Pods anhand spezifischer Labels aus:

kubectl get pods -l app=nginx

Beispielausgabe:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-xxx-yyy            1/1     Running   0          30m
nginx-deployment-xxx-zzz            1/1     Running   0          30m
nginx-deployment-xxx-www            1/1     Running   0          30m

Fügen Sie einem der Pods ein benutzerdefiniertes Label hinzu:

kubectl label pods nginx-deployment-xxx-yyy environment=development

Ersetzen Sie nginx-deployment-xxx-yyy durch den Namen eines Ihrer Pods.

Beispielausgabe:

pod/nginx-deployment-xxx-yyy labeled

Wählen Sie nun Pods mit mehreren Label-Selektoren aus:

kubectl get pods -l app=nginx,environment=development

Beispielausgabe:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-xxx-yyy            1/1     Running   0          30m

Entfernen Sie ein Label von einem Pod:

kubectl label pods nginx-deployment-xxx-yyy environment-

Beispielausgabe:

pod/nginx-deployment-xxx-yyy unlabeled

Demonstrieren Sie die Label-Auswahl in Services:

kubectl describe service nginx-clusterip-service

Suchen Sie nach dem Abschnitt "Selector", der zeigt, wie Services Labels verwenden, um Pods zu identifizieren.

Wichtige Punkte zu Labels:

  • Labels sind Schlüssel-Wert-Paare, die an Kubernetes-Objekte angehängt werden.
  • Sie werden zur Organisation, Auswahl und Filterung von Ressourcen verwendet.
  • Sie können dynamisch hinzugefügt, geändert oder entfernt werden.
  • Services und Bereitstellungen verwenden Labels, um verwandte Pods zu verwalten.

Löschen und Verwalten von Services

In diesem Schritt lernen Sie, wie Sie Kubernetes-Services (Kubernetes-Dienste) mit kubectl-Befehlen löschen und verwalten. Das Verständnis der Service-Verwaltung ist entscheidend für die Wartung und Bereinigung Ihrer Kubernetes-Ressourcen.

Zunächst listen Sie die aktuellen Services auf:

kubectl get services

Beispielausgabe:

NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes                  ClusterIP   10.96.0.1        <none>        443/TCP        1h
nginx-clusterip-service     ClusterIP   10.104.xxx.xxx   <none>        80/TCP         45m
nginx-nodeport-service      NodePort    10.108.yyy.yyy   <none>        80:30080/TCP   45m

Löschen Sie einen bestimmten Service mit kubectl delete:

kubectl delete service nginx-clusterip-service

Beispielausgabe:

service "nginx-clusterip-service" deleted

Überprüfen Sie das Löschen des Services:

kubectl get services

Beispielausgabe:

NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes                  ClusterIP   10.96.0.1        <none>        443/TCP        1h
nginx-nodeport-service      NodePort    10.108.yyy.yyy   <none>        80:30080/TCP   45m

Um das Löschen mehrerer Services deutlicher zu demonstrieren, erstellen wir unsere Services neu und löschen sie dann zusammen:

## Recreate services
kubectl apply -f nginx-clusterip-service.yaml
kubectl apply -f nginx-nodeport-service.yaml
## Delete multiple services at once
kubectl delete service nginx-clusterip-service nginx-nodeport-service

Beispielausgabe:

service "nginx-clusterip-service" deleted
service "nginx-nodeport-service" deleted

Überprüfen Sie, ob alle Services entfernt wurden (außer dem Standard-Kubernetes-Service):

kubectl get services

Beispielausgabe:

NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   1h

Wichtige Punkte zum Löschen von Services:

  • Das Löschen eines Services entfernt den Netzwerkendpunkt.
  • Pods werden nicht gelöscht, wenn ein Service entfernt wird.
  • Der Standard-Kubernetes-Service kann nicht gelöscht werden.
  • Sie können Services anhand des Namens, einer YAML-Datei oder von Labels löschen.
  • Mehrere Services können gleichzeitig gelöscht werden, indem Sie sie auflisten oder Label-Selektoren verwenden.

Einführung in die Grundlagen von Ingress und ein einfaches Ingress YAML-Beispiel

In diesem Schritt lernen Sie Kubernetes Ingress kennen, eine leistungsstarke Methode zur Verwaltung des externen Zugangs zu Diensten in einem Kubernetes-Cluster.

Was ist Ingress?

Ingress ist ein API-Objekt, das den externen Zugang zu Diensten in einem Kubernetes-Cluster verwaltet, typischerweise für HTTP-Verkehr. Ingress bietet:

  • Lastverteilung: Verteilt den Verkehr auf mehrere Backend-Dienste
  • SSL/TLS-Terminierung: Handhabt sichere Verbindungen
  • Namensbasierte Virtuelle Hosting: Leitet Anfragen basierend auf dem Hostnamen an verschiedene Dienste weiter
  • Pfadbasierte Routing: Leitet Anfragen basierend auf dem URL-Pfad an verschiedene Dienste weiter

Ingress besteht aus zwei Komponenten:

  1. Ingress-Ressource: Ein Kubernetes-API-Objekt, das die Routing-Regeln definiert
  2. Ingress-Controller: Die Implementierung, die die in der Ingress-Ressource definierten Regeln durchsetzt

Hinweis: Dieser Lab bietet nur eine grundlegende Einführung in Ingress. In Produktionsumgebungen können Ingress-Konfigurationen viel komplexer sein, einschließlich fortgeschrittenem Routing, Authentifizierung, Rate-Limiting und vieles mehr.

Aktivieren Sie das Ingress-Addon in Minikube:

minikube addons enable ingress

Beispielausgabe:

💡  ingress ist ein von Kubernetes verwaltetes Addon. Bei Fragen wenden Sie sich an minikube auf GitHub.
🔉  ingress wurde erfolgreich aktiviert

Erstellen Sie eine Bereitstellung für zwei Beispielanwendungen:

kubectl create deployment web1 --image=nginx:alpine
kubectl create deployment web2 --image=httpd:alpine

Stellen Sie diese Bereitstellungen als Dienste zur Verfügung:

kubectl expose deployment web1 --port=80 --type=ClusterIP --name=web1-service
kubectl expose deployment web2 --port=80 --type=ClusterIP --name=web2-service

Erstellen Sie eine Ingress YAML-Datei:

nano ingress-example.yaml

Fügen Sie die folgende Ingress-Konfiguration hinzu:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
          - path: /web1
            pathType: Prefix
            backend:
              service:
                name: web1-service
                port:
                  number: 80
          - path: /web2
            pathType: Prefix
            backend:
              service:
                name: web2-service
                port:
                  number: 80

Wichtige Komponenten dieser Ingress-Konfiguration:

  • metadata.annotations: Spezifische Konfigurationen für den Ingress-Controller
  • spec.rules: Definieren, wie der Verkehr an Dienste geroutet wird
  • path: URL-Pfad, der übereinstimmen muss
  • pathType: Wie der Pfad übereinstimmen soll (Prefix, Exact oder ImplementationSpecific)
  • backend.service: Der Dienst und der Port, an den der Verkehr geroutet wird

Wenden Sie die Ingress-Konfiguration an:

kubectl apply -f ingress-example.yaml

Überprüfen Sie die Ingress-Ressource:

kubectl get ingress

Beispielausgabe:

NAME              CLASS   HOSTS   ADDRESS        PORTS   AGE
example-ingress   nginx   *       192.168.49.2   80      1m

Prüfen Sie die Ingress-Details:

kubectl describe ingress example-ingress

Die Beispielausgabe zeigt die Routing-Regeln und die Backend-Dienste.

Testen Sie den Ingress:

## Holen Sie sich die Minikube-IP
minikube ip

## Testen Sie den Zugang zu den Diensten über Ingress
curl $(minikube ip)/web1
curl $(minikube ip)/web2

Jeder Befehl sollte die Standardseite des jeweiligen Webservers zurückgeben.

In Produktionsumgebungen kann Ingress mit folgenden Merkmalen konfiguriert werden:

  • Mehrere hostnamenbasierte Regeln
  • TLS-Zertifikate für HTTPS
  • Authentifizierungsmechanismen
  • Rate-Limiting
  • Benutzerdefinierte Timeout-Konfigurationen
  • Sitzungsaffinität
  • Und viele weitere fortgeschrittene Funktionen

Für eine umfassendere Abdeckung von Ingress verweisen Sie auf die Kubernetes-Dokumentation und erwägen Sie, die spezifische Dokumentation von Ingress-Controllern wie NGINX Ingress oder Traefik zu erkunden.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie einen lokalen Kubernetes-Cluster mit Minikube starten und überprüfen können. Dies ist für die Entwicklung und das Testen von Kubernetes-Anwendungen auf Ihrem lokalen Rechner unerlässlich. Anschließend haben Sie mithilfe einer YAML-Manifestdatei eine einfache NGINX-Webserver-Bereitstellung erstellt und deployed, wodurch der Prozess der Definition und Anwendung von Kubernetes-Ressourcen demonstriert wurde. Darüber hinaus haben Sie gelernt, wie Sie einen Kubernetes-Service erstellen, um Ihre Anwendung intern oder extern bereitzustellen, und wie Sie Labels verwenden können, um Ressourcen zu organisieren und auszuwählen. Schließlich haben Sie die Grundlagen von Kubernetes Ingress kennengelernt und ein einfaches Ingress-YAML-Beispiel gesehen.