Anwenden des YAML-Manifests
In diesem Schritt werden Sie den kubectl apply
-Befehl detaillierter untersuchen und verschiedene Methoden zum Anwenden von Kubernetes-Manifesten lernen. Basierend auf den YAML-Dateien aus dem vorherigen Schritt werden wir verschiedene Techniken zum Anwenden von Manifesten demonstrieren.
Stellen Sie zunächst sicher, dass Sie sich im richtigen Verzeichnis befinden:
cd ~/project/k8s-manifests
Erstellen wir ein neues Unterverzeichnis, um unsere Manifeste noch besser zu organisieren. Erstellen Sie ein Verzeichnis namens manifests
und navigieren Sie hinein:
mkdir -p manifests
cd manifests
Nun erstellen wir ein Manifest für eine einfache Webanwendung, das sowohl ein Deployment als auch einen Service in einer einzigen Datei enthält. Erstellen Sie eine neue Datei namens web-app.yaml
mit nano
:
nano web-app.yaml
Fügen Sie den folgenden Inhalt zu web-app.yaml
hinzu:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
type: ClusterIP
ports:
- port: 80
targetPort: 80
Dieses Manifest definiert zwei Kubernetes-Ressourcen in einer einzigen Datei, getrennt durch ---
. Dies ist eine übliche Methode, um verwandte Ressourcen zusammenzufassen. Lassen Sie uns die Neuerungen aufschlüsseln:
- Mehrere Ressourcen in einer Datei: Die Datei
web-app.yaml
enthält jetzt zwei separate Kubernetes-Ressourcendefinitionen: ein Deployment und einen Service. Das Trennzeichen ---
wird verwendet, um sie voneinander zu unterscheiden.
kind: Service
: Dies definiert eine Service-Ressource.
spec.selector.app: web
: Dieser Service wird auf Pods abzielen, die das Label app: web
haben. Dies stimmt mit den Labels überein, die wir für die von der web-app
-Deployment erstellten Pods festgelegt haben.
spec.type: ClusterIP
: Gibt den Service-Typ als ClusterIP
an. Dies bedeutet, dass der Service über eine interne IP-Adresse innerhalb des Clusters verfügbar gemacht wird und normalerweise für die Kommunikation zwischen Services innerhalb des Clusters verwendet wird.
spec.ports
: Definiert, wie der Service Ports auf die Ziel-Pods abbildet.
port: 80
: Der Port am Service selbst, auf den Sie zugreifen werden.
targetPort: 80
: Der Port auf den Ziel-Pods, an den der Service den Datenverkehr weiterleiten wird.
Nun wenden wir dieses Manifest mit verschiedenen Methoden an.
Methode 1: Anwenden der gesamten Datei
Dies ist die häufigste Methode, um ein Manifest anzuwenden. Verwenden Sie kubectl apply -f
gefolgt vom Dateinamen:
kubectl apply -f web-app.yaml
Dieser Befehl wird sowohl das Deployment als auch den Service erstellen, die in web-app.yaml
definiert sind. Sie sollten eine Ausgabe wie die folgende sehen:
deployment.apps/web-app created
service/web-service created
Methode 2: Anwenden aus einem Verzeichnis
Sie können alle Manifeste in einem Verzeichnis auf einmal anwenden. Wenn Sie mehrere Manifestdateien im manifests
-Verzeichnis haben, können Sie sie alle anwenden, indem Sie das Verzeichnis anstelle einer bestimmten Datei angeben:
kubectl apply -f.
Der Punkt .
repräsentiert das aktuelle Verzeichnis. kubectl
sucht nach YAML-Dateien in diesem Verzeichnis und wendet sie alle an. Dies ist nützlich, wenn Sie Ihre Manifeste in mehrere Dateien innerhalb eines Verzeichnisses organisiert haben.
Methode 3: Anwenden von einer URL (Optional)
kubectl apply
kann auch Manifeste direkt von einer URL anwenden. Dies ist nützlich, um Beispielanwendungen oder Konfigurationen, die online gehostet werden, schnell bereitzustellen. Beispielsweise können Sie die Redis-Master-Deployment aus dem Kubernetes-Beispiel-Repository bereitstellen:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook/redis-master-deployment.yaml
Dies lädt das Manifest von der URL herunter und wendet es auf Ihren Cluster an. Hinweis: Seien Sie vorsichtig, wenn Sie Manifeste von nicht vertrauenswürdigen URLs anwenden, da sie möglicherweise Ihren Cluster ändern können.
Lassen Sie uns einige zusätzliche Optionen für kubectl apply
untersuchen.
Dry Run
Sie können die Option --dry-run=client
verwenden, um das Anwenden eines Manifests zu simulieren, ohne tatsächlich Änderungen am Cluster vorzunehmen. Dies ist nützlich, um zu überprüfen, ob Ihr Manifest gültig ist und um zu sehen, welche Ressourcen erstellt oder geändert würden:
kubectl apply -f web-app.yaml --dry-run=client
Dieser Befehl gibt aus, was erstellt oder geändert würde, aber er wendet die Änderungen nicht tatsächlich auf Ihren Cluster an.
Ausführliche Ausgabe
Für eine detailliertere Ausgabe von kubectl apply
können Sie die Option -v
gefolgt von einem Ausführlichkeitsgrad verwenden (z. B. -v=7
). Höhere Ausführlichkeitsgrade liefern detailliertere Informationen, was für das Debugging hilfreich sein kann:
kubectl apply -f web-app.yaml -v=7
Dies gibt viel mehr Informationen über die API-Anforderungen aus, die gestellt werden, und die Verarbeitung des Manifests.
Überprüfen Sie die Ressourcen, die durch das Anwenden von web-app.yaml
erstellt wurden. Verwenden Sie kubectl get deployments
und kubectl get services
, um die Deployments und Services in Ihrem Cluster aufzulisten:
## Auflisten der Deployments
kubectl get deployments
## Auflisten der Services
kubectl get services
## Beschreiben des Deployments, um mehr Details zu sehen
kubectl describe deployment web-app
Beispielausgabe für kubectl get deployments
:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 3m33s
redis-master 0/1 1 0 23s
web-app 2/2 2 2 42s
Beispielausgabe für kubectl get services
:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8m28s
web-service ClusterIP 10.106.220.33 <none> 80/TCP 46s
Beachten Sie, dass Sie jetzt ein web-app
-Deployment mit 2/2 READY
-Replikaten und einen web-service
vom Typ ClusterIP
haben.
Lassen Sie uns kurz über den Unterschied zwischen deklarativer und imperativer Verwaltung in Kubernetes sprechen, insbesondere im Zusammenhang mit kubectl apply
und kubectl create
.
kubectl apply
: Verwendet einen deklarativen Ansatz. Sie definieren den gewünschten Zustand in Ihren Manifestdateien, und kubectl apply
versucht, diesen Zustand zu erreichen. Wenn Sie kubectl apply
mehrmals mit demselben Manifest ausführen, wird Kubernetes nur Änderungen vornehmen, wenn es Unterschiede zwischen dem gewünschten Zustand im Manifest und dem aktuellen Zustand im Cluster gibt. kubectl apply
wird im Allgemeinen für die Verwaltung von Kubernetes-Ressourcen empfohlen, da es robuster und einfacher für die Verwaltung von Änderungen im Laufe der Zeit ist. Es verfolgt die Konfiguration Ihrer Ressourcen und ermöglicht inkrementelle Updates.
kubectl create
: Verwendet einen imperativen Ansatz. Sie geben Kubernetes direkt an, eine Ressource zu erstellen. Wenn Sie versuchen, kubectl create
für eine Ressource auszuführen, die bereits existiert, führt dies normalerweise zu einem Fehler. kubectl create
ist weniger flexibel für die Verwaltung von Updates und Änderungen im Vergleich zu kubectl apply
.
In den meisten Fällen, insbesondere für die Verwaltung von Anwendungsbereitstellungen, ist kubectl apply die bevorzugte und empfohlene Methode
aufgrund ihrer deklarativen Natur und der besseren Verwaltung von Updates und Konfigurationen.