Erstes Image deployen
Diese Anleitung führt Sie durch das Ausrollen einer ersten Anwendung in Ihrem Cluster – vom Deployment über die Veröffentlichung bis zur Prüfung.
Voraussetzungen
- Ein Cluster im Status Running
- Eine heruntergeladene Konfigurationsdatei und eine geprüfte Verbindung, siehe Mit dem Cluster verbinden
- Installiertes
kubectl
Prüfen Sie zunächst, ob die Verbindung steht:
kubectl get nodes
Alle Nodes sollten den Status Ready aufweisen.
1. Deployment anlegen
Ein Deployment beschreibt, welches Image in wie vielen Instanzen laufen soll. Legen Sie die Datei deployment.yaml an:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
labels:
app: web
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:stable
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
Wesentliche Angaben:
replicas– Anzahl der Instanzen. Zwei Replicas sorgen dafür, dass die Anwendung während Upgrades erreichbar bleibt.resources.requests– Ressourcen, die der Scheduler für die Platzierung reserviert.resources.limits– Obergrenze, die ein Container nicht überschreiten darf.readinessProbe– Stellt sicher, dass nur einsatzbereite Pods Datenverkehr erhalten.
Rollen Sie das Deployment aus:
kubectl apply -f deployment.yaml
2. Rollout prüfen
# Status des Rollouts
kubectl rollout status deployment web
# Laufende Pods
kubectl get pods -l app=web
Erwartete Ausgabe:
NAME READY STATUS RESTARTS AGE
web-6d4cf56db6-8xk2p 1/1 Running 0 30s
web-6d4cf56db6-tz9vn 1/1 Running 0 30s
Bleibt ein Pod in Pending oder ImagePullBackOff hängen, liefern die folgenden Befehle die Ursache:
kubectl describe pod <pod-name>
kubectl logs <pod-name>
3. Anwendung veröffentlichen
Ein Service macht die Pods unter einer stabilen Adresse erreichbar.
Services vom Typ LoadBalancer stehen derzeit nicht zur Verfügung – es ist kein Cloud Controller Manager eingerichtet, der externe Adressen vergibt. Ein solcher Service verbleibt dauerhaft bei EXTERNAL-IP: <pending>.
Verwenden Sie stattdessen NodePort für externen Zugriff oder kubectl port-forward für lokale Tests.
Variante A: NodePort für externen Zugriff
Ein Service vom Typ NodePort öffnet auf jedem Worker Node denselben Port. Die Anwendung ist dann über die IP-Adresse eines beliebigen Nodes erreichbar.
Legen Sie die Datei service.yaml an:
apiVersion: v1
kind: Service
metadata:
name: web
spec:
type: NodePort
selector:
app: web
ports:
- port: 80
targetPort: 80
nodePort: 30080
protocol: TCP
Anwenden:
kubectl apply -f service.yaml
Der gewählte Port muss im Bereich 30000–32767 liegen. Ohne die Angabe nodePort vergibt Kubernetes automatisch einen freien Port aus diesem Bereich.
Service und zugewiesenen Port prüfen:
kubectl get service web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web NodePort 10.43.12.180 <none> 80:30080/TCP 10s
Anschließend benötigen Sie die IP-Adresse eines Nodes:
kubectl get nodes -o wide
Rufen Sie die Anwendung über Node-IP und Port auf:
curl http://<node-ip>:30080
Die Node-IP-Adressen liegen im VPC-Netzwerk. Aus dem Internet ist die Anwendung damit nur erreichbar, wenn der Node über eine öffentliche Adresse verfügt und der Port in der Firewall freigegeben ist.
Da jeder Node denselben Port öffnet, entfällt bei einem Node-Ausfall dessen Adresse – ohne vorgeschalteten Lastverteiler müssen Sie das in Ihrer Client-Konfiguration oder im DNS berücksichtigen.
Variante B: port-forward für lokale Tests
Für einen schnellen Test genügt eine lokale Portweiterleitung. Der Service kann dafür vom Typ ClusterIP sein (Standard, wenn kein type angegeben ist):
kubectl port-forward service/web 8080:80
Die Anwendung ist danach unter http://localhost:8080 erreichbar. Die Weiterleitung besteht, solange der Befehl läuft.
4. Anwendung skalieren
kubectl scale deployment web --replicas=4
Damit die Replicas über verschiedene Nodes verteilt werden, ergänzen Sie topologySpreadConstraints – siehe Hochverfügbarkeit.
5. Aufräumen
Nicht mehr benötigte Testressourcen entfernen Sie mit:
kubectl delete -f service.yaml
kubectl delete -f deployment.yaml
Ein NodePort belegt den gewählten Port auf allen Worker Nodes. Löschen Sie nicht mehr benötigte Services, damit die Ports für andere Anwendungen frei werden.
Nächste Schritte
- Ingress Controller installieren – für den Betrieb mehrerer HTTP-Dienste hinter einer Adresse
- HTTPS aktivieren – für verschlüsselte Verbindungen
- Storage Features – Speicheroptionen und zustandsbehaftete Anwendungen
- Horizontal Pod Autoscaling – für lastabhängige Skalierung