This is an old revision of the document!
Table of Contents
Kubernetes
Was ist Kubernetes
Hier nur eine kurze und einfache Erklärung der einzelnen Punkte und Services
- Master → Master Node mit den Services API/etcd/Scheduler/Controller Manager
- API → API
- etcd → Datenbank
- Scheduler → Verteilt die Pods auf den Workern
- Controller Manager → Worker Management
- Worker Node → Worker Node auf denen die Pods laufen
- Pod → Ist quasi eine App. In einem Pod können mehrere Container sein
- Serivce → Service IP die gleich bliebt. Auch wenn ein Pod neugestartet wird
- External Server → Service IP (oft Node IP) für den externen Zugriff. Wird aber eher nur zum testen verwendet.
- Ingress → Ermöglich einen Zugriff via Domain und leitet den Traffic an das Service weiter.
- ConfigMap → Für Pods wie zB. App und DB zusammen. Sprich hier passiert via Mapping eine Netzwerkverbindung zwischen den beiden Pods
- Secret → Hier werden geheime Daten gespeichert. Wie zB Zugangsdaten für eine Datenbank.
Installation von Kubernetes
Die Installation von Kubernetes habe ich unter Ubuntu 20.04 durchgeführt.
OS Update
Das System sollte am aktuellen Stand sein
apt update apt dist-upgrade -y
Docker Runtime installieren
Auf allen Nodes: apt install -y docker.io systemctl enable docker.service --now systemctl status docker docker --version
Swap deaktivieren
Das System darf kein Swap haben. Sonst lässt sich kein Cluster erstellen.
Am besten man installiert das System schon ohne Swap. Hat man dies nicht gemacht und es gibt Swap dann kann man dies deaktivieren
Auf allen Nodes: swapoff -a vim /etc/fstab Swap auskommentieren
Ich hatte bei Ubuntu 20.04 nach einem Reboot oftmal trotzdem Swap gemountet. Daher habe ich die Partiton einfach überschrieben
dd if=/dev/zero of=/dev/sdX3 bs=1048576 count=10 oflag=direct status=progress
IP Forwarding aktivieren
Damit Traffic durch die Container geroutet werden kann
Auf alle Nodes: vim /etc/sysctl.conf net.ipv4.ip_forward = 1
Diese Stelle gibt es normal schon und muss nur auskommentiert werden
sysctl -p
User anlegen
Mit diesem User verwalten wir Kubernetes (User auf alle Nodes anlegen)
groupadd -g 8001 k8s useradd -u 8001 -g 8001 -G sudo -m -s /bin/bash k8s passwd k8s
Installation von Kubernetes via Google Repo
Wir verwenden hier ein Repo für Xenial (Ubuntu 16.04) da es kein neueres Repo gibt aktuell
Auf allen Nodes: apt install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main" apt update apt install -y kubelet kubeadm kubectl
Erstellen eines Clusters
Ab hier arbeiten wir als User k8s
Auf der Master Node: sudo kubeadm init mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
Hier bekommt man auch gleich den Befehl in die Shell wie man Worker zum Cluster Joint.
Falls man diesen später nicht mehr weiß kann man sich dies Infos dazu holen.
Nodes zum Cluster hinzufügen
Wenn man den Output für den Join Befehl hat dann diesen nehmen.
Auf den Worker:
sudo kubeadm join 192.168.88.121:6443 --token 78c4by.cs8u65dcvxxxxxxx \
--discovery-token-ca-cert-hash sha256:3818424273aac366a6faa5b4b417158227a497xxxxxxxxxxxxxxxxxx
Falls man diese nicht mehr hat kann man sich diesen wieder zusammen bauen
k8s@kube01:~$ kubeadm token create --print-join-command | grep join kubeadm join 192.168.88.121:6443 --token dfipcc.r7ntkgh0n9344c1a --discovery-token-ca-cert-hash sha256:3818424273aac366a6faa5b4b417158227a4972e2e44fcf1db114bfd6cc64496
Status auf dem Cluster Checken
kubectl get nodes
Cluster Netzwerk erstellen
Es gibt dafür einen ganzen Haufen Möglichkeiten
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Ich habe mich hier für Calico entschieden.
Auf dem Master kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
Nach 1-2 Minuten sollte der Status der Worker auf “Ready” gehen
Auf dem Master kubectl get nodes
Auch die Container sollten alle laufen
Auf dem Master kubectl get pods --all-namespaces
Bash autocompletion für Kubernetes
echo 'source <(kubectl completion bash)' >> ~/.bashrc source .bashrc
Starten eines Testcontainers
Auf dem Master: kubectl run --image=nginx nginx-server --port=80 kubectl expose pod nginx-server --port 80 --type=NodePort kubectl run http-web --image=httpd --port=80 kubectl expose pod http-web --name=http-service --port=80 --type=NodePort kubectl get pods -o wide
Storage Provider
Es gibt unter Kubernetes verschiedene Arten von Storage Provider und Klassen. Darauf gehe ich später ein.
PersistentVolume
Ein Persistent Volume ist ein lokaler Speicherbereich auf den Worker Nodes.
Dies kann auch ein NFS Share sein der auf den Workern gemountet ist.
Erstellen eines Persistent Volume
Yaml File erstellen
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 1G
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/nfs"
Danach kann die Storage Ressource angelegt werden.
k8s@kube01:~$ kubectl apply -f pv01.yaml persistentvolume/pv01 created k8s@kube01:~$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv01 1G RWO Retain Available manual 4m40s
Erstellen eines Persistent Volume Claim
Yaml File erstellen
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc01-nginx
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 300M
Danach kann der Claim angelegt werden
k8s@kube01:~$ kubectl apply -f pvc01-nginx.yaml persistentvolumeclaim/pvc01-nginx created k8s@kube01:~$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc01-nginx Bound pv01 1G RWO manual 29s
Deploy eines Pods
Jetzt kann ein Pod angelegt werden im PVC.
Dazu ein Manifest erstellen:
k8s@kube01:~$ cat nginx-demo01.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo01
spec:
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: pvc01-nginx
containers:
- name: nginx-demo01
image: nginx
ports:
- containerPort: 80
name: "nginx-http"
volumeMounts:
- mountPath: "/mnt/nfs"
name: task-pv-storage
Deploy vom Pod:
k8s@kube01:~$ kubectl apply -f nginx-demo01.yaml pod/nginx-demo01 created k8s@kube01:~$ k8s@kube01:~$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-demo01 1/1 Running 0 9s 172.16.197.198 kube02 <none> <none>
Serivce dafür anlegen
asdf asdf
CLI
Sammlung von CLI Befehlen
Cluster Befehle
kubectl version kubectl cluster-info
Node Befehle
kubectl describe nodes <podname> kubectl describe pods <podname>
Pod Befehle
kubectl get pods
kubectl get pods -o wide
kubectl get pods --all-namespaces
kubectl get pods --all-namespaces -o jsonpath="{..image}" | tr -s '[[:space:]]' '\n' | sort | uniq -c
kubectl describe pod/nginx-server -n default
kubectl describe pods nginx-server
kubectl exec nginx-server -- cat /etc/hostname
kubectl exec -ti nginx-server -- /bin/bash
kubectl logs nginx-server
kubectl logs nginx-server -f
Service Befehle
Service Befehle kubectl get service kubectl get service -o wide kubectl get service <service> kubectl delete service <service>
TODO: kubectl delete pv pv01 kubectl delete pvc pvc01-nginx
apt-get install yamllint
