Kubernetes
- "Betriebssystem für cloudbasierte Applikationen"
- altgriechisch: "Steuermann"
- Open Source
- Hervorgegangen aus BORG und OMEGA (interne Google Tools)
Warum Kubernetes
- Vermeidung von Monolithen
- Verticals (Applikationen voneinander entkoppeln)
- Betrieb von containerbasierten Workloads
- Cloudbasierte Workloads lassen sich nicht von Hand betreiben
- klassische Ansätze nicht mehr möglich
Herausforderungen
- schnelleres Deployment
- gering Time-to_market
- mehr Automatisierung
- Rollbackmöglichkeit
- bessere Skaliebarkeit
- bessere Reaktionszeit
Cloud-Native-Applikationen
- Microservices
- besonders kleine unabhängiges Services
- Single-Purpose-Prinzip
- kommunizieren übers Netzwerk
- self-contained und einfach bereitzustellen
- versionierbar
- leichtgewichtige Einheit
Aufgaben von Kubernetes
- Orchestrator von Workloads in der Cloud
- Backend End System
- stellt Laufzeitumgebungen für Applikationen dar
- abstrahiert Umgebungen
- bildet Lebenszyklus von Applikationen ab
- skaliert und hält am Leben
- Versionierung und Upgrades
Nodes
- Ausführen von Workloads
- Virtuelle Maschine
- Bare Metal
- Nodearten
- Master Node
- Worker Node
Master Nodes
Aufgaben
- System Services bereitstellen
- Steuerung des Systems
Komponenten
- API Server (RESTful Service)
- Cotroller Manager
- Scheduler
- Control Panel(s)
- etcd-Datenbank
- kubectl
Woker Nodes (ehemals Minions)
Aufgaben
- Workloads ausführen
- Reagieren auf Änderungen am API Server
- neue Workloads und Updates bereistellen
- Rüchmeldung geben
Komponenten
- Kubelet
- Container Runtimes Interface (CRI)
- Kube Proxy
Applikationen
- bestehen aus Microservices
- werden in Container verpackt
- können in Kubernetes, Bare Metal oder VMs ausgeführt werden
- sind nicht direkt in Kubernetes bereitstellbar
Pods
- Wrapper um Container
- YAML als Manifest Datei
- deklarative Syntax
- kleinste atomare Deployment-Einheit
beispielhafte Pod-Spezifikation
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
Deployments
- Wrapper um einen oder mehrere Pods
- Definieren des gewünschten Zustands
- Anzahl Replicas
- Gesundheitsstrategir
- Rolling Updates
- Kubernetes wird den gewünschten Zustand herstellen
- wird auf einer oder mehreren Worker Nodes bereitgestellt
- sind Zustandslos (Pods bekommen neue ID bei Neustart)
DaemonSets
- Pods werden auf jeder Noder Node im Cluster ausgeführt
- Für Infrastrukturaufgaben geeignet
- Log-Collectoren
- Zustandsüberwachung
- neue Nodes führen Pods im Daemon-Set aus
- sind Zustandslos
StatefulSets
- zustandsgehaftete Komponenten
- Reihenfolge beim Start/Update kann garantiert werden
- ID können garantiert werden
- Storage/Speicher kann garantiert werden
Cronjobs
- Jobs werden nach bestimmten Zeitplan ausgeführt
- Jobs sind deterministisch
- Pods laufen für gewöhnlich dauerhaft
- parallele Ausführung
- Laufzeit kann limitiert werden
Labels
- Schlüssel/Wert-Paare
- Schlüssel nicht größer als 63 Zeichen
- Schlüssel müssen auf jedem Objekt eindeutig sein
- können zur Filterung/Selektion verwendet werden
Annotationen
- Schlüssel/Wert-Paare
- Werte können beliebig groß sein
- können NICHT zur Filterung/Selektion verwendet werden
- reine Meta-Information
# Lables
"metadata": {
"labels": {
"key1" : "value1",
"key2" : "value2"
}
}
# Metadata
"metadata": {
"annotations": {
"key1" : "value1",
"key2" : "value2"
}
}
Label Selektoren
- Auf Werte von Labels bzw. die Existenz von Labels kann selektiert werden
- Label-Selektoren: – wertbasierend – set-basierend
Wertbasierende Selektoren (Beispiel)
- werten auf Basis von Gleichheit oder Ungleichheit aus
apiVersion: v1 kind: Pod metadata: name: ... spec: [...] nodeSelector: accelerator: nvidia-tesla-p100
Set-Selektoren (Beispiel)
- werten auf Basis von Existenz und/oder einer Werteliste aus
- mögliche Operatoren: In, NotIn,
selector:
matchLabels:
component: nginx
matchExpressions:
- {key: tier, operator: In, values: [cache]}
- {key: environment, operator: NotIn, values: [dev]}
Services
kind: Service
apiVersion: v1
metadata:
name: prod-service
spec:
selector:
mode: prod
ports:
- protocol: TCP
port: 80
targetPort: 9376
Pods vs. Services
Pods
- Unit-of-Work
- skaliert, terminiert
- wird im Fehlerfall neu gestartet
- neue IP bei Neustart
- volatil
Services
- verbirgt ein Set an Pods
- eindeutige IP-Adresse
- Load-Balancer-Funktionalität
- unveränderliche IP
- stabil
Ingress
- spezielle Form eines Service
- erlaubt Zugriff per HTTP/HTTPS
- regelbasiert
- Load-Balancing
- SSL-Endpunkt
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: simple-fanout-example
spec:
rules:
- host: foo.bar.com
ttp:
paths:
- path: /foo
backend:
serviceName: service1
servicePort: 4200
- path: /bar
backend:
serviceName: service2
servicePort: 8080
Storage
Volumes
- auf Pod-Ebene definiert
- Lebenszyklus entspricht dem des Pods
- temporäre Daten
- werden in Container gemounted
- diverse Provider verfügbar
PersistentVolumes
- unabhängig von Pods definiert
- Lebenszyklus ist unabhängig von Pods
- persistente Daten
- werden in Container gemounted
- diverse Provider verfügbar
Volume definieren
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /data
Persistenter Speicher
aufwendiger zu definieren
- PersistentVolume (optional)
- StorageClass (optional)
- PersistentVolumeClaim
typische Use-Cases
- Datenbanken
- geteilter Speicher für Konfigurationen und persistente Daten
StorageClass definieren
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
mountOptions:
- debug
volumeBindingMode: Immediate
PersistentVolume definieren
kind: PersistentVolume
apiVersion: v1
metadata:
name: persistent-volume-definition
labels:
type: local
spec:
storageClassName: standard
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
PersistentVolumeClaim definieren
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: persistent-standard-claim
spec:
storageClassName: standard
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
PVC in Pod verwenden
kind: Pod
apiVersion: v1
metadata:
name: mypod
spec:
containers:
[...]
volumes:
- name: persistentVolume
persistentVolumeClaim:
claimName: persistent-standard-claim
Wo betreibt man Kubernetes?
- PaaS – Platform as a Service
- gehostete Lösung
Anbieter
- Azure
- AWS
Azure Kubernetes Service (AKS)
- gemanagte Lösung von Microsoft
- Master sind stets kostenlos
- Kosten für 4 Worker mit insgesamt 8 GB RAM, je 1 vCPUs und Default-HDDs: ca. 105 EUR/Monat
Amazon Elastic Container Service for Kubernetes (EKS)
- gemanagte Lösung von Amazon
- Master werden berechnet, EKS wird zusätzlich berechnet
- Kosten für 4 Worker mit insgesamt 8 GB RAM, je 1 vCPUs und Default-HDDs (t2.small): ca. 200 EUR/Monat
Google Kubernetes Engine (GKE)
- gemanagte Lösung von Google
- Master sind stets kostenlos
- Kosten für 3 Worker mit insgesamt 10,5 GB RAM, je 1 vCPUs und Default-HDDs (n1-standard-1): ca. 85 EUR/Monat
PaaS vs. selbst aufgesetzt/gehostet
PaaS
- Konfiguration wird übernommen
- Betrieb wird bis Oberkante Cluster übernommen
- schnelle Bereitstellung
- kein Installations-/Konfigurationsaufwand
- i.d.R. höhere laufende Kosten
Eigene Installation
- eigene Verantwortung für Installation
- eigene Verantwortung für Betrieb auf allen Ebenen
- Bereitstellung auf eigener Infrastruktur
- eigener Installations-/Konfigurationsaufwand
- i.d.R. niedrigere laufende Kosten
Weitere Lösungen/Testumgebungen
Kubernetes in Docker
- lokale Lösung als Teil von Docker
- fixe Kubernetes-Version
- einfaches Setup
- https://docs.docker.com/docker-for-windows/kubernetes/
Minikube
- lokale Lösung, selbst aufzusetzen
- Kubernetes-Version ist wählbar
- komplexeres Setup
- https://kubernetes.io/docs/tasks/tools/install-minikube/
Play with Kubernetes
- Kubernetes ohne Installation
- Testsetup
- läuft für vier Stunden
- https://play-with-k8s.com
kubeadm
Administrationstool für Kubernetes
Aufgaben:
- Aufsetzen von Clustern
- Update von Clustern
- Aufsetzen und Update von Worker-Nodes
Installation
- https://kubernetes.io/docs/setup/independent/install-kubeadm/
- nur Linux möglich
- keine automatische Installation von anderen Verwaltungs und Management-Tools
kubectl
Management-Tool für Kubernetes Wrapper um REST-API erlaubt Scripting und Versionierung
Typische Tasks
- Deployment und Upgrade von Workloads
- Anlegen von Kubernetes-Objekten
- Zugriff auf Informationen und Status
- Konfiguration und Installation von Komponenten
- Löschen von Komponenten
- scaling
Installation
- https://kubernetes.io/docs/tasks/tools/install-kubectl/
- Installer für verschiedene Linux-Flavors und Package-Manager
- Google Cloud SDK
- Windows PowerShell
- TLS-1.1-Verbindungen bei PowerShell akzeptieren:
- https://samaschke.de/2018/12/05/tipp-tls-1-1-verbindung-bei-powershellakzeptieren/
- curl
Play with Kubernetes
Cluster initialisieren
kubeadm init --apiserver-advertise-address $(hostname -i)
Nodes anzeigen
kubectl get nodes
internes Netzwerk anlegen
kubectl apply -n kube-system -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
Joinen der Worker Node
kubeadm join 192.168.0.18:6443 --token 7r768t.jl4v6kqri43tebm0 --discovery-token-ca-cert-hash sha256:f1aafb9cff7fdf43d41a8dddf18bca94edf3b2664cfeb8ada2e58133c701cc2e
Deployment durchführen
kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/nginx-app.yaml
Azure Kubernetes Service (AKS)
Requirements:
- Azure CLI: https://docs.microsoft.com/de-de/cli/azure/install-azure-cli?view=azure-cli-latest
- Azure Subscription
- Verknüpfung Subscription mit CLI per az login
Ressourcengruppe erstellen
az group create --name <Ressourcengruppe> --location <Standort>
Cluster erstellen
az aks create --resource-group <Ressourcengruppe> --name <Clustername> --node-count <Anzahl Worker>
--enable-addons monitoring --generate-ssh-keys [--node-vm-size <Art der VMs>]
kubectl installieren, falls noch nicht vorhanden
az aks install-cli
kubectl konfigurieren lassen
az aks get-credentials --resource-group <Ressourcengruppe> --name <CLUSTERNME>
Dashboard aufrufen
(ist standardmäßig installiert)
az aks browse --resource-group <Ressourcengruppe> --name <Clustername>
Anzahl Nodes anpassen
az aks scale --name <Clustername> --resource-group <Ressourcengruppe> --node-count <Anzahl Worker>
Cluster entfernen:
az aks delete --resource-group <Ressourcengruppe> --resource-name <Clustername>
Amazon Elastic Container Service for Kubernetes (EKS)
Requirements:
- AWS CLI: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html
- AWS Subscription
- EC2-Key-Pairs: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html
Cluster anlegen
EKS-Service-Rolle in AWS-Konsole erstellen:
- https://console.aws.amazon.com/iam
- Rollen-ARN notieren
Cluster VPC erstellen
- https://console.aws.amazon.com/cloudformation
- Subnet-IDs und Security-Group-IDs notieren
kubectl installieren, falls noch nicht vorhanden
aws-iam-authenticator for Amazon EKS installieren
EKS-Cluster anlegen
aws eks create-cluster --name <Name> --role-arn <Rollen-ARN> --resources-vpc-config subnetIds=<Subnet-IDs>,securityGroupIds=<Security-Group-IDs>
Cluster verbinden
Cluster-Status abfragen
aws eks describe-cluster --name <Name> --query cluster.status
kubectl konfigurieren
aws eks update-kubeconfig --name <Name>
Cluster-Status abfragen
kubectl get svc
Woker-Nodes anlegen
- https://console.aws.amazon.com/cloudformation/
- Cluster-Namen eingeben
- Security-Group-IDs angeben
- Node-Image-ID angeben
- EC2-KeyPair angeben
- NodeInstanceRole notieren
Worker-Nodes zum Cluster hinzufügen
ConfigurationMap-Datei herunterladen:
- https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2018-11-07/aws-auth-cm.yaml
- Platzhalter
durch NodeInstanceRole-Wert ersetzen
Zum Cluster übertragen
- kubectl apply -f aws-auth-cm.yaml
Dashboard installieren
(Dashboard ist nicht per default installiert)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
Dashboard aufrufen
Proxy starten
kubectl proxy
Dashboard aufrufen
Service Account anlegen
apiVersion: v1
kind: ServiceAccount
metadata:
name: eks-admin
namespace: kube-system
Cluster-Admin-Rolle verknüpfen
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: eks-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: eks-admin
namespace: kube-system
Token abrufen
Liste aller User-Objekte abrufen
kubectl get secret -n kube-system
Token für das eks-admin-Token-Objekt abrufen
kubectl describe secret <ID des Objekts> -n kube-system
Linux
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}')
Proxy starten
kubectl proxy
Dashboard aufrufen
- http://localhost:8001/api/v1/namespaces/kube-system/services/ https:kubernetes-dashboard:/proxy/ (Token eingeben)
Cluster löschen
- Alle Services mit öffentlicher IP entfernen
- AWS CloudFormation-Stack für Worker entfernen(https://console.aws.amazon.com/cloudformation/)
- EKS-Cluster entfernen (https://console.aws.amazon.com/eks/home#/clusters)
- VPC entfernen (https://console.aws.amazon.com/cloudformation)
Namensräume
- Vergleicbar mit Packages und Namespaces
- Abgrenzung von Applikationen und Zuständigkeiten
- bildet viruelle Cluster
vordefinierte Namensräume
- kube-public (allgemein)
- kube-system (nur intern [dns/dashboard])
- default
Namesraum definieren
apiVersion: v1
kind: Namespace
metadata:
name: development
labels:
"name": "dev"
kubectl create -f create-namespace.yaml (empfohlen)
kubectl create namespace <NAMESPACE>
Namesraum benutzen
kubectl get pods -n <NAMESPACE>
Namensraumconfig anzeigen
kubectl config view
Namensraumkontext definieren
kubectl config set-context <NAME> --namespace=<NAMESPACE> --cluster=<CLUSTERNAME> --user=<USER-ID>
Namensraumkontext aktivieren
kubectl config use-context <NAME>
Namesräume anzeigen
kubectl get namespaces
kubectl get namespaces --show-labels
Namensräume löschen
kubectl delete namespaces <NAME>
kubectl get namespaces --show-labels
Sicherheit
RBAC = Role Based Access Control
- seit Verion 1.8 verfügbar
- ab 1.9 ist die API damit gesichert
- einfaches und robustes Modell für Sicherheit
- an REST angelehnt
RBAC Verwendung
- User Accounts mit Rechten versehen
- Applikationen Zugriff auf API geben
Ressourcen
- bezeichnen API_endpunkte
- /api/v1
- /api/v1/batch/v1beta1/namespaces/{NAMESPACE}/cronjobs
- /api/v1/apps/v1/namespaces/{NAMESPACE}/deployments
API Groups
- core
- apps
- batch
- extensions
- autoscsaling
Verbs
- create
- get
- delete
- delete-collection
- update
- watch
- list
- patch
- exec
- impersonate
Rollen
Role
- auf Ebene eines Namespaces gültig
ClusterRole
- auf Clusterebene gültig
Standard-Clusterrollen
- cluster-admin
- admin
- edit
- view
Rollen abrufen
# Status anzeigen
kubectl describe clusterrole <NAME>
# YAML Definition
kubectl get clusterrole <NAME> -o yaml > <FILENAME>
Rollen anlegen oder ändern
- per kubectl möglich
- per YAML-Datei (empfohlen)
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: jenkins
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get","list","watch"]
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]
# Rolle anlegen
kubectl create -f <YAMLFILE> -n <NAMESPACE>
# Rolle anzeigen
kubectl describe roles -n <NAMESPACE>
Accounts
User Accounts
- menschliche Benutzer
- über externe Systeme authentifiziert
Service-Accounts
- für Services
- Token zur Authentifizierung
Service-Account anlegen
# Account anlegen
kubectl create -f <YAMLFILE> -n <NAMESPACE>
# Account anzeigen
kubectl describe serviceaccounts -n <NAMESPACE>
Verknüpfung Rolle und Subject
- Subject und Rolle sind alleine sinnlos
- Verknupfung ist notwendig
- RoleBindeing
- ClusterRoleBindung
- YAML Datei oder kubectl möglich
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name : NAME
namespace: NAMESPACE
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:aws-cloud-provider
subjects:
- kind: ServiceAccount
name: aws-cloud-provider
namespace: kube-system
Role-Binding anlegen
# Binding anlegen
kubectl create -f <YAMLFILE> -n <NAMESPACE>
# Binding anzeigen
kubectl describe rolebinding -n <NAMESPACE>
Role-Binding ändern
# im YAML File
kubectl applye -f <YAMLFILE> -n <NAMESPACE>
# mittels kubectl
kubectl edit <ART> <NAME> -n <NAMESPACE>
# Rolle anzeigen
kubectl describe role -n <NAMESPACE>
Role-Binding ändern
kubectl delete <ART> <NAME> -n <NAMESPACE>
kubectl delete role <ROLLE> -n <NAMESPACE>
kubectl delete rolebinding <ROLLE> -n <NAMESPACE>
kubectl delete serviceaccount <ROLLE> -n <NAMESPACE>
Applikationen bereitstellen
- Deployment repräsentiert Applikation
- besteht in der Regel aus einem oder mehreren Pods
- Pods == Container
- zustandlos
- kubectl oder per YAML möglich
Container-Image erzeugen
- wird für Pod zwingend benötigt
- Docker
- Dockerfile erstellen
- docker build
- docker tag
- docker push
Deployment
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:1.7.9
ports:
- containerPort: 80
# Deployment anlegen
kubectl create -f <YAMLFILE> -n <NAMESPACE>
# Deployment anzeigen
kubectl describe deployment -n <NAMESPACE>
kubectl get pods -n <NAMESPACE>
kubectl describe pod <PODNAME> -n <NAMESPACE>
Verbindung testen
kubectl exec -n <NAMESPACE> -it <PODNAME> -- /bin/bash
Deployment löschen
kubectl delete -f <YAMLFILE> -n <NAMESPACE>
kubectl delete deployment <NAME> -n <NAMESPACE>
kubectl get deployments -n <NAMESPACE>
Mysql-Deployment mit persistenten Speicher
kubectl create secret generic <NAME> --from-literal=password=<PASSWORD>
kubectl create secret generic mysql-pass --from-literal=password=start123
stratedy:
type: Recrreate
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretkeyRef:
name: mysql-pass
key: password
stratedy:
type: Recrreate
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretkeyRef:
name: mysql-pass
key: password
- im Anschluss muss noch ein Service bereitgestellt werden um auf die DB zugreifen zu können
Mysql/Wordpress Deployment
selector:
app: wordpress
tier: frontend
type: NodePort
kubectl get deployments
kubectl get services
Komponenten kombinieren
- YAML Dateien können mehrere Blöcke enthalten
- Blöcke werden duche "---" getrennt
- Reihenfolge ist egal
Ingress
- Services können lediglich Deployments verfügbar machen
- Ingress verfeinert dies für HTTP/HTTPS
- Pfade können auf verschiedene Services zeigen
- Interna können verborgen werden
- Load-Balancing, SSL Termination, Websockets möglich
Ingress-Arten
- Single Service Ingress
- Fanout (mehrere Services)
- Name-based virtual hosting
Ingress-Controller
- nginx
- haproxy
- istio
- traefik
--> https://nextcloud.z4k.de/index.php/s/c7MqqrQwK8Q6ymo
- Links:
- https://github.com/kubernetes/ingress-nginx/tree/master/deploy
- https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md
HELM und Tiller
- Verwaltung von Deployment kann anstrengend werden
- unterschiedliche Umgebungen
- unterschiedliche Konfigurationen
- Package-Manager Ansatz
- HELM (Client)
- Tiller (Server)
Aufsetzen HELM und Tiller
- Projectwebsite: helm.sh
- Entpacken und zum Pfad hinzufügen
- auf Testsystemen oder in privaten Netzwerken
- kein spezifischer Vorbereitungsschritt nötig
- auf abgesicherten Systemen
- Service Account anlegen und RoleBindung definieren (siehe Beispiel auf HELM Website)
Installation Tiller
helm init --service-account tiller
Applikationen mit HELM deployen
- HELM Charts können geteilt werden
helm update repo
helm search
helm install <CHARTNAME>
helm install stable/phpmyadmin --name phpmyadmin
helm list
helm delete <NAME>
helm rollback <NAME> <REVISION>
kubectl get deployments
kubectl get services
kubectl port-forward --namespace default svc/phpmyadmin 8080:80
Applikation betreiben/updaten
Update Strategien
Ramped
- neuer POD wird gestartet
- alter POD fährt herunter
keine Downtime
Recreate
- Alter Pod fährt herunter
- neuer Pod wird gestartet
Downtime vorhanden!
- Verwendung: z.B bei Datenbanken
Blue/Green
- neues Deployment wirde komplett erzeugt
- Umschaltung erfolgt über Load-Balancer auf einen Schlag
Canary
- wenige Instanzen erhalten neue Versionen
- LoadBalancer übernimmt Steuerung
Deployments updaten
# INLINE
kubectl set image deployment <NAME> <PODNAME>=<IMAGE>:<TAG> --record=true
# für Rollback nötig: --record=true
# per Editor
kubectl edit deployment <NAME>
Rollout Status ansehen
kubectl rollout status deployment <NAME>
kubectl get replicasets
History ansehen
kubectl rollout history deployment <NAME>
kubectl rollout history deployment <NAME> <REVISION>
Rollback
kubectl rollout undo deployment <NAME> --to-revision=<REVISION>
Scaling
- Deployment legt stets Pods und Replicas an
- ReplicaSet ist für die Anzahl von Pods zuständig
- Skalierung über YAML oder kubectl
spec:
replicas: 2
kubectl edit deployment <NAME>
kubectl get deployment <NAME>
kubectl scale deployment <NAME> --replicas=<ANZAHL>
kubectl get deployment <NAME>
Autoscaling
- Kuberntes unterstützt Autoscaling
- basiert auf CPU Auslastung der PODS
- Schwellwert für Skalierung kann festgelegt werden
kubectl autoscale deployment <NAME> --min=<MIN> --max=<MAX> --cpu-percent=<SCHWELLWERT>
Healthcheck
Liveness und Readiness-Checks
- Pods geben Auskunft
- Kubernetes reagiert
- verschiedene Mtehoden
- TCP
- SHELL
- HTTP
Readiness-Check
- POD wird nur eingebunden, wenn er Traffic akzeptieren kann
- POD wird neu gestartet, wenn er nicht verfügbar ist
Liveness-Check
- POD erhält nur Traffic wenn er fehlerfrei läuft
- POD wir neu gestartet, wenn Fehler auftreten
Probes
- werden im Xaml definiert
- readinessProbe
- livenssProbe
- beides optionale KOmponenten
- Verhalten kann angepasst werden
Beispiel Mysql
livenessProbe:
exec:
command: ["mysqladmin", "ping"]
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
readinessProbe:
exec:
# Check we can execute queries over TCP (skip-networking is off).
command: ["mysql", "-h", "127.0.0.1", "-e", "SELECT 1"]
initialDelaySeconds: 5
periodSeconds: 2
timeoutSeconds: 1
kubectl get pod liveness-http
kubectl get pod readyness-http
kubectl describe pod
Links
Allgemeines
Kubernetes Tutorial: Installation & Konfiguration eines Kubernetes Clusters https://itsecblog.de/kubernetes-tutorial-installation-konfiguration-eines-kubernetes-clusters/
CaaS | Container as a Service Anbieter im Vergleich - 1&1 IONOS https://www.ionos.de/digitalguide/server/knowhow/caas-container-as-a-service-anbieter-im-vergleich/
Kubernetes vs Docker Compose vs Docker Swarm 2019 Comparison of Container Tools | StackShare https://stackshare.io/stackups/docker-compose-vs-docker-swarm-vs-kubernetes
Kostenlose GCP-Stufe – großzügige kostenlose Testphasen und "Immer kostenlos"-Produkte | Google Cloud https://cloud.google.com/free/
AMAZON EKS
How to Deploy a Kubernetes Application with Amazon Elastic Container Service for Kubernetes | AWS https://aws.amazon.com/de/getting-started/projects/deploy-kubernetes-app-amazon-eks/
Erste Schritte mit Amazon EKS - Amazon EKS https://docs.aws.amazon.com/de_de/eks/latest/userguide/getting-started.html
Microsoft AKS
Tutorial zu Kubernetes in Azure: Bereitstellen eines Clusters | Microsoft Docs https://docs.microsoft.com/de-de/azure/aks/tutorial-kubernetes-deploy-cluster
Dokumentation für Azure Kubernetes Service (AKS) – Tutorials, API-Referenz | Microsoft Docs https://docs.microsoft.com/de-de/azure/aks/
Google GKE
Hello Node Kubernetes Codelab https://codelabs.developers.google.com/codelabs/cloud-hello-kubernetes/index.html?index=../..index#0
Compute Engine & Kubernetes (Container Engine) https://codelabs.developers.google.com/codelabs/cloud-compute-kubernetes/#0
Preise für die Google Compute Engine | Compute Engine-Dokumentation | Google Cloud https://cloud.google.com/compute/pricing?hl=de
Preise | Dokumentation zu Kubernetes Engine | Google Cloud https://cloud.google.com/kubernetes-engine/pricing
HELM
Installing Helm in Google Kubernetes Engine (GKE) – Google Cloud Platform - Community – Medium https://medium.com/google-cloud/installing-helm-in-google-kubernetes-engine-7f07f43c536e
charts/stable/percona-xtradb-cluster at master · helm/charts · GitHub https://github.com/helm/charts/tree/master/stable/percona-xtradb-cluster
GitHub - ypenglyn/solr-k8s: create solr on k8s with helm https://github.com/ypenglyn/solr-k8s
charts/stable/redis-ha at master · helm/charts · GitHub https://github.com/helm/charts/tree/master/stable/redis-ha
GitHub - hybris-jenkins-x-demo/setup-jx-cluster: How to setup your own GKE cluster for SAP (Hybris) Commerce + Jenkins-X and try it the full CI/CD pipeline https://github.com/hybris-jenkins-x-demo/setup-jx-cluster
Deployment
Die Werkzeugkiste #1: Helm – Kubernetes-Deployments richtig gemacht | heise Developer https://www.heise.de/developer/artikel/Die-Werkzeugkiste-1-Helm-Kubernetes-Deployments-richtig-gemacht-4219375.html
Kontinuierliches Deployment in Kubernetes Engine mit Jenkins | Lösungen | Google Cloud https://cloud.google.com/solutions/continuous-delivery-jenkins-kubernetes-engine?hl=de
Kubernetes Ugly Commands
List ImagePullBackOff Events and Test Path and Tags
Troubleshoot Unready CertManager Certificates
https://itnext.io/kubernetes-ugly-commands-troubleshoot-unready-certmanager-certificates-1d9c861a45c
Fetch Ingress Object Health in Namespace
https://itnext.io/kubernetes-ugly-commands-fetch-ingress-object-health-in-namespace-4d8e4f17145d
Check for RWO Persistent Volume Node Attachment Issues
Troubleshoot Pending Pods in a Namespace
https://itnext.io/kubernetes-ugly-commands-troubleshoot-pending-pods-in-namespace-c4b2273a1014