Nachdem wir die Basis-Infrastruktur in Form von Hetzner Cloud-Servern provisioniert und konfiguriert haben, fehlt nun nur noch ein letzter Schritt zum laufenden Kubernetes-Cluster. Diesen Schritt dokumentiere ich mit diesem Blogpost.

Kubespray

Eine der vielen Möglichkeiten, ein Kubernetes-Cluster aufzusetzen, ist Kubespray. Kubespray setzt, wie ich bereits im Blogpost Konfiguration der Basis Infrastruktur angedeutet hatte, auf Ansible.

Dies ist auch der Hauptgrund, weshalb ich mich für Kubespray entschieden habe. Mit Ansible hatte ich bereits einige gute Erfahrungen gesammelt und mich deshalb früh entschieden, Ansible für das Basis-Setup zur Konfiguration der Basis Infrastruktur einzusetzen.

Inventories

Ansible verwendet für die Konfiguration sogenannte Inventories. Das Inventory für Kubespray haben wir im Blogpost Konfiguration der Basis Infrastruktur generiert. Im Wesentlichen wurde dazu der von Kubespray zur Verfügung gestellte Inventory-Builder genutzt.

Zusätzlich werden einige Konfigurationswerte geändert bzw. gesetzt. Dies betrifft z.B. den Wert von kubeconfig_localhost, der auf true gesetzt wird. Außerdem werden für Calico einige Parameter angepasst, damit calico mit Wireguard sauber läuft und der Wert für docker_version als Workaround für https://github.com/kubernetes-sigs/kubespray/issues/6160 auf 19.03 gesetzt.

Kubernetes provisionieren

Zunächst müssen per pip - falls notwendig - noch einige Tools installiert werden. Danach führen wir Ansible aus, um das Kubernetes-Cluster zu provisionieren.

  1. Weitere Voraussetzungen für Kubespray installieren
    sudo pip install -r ../kubespray/requirements.txt
    
  2. Ansible ausführen
    sudo ansible-playbook -i ../../clusters/<clustername>/ \
    inventories/kubespray/hosts.yml --user=ansible \ 
    --private-key=../../clusters/<clustername>/keys/node.key \ 
    --become ../kubespray/cluster.yml  -e \
    'ansible_python_interpreter=/usr/bin/python3'
    

Nach der Provisionierung

Wir haben nun ein Kubernetes-Cluster bereitgestellt. Um per kubectl darauf zuzugreifen, müssen wir noch die kubeconfig kopieren. Die kubeconfig enthält die Legitimation für den Zugriff auf das Cluster. Daher sollte auch sichergestellt werden, dass die Zugriffsberechtigungen entsprechend gesetzt sind. Aus Sicherheitsgründen werden wir uns ausschließlich per SSH-Tunnel mit dem Cluster verbinden. Daher müssen wir in der kubeconfig die IP-Adresse durch localhost ersetzen.

# Copy kubeconfig
sudo cp ../../clusters/nettista-prod/inventories/kubespray/artifacts/admin.conf ~/.kube/config
sudo chown <user>:<user> ~/.kube/config
sudo chmod 600 ~/.kube/config
sed -i "s/10.0.1.1/localhost/" ~/.kube/config

Die erste Verbindung

Für eine Verbindung zum Cluster ist ein SSH-Tunnel erforderlich. Wir bauen dazu einen Tunnel zu einem der Master-Server auf.

# Open ssh-tunnel to kubernetes master
ssh ansible@<external-master-ip> -i ../../clusters/<cluster-name>/keys/node.key -L6443:<external-master-ip>:6443

Nun können wir uns per kubectl zum Cluster verbinden.

kubectl get nodes

Es sollte eine Ausgabe ähnliche wie die folgende ausgeben werden:

NAME    STATUS   ROLES    AGE   VERSION
node1   Ready    master   1d   v1.16.7
node2   Ready    master   1d   v1.16.7
node3   Ready    <none>   1d   v1.16.7
node4   Ready    <none>   1d   v1.16.7
node5   Ready    <none>   1d   v1.16.7

Unser Kubernetes-Cluster läuft nun. Aber bevor es wirklich verwendet werden kann, um darauf Anwendungen zu betreiben, müssen noch einige Voraussetzungen geschaffen werden.

Die nächsten Blogposts befassen sich damit, verschiedene Services aus dem Layer Infrastructure Services (siehe Blogpost Überblick) zu installieren und zu konfigurieren.