Als ich mit meinen Experimenten begann, bot Hetzner nicht die Möglichkeit, private Netzwerke zu erzeugen. Jeder Hetzner-Server hat eine öffentliche IP-Adresse und steht damit im Internet. Somit stellte sich unmittelbar die Frage nach der Sicherheit. Das Thema spielt auf verschiedenen Ebenen eine Rolle.

Um die Kommunikation zwischen Master und Nodes abzusichern, entschied ich mich, Wireguard zu verwenden. Um die Zahl der möglichen Angriffsvektoren zu minimieren, werden per Uncomplicated Firewall (UFW) alle nicht explizit benötigten Ports geschlossen werden. Brute-force Attacken etc. werden per Fail2ban erschwert und schließlich wird der Zugang auf die Knoten über SSH-Public/Private-Key konfiguriert.


Ansible

Ansible dient der Konfiguration der Basisinfrastruktur. Die Konfiguration wird in einem GIT-Repository abgelegt. Ansible setzt außer der Notwendigkeit, sich per SSH auf den Zielhost verbinden zu können, keine weitere Installation von Software voraus.

Weitere Information zu ansible gibt es unter: https://www.ansible.com/resources/get-started


Diese oben beschriebenen Schritte habe ich mit Ansible automatisiert und zum Teil existierende Lösungen wiederverwendet. Das Script nettista-booststrap/nettista-dl-roles.sh klont bzw. aktualisiert einige Github-Repositories, die die folgenden Ansible-Roles enthalten:

Von persistenten Daten soll später auch ein Backup erzeugt werden. Dazu bietet sich beim vorgestellten Setup eine Hetzner Storage Box an. Bei meinem Setup genügt eine Storage Box BX 10, die ich über die (Weboberfläche)[https://robot.your-server.de/storage] angelegt habe. Ich habe mich entschieden, die Storage Box per webdav auf allen Knoten zu mounten. Es sind aber auch andere Optionen wie SAMBA/CIFS oder SSH denkbar.

# Download necessary Ansible roles
./nettista-dl-roles.sh

Da im nächsten Schritt auch das Ansible-Inventory für Kubespray erzeugt wird, muss bereits das Repository https://github.com/kubernetes-sigs/kubespray/ geklont werden.

# Cloning of the Kubespray repository
git clone https://github.com/kubernetes-sigs/kubespray.git ../kubespray
# Checkout a specific release-tag
git -C ../kubespray checkout v2.12.6

Kubespray

Kubespray ermöglicht nach eigener Aussage, dass automatisierte Aufsetzen eines für den Produktiveinsatz geeigneten Kubernetes-Clusters. Dazu nutzt Kubespray Ansible.


Bevor die Ansible Inventories erzeugt werden, muss ein HCLOUD Kontext erzeugt werden.

../../tools context create <clustername>

Das Kommando erwartet als interaktive Eingabe den API-Token des Hetzner-Cloud Projekts.

Nun werden die Ansible Inventories generiert. Dazu wird das Script nettista-gen-inv.sh ausgeführt.

Das Script erwartet sechs Parameter:

  1. <clustername> - Den Namen des Clusters
  2. <api-token> - Den im Blogpost Basis Infrastrukur erzeugen erzeugten Hetzner API-Token
  3. <backup-url>- Die webdav URL der Storage Box
  4. <backup-mount-location> - Mountpunkt für den Backupspeicher
  5. <backup-user> - Der Benutzer für den webdav-Zugriff
  6. <backup-password> - Das Passwort für den webdav-Zugriff
# Create ansible inventories
./nettista-gen-inv.sh \ 
--cluster-name <clustername> \ 
--token <api-token> \ 
--backup-url <backup-url> \ 
--backup-mount-location <backup-mount-location> \ 
--backup-user <backup-user> \ 
--backup-password backup-password>

Die Inventories für die Vorbereitung der Server und das Setup von Kubernetes per Kubespray sind nun zu finden unter ..\..\clusters\<clustername>\inventories\{bootstrap,kubespray}

Nun wird das Ansible Script ausgeführt, um die Server wie oben beschrieben vorzubereiten.

# Execute ansible-roles
sudo ansible-playbook \ 
-e 'host_key_checking=False' \ 
-e 'ansible_python_interpreter=/usr/bin/python3' \ 
-i \ 
../../clusters/<clustername>/inventories/bootstrap/hosts.ini \ 
--private-key=../../clusters/<clustername>/keys/node.key \ 
--user=root \ 
--become \ 
bootstrap.yml

Wir verfügen nun über fünf virtuelle Server mit dem Betriebsystem Ubuntu Server 18.04. Das Betriebssystem wurde einer grundlegenden Härtung unterzogen. Außerdem wurde mit Wireguard ein virtuelles privates Netz (VPN) zwischen den Servern aufgespannt.

Im nächsten Blog-Post steht dann, wie Kubernetes mit Kubespray installiert wird.