Kubernetes oder kurz K8s - eine Open Source Engine von Google, um Docker Container in einem Cluster orchestrieren zu können. In diesem Beitrag möchte ich zeigen, wie ein kleines Cluster mit einem Master und drei Nodes unter Ubuntu Linux "von scratch" aufgebaut werden kann. Netzwerktechnisch wird Flannel benutzt.
Auf folgender Seite findet sich eine neuere Anleitung inkl. eines automatisierten Skripts: Kubernetes auf Ubuntu 20.04 installieren |
Vorbereitungen
Für die im Tutorial verwendeten 4 Nodes sind keine 4 physischen Server notwendig, ein Notebook mit VMWare Workstation oder Virtual Box ist für diesen Zweck völlig ausreichend. Das Tutorial setzt voraus, dass innerhalb der 4 virtuellen Maschinen (VMs) Ubuntu Linux (Server) installiert wurde.
VM 1: Kubernetes Master konfigurieren
In der ersten virtuellen Maschine wird der Kubernetes Master installiert. Für die Installation ist es erforderlich, die Auslagerungsdatei von Ubuntu zu deaktivieren, daher aus der Datei /etc/fstab zu entfernen. Anschließend wird Docker installiert, die Basis für unsere Containervirtualisierung.
# Paketquellen aktualisieren sudo apt-get update # Docker installieren sudo apt-get install -y docker.io # Docker beim Booten starten sudo systemctl enable docker.service
Es folgt der Download und die Installation von Kubernetes.
# Erforderliche Abhängigkeiten installieren sudo apt-get install -y curl apt-transport-https # Repository GPG Key installieren curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - # Kubernetes zu den Paketquellen hinzufügen echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/k8s.list # Paketquellen aktualisieren sudo apt-get update # Installation sudo apt-get install kubeadm kubelet kubernetes-cni
Nach der Installation wird das Kubernetes-Cluster initialisiert:
# Cluster initiieren sudo kubeadm init --skip-preflight-checks --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=192.168.1.13
Das 10.10.0.0/16 Netz ist der Netzbereich, aus welchem die PODs (bzw. Container) ihre IP Adressen beziehen. Hier kann auch ein anderer (privater) IP-Addressbereich verwendet werden. Die IP Adresse 192.168.1.13 muss durch die (externe) IP-Adresse der virtuellen Maschine ersetzt werden, meist des Interfaces eth0. War der Befehl erfolgreich, so erscheint folgende Ausgabe in der Konsole:
Your Kubernetes master has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of machines by running the following on each node as root: kubeadm join 192.168.1.13:6443 --token h79kn3.96hv8ie2ar43hgvn --discovery-token-ca-cert-hash sha256:deab8e8284e880e4fdae61b27b109f18a9365ebcdac44f69ffab4e85a4099b33
Relevant ist hierbei insbesondere die letzte Zeile - diese muss auf einem fremden Node eingegeben werden, um diesen zum gerade angelegten Cluster hinzuzufügen. Um das Cluster mit dem wichtigsten Kommandozeilentool kubectl administrieren zu können, müssen folgenden Befehle abgesetzt werden:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
Das Cluster ist nun bereit, Zeit für einen ersten Test:
kubectl version
Hat bisher alles funktioniert, sollte die Ausgabe identisch der Folgenden sein:
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.1", GitCommit:"d4ab47518836c750f9949b9e0d387f20fb92260b", GitTreeState:"clean", BuildDate:"2018-04-12T14:26:04Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.1", GitCommit:"d4ab47518836c750f9949b9e0d387f20fb92260b", GitTreeState:"clean", BuildDate:"2018-04-12T14:14:26Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
Im nächsten Schritten konfigurieren wir die nodeübergreifende Kommunikation mit Flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml
Kurzer Test:
kubectl get pods --namespace=kube-system | grep flannel
Die Ausgabe sollte ähnlich wie diese sein:
kube-flannel-ds-9xs5b 1/1 Running 11 1d
Weiterhin sollte jetzt auf dem Host ein flannell-Deamon als Prozess unter Ubuntu laufen.
In einem letzten Schritt installieren wir das Kubernetes Dashboard. Hierfür ist es notwendig, vorab ein TLS Schlüsselpaar zu generieren:
sudo apt-get install easy-rsa cd /usr/share/easy-rsa/ source ./vars sudo ./clean-all sudo ./build-ca sudo ./build-key dashboard
Das generierte Schlüsselpaar (dashboard.key und dashboard.crt) wird anschließend als Secret hinzugefügt:
kubectl create secret generic kubernetes-dashboard-certs --from-file=./keys -n kube-system
Anschließend wird das Dashboard installiert:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
Das Dashboard benötigt einige Berechtigungen, hier testweise Admin-Berechtigungen. Dazu erstellen wir eine Datei mit dem Namen db-permissions.yaml mit folgendem Inhalt:
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard labels: k8s-app: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kube-system
Die Berechtigungen werden mit folgendem Befehl übernommen:
kubectl create -f db-permissions.yaml
Um das Dashboard außerhalb der virtuellen Maschine erreichbar zu machen, muss der kubectl proxy aktiviert werden:
nohup kubectl proxy --address=0.0.0.0 --disable-filter=true &
Das Cluster ist nun eingerichtet. Das Dashboard ist unter folgender URL erreichbar:
http://<IP der VM>:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
Der Login-Bildschirm kann in der Testumgebung mit einem Klick auf "Skip" ignoriert werden.
Damit das Cluster beim Booten automatisch startet, muss der kubelet Service aktiviert werden:
sudo systemctl enable kubelet
Dies beendet die Einrichtung des Masters.
VM 2-n: Kubernetes Nodes konfigurieren
Auch bei einem Node muss zu erst die Auslagerungsdatei deaktiviert werden. Anschließend wird Docker installiert:
# Paketquellen aktualisieren sudo apt-get update # Docker installieren sudo apt-get install -y docker.io # Docker beim Booten starten sudo systemctl enable docker.service
Es folgt der Download und die Installation von Kubernetes.
# Erforderliche Abhängigkeiten installieren sudo apt-get install -y curl apt-transport-https # Repository GPG Key installieren curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - # Paketquelle hinzufügen echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/k8s.list # Paketquellen aktualisieren sudo apt-get update # Kubernetes installieren sudo apt-get install kubeadm kubelet kubernetes-cni
Nach der Installation wird der Node beim Master mit dem Befehl registriert, der bei der Erstellung des Clusters ausgegeben wurde:
# Node registrieren kubeadm join 192.168.1.13:6443 --token h79kn3.96hv8ie2ar43hgvn --discovery-token-ca-cert-hash sha256:deab8e8284e880e4fdae61b27b109f18a9365ebcdac44f69ffab4e85a4099b33
Abschließend wird auch hier der kubelet Service automatisch gestartet:
sudo systemctl enable kubelet
Nach kurzer Zeit kann das neue Cluster auf dem Master überprüft werden:
kubectl get nodes
Die Ausgabe sollte wie folgt aussehen:
NAME STATUS ROLES AGE VERSION master Ready master 7d v1.10.1 node1 Ready <none> 7d v1.10.1 node2 Ready <none> 5d v1.10.1 node3 Ready <none> 5d v1.10.1
Das Cluster steht - Zeit für den ersten Pod!
Quellen / Bildnachweis:
- Beitragsbild: © Alex - Fotolia.com
Hallo Martin,
danke für das Tutorial. Was muss ich machen wenn ich das Dashboard nach einem Neustart auch wieder automatisch starten möchte?
crontag @reboot ?
Das sollte automatisch passieren sobald dein Cluster gestartet wird – Wichtig hierbei ist, dass der kubelet Service automatisch gestartet wird:
ok, falsch ausgedrückt…:)
es öffentlich erreichbar machen möchte…also analog zu dem Befehl
nohup kubectl proxy –address=0.0.0.0 –disable-filter=true &
Hi Fabian, du kannst auch direkt über die Master API auf dein Dashboard zugreifen, damit brauchst du den Proxy nicht. Siehe:
Accessing the Dashboard UI