© Alex - Fotolia.com

Kubernetes Tutorial: Installation & Konfiguration eines Kubernetes Clusters

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.

Kubernetes Dashboard

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

4 Gedanken zu „Kubernetes Tutorial: Installation & Konfiguration eines Kubernetes Clusters“

  1. 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 ?

      1. 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 &

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert