Kubernetes-Cluster erzeugen
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.
- Weitere Voraussetzungen für Kubespray installieren
sudo pip install -r ../kubespray/requirements.txt
- 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.