Kubernetes-Cluster mit Hilfe von Kubespray installieren

Dieser Blogbeitrag beinhaltet eine kurze Anleitung wie Sie ein Kubernetes-Cluster mit Hilfe von Kubespray installieren können.

In meinen Fall habe ich sowohl CentOS-VMs als auch Ubuntu als Basis für die Installation verwendet. Sie können selbstverständlich einen beliebigen unterstützten Linux Derivat einsetzten.

Vorbereitung:

Die Schritte, die als vorbereitende Schritte aufgeführt sind, sind nicht für jedes System zwingend erforderlich.

1 - Firewall deaktivieren

Der Kubernetes-Cluster verwendet verschiedene Ports für die Kommunikation zwischen Komponenten und Diensten. In einer Test-Umgebung ist eine vollständige Deaktivierung der Firewall die einfachste Methode um eine reibungslose Kommunikation zu ermöglichen.

1.2. Firewall Status abfragen:

sudo systemctl status firewalld

1.2. Firewall Dienst stopen:

sudo systemctl stop firewalld

1.3. Firewall deaktivieren:

sudo systemctl disable firewalld

2 - Hostname überprüfen

Passen Sie die Hostnamen des Servers entsprechend an, so dass jeder Server ein eigenen Name bekommen (keine localhost ). Mit dem nächsten Kommando kann der Hostname gesetzt werden.

sudo hostnamectl set-hostname Name-des-Hosts

001 set hostname

Der Server erhält als Ergebniss einen neuen Name und die /etc/hosts wird aktualisiert.

3 - Hosts-Datei anpassen

Dieser Punkt ist optional und dient in erster Linie der Kommunikationsüberprüfung, da der Wizard die Hosts-Datei automatisch anpassen wird.

Passen Sie die Hosts-Datei auf jedem Knoten an (Sie können auch einen DNS-Server für diesen Zweck verwenden). Die Hostnamen der Knoten sollen in IPs auflösbar sein.

sudo nano /etc/hosts

002 etc hosts

4 -  Swap Deaktivieren

Deaktivieren Sie die Swap-Option auf allen VMs. Eine detaillierte Anleitung finden Sie in diesem Blogbeitrag: Swap auf Linux dauerhaft deaktivieren

Bevor Sie die Swap-Option tatsächlich deaktivieren, können Sie den Speicherauslastungsgrad mit dem folgenden Komando  überprüfen:

free -h

Optionale Konfiguration:

Die weiteren Schritte können Sie entweder als sudo- oder root-User durchführen, wobei die Root-Rechte nur in einer Test-Umgebung unbedenklich sind und grundsätzlich nicht zu empfehlen sind.

Sie können bei der Nutzung des sudo-Users die lästige Passwort-Abfrage deaktivieren, in dem Sie die nano /etc/sudoers wie folgt anpassen / ergänzen:

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
anatoli  ALL=(ALL) NOPASSWD:ALL

005 Tanzu CE

anatoli – ist der Name meines sudo-Users

CentOS 8

Wenn Sie CentOS 8 verwenden möchten, müssen Sie entweder den calico-Netzwerk-Plugin durch einen anderen ersetzen oder die Einstellungen für Calico (k8s-net-calico.yml) anpassen:

calico_iptables_backend: "NFT" oder  calico_iptables_backend: "Auto"

Die Schritte 5 – 14 werden auf dem Ansible-Master bzw. Management VM durchgeführt.

5. Im weiteren Schritten generieren wir einen SSH-Schlüssel. Der SSH-Schlüssel wird auf einem Ansible-Master (in meinem Fall eine Admin-VM) generiert und auf alle Kubernetes-Nodes (Master und Worker) kopiert.

ssh-keygen -t rsa

003 ssh keygen

Bei einer SSH-Schlüssel Generierung werden Sie nach einer Passphrase gefragt, ob Sie diese erstellen wollen, ist Ihnen überlassen.

Kopieren Sie den generierten Schlüssel auf weiteren Knoten

ssh-copy-id 192.168.1.181

004 01 ssh copy

Sie können auch die alternative Schreibweise verwenden: ssh-copy-id Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!

Mit dem Kommando ssh 192.168.1.171 können Sie die Verbindung mit dem Ziel-System initiieren, um die Konfiguration zu verifizieren.

Mögliche Probleme in Ubuntu: Falls die Schlüssel-Übertragung nicht funktioniert und mit folgender Meldung abgebrochen wird: “/usr/bin/ssh-copy-id: ERROR: ssh: connect to host 192.168.1.181 port 22: Connection refused” installieren Sie die notwendigen Komponenten: openssh-server openssh-client

In diesem Blog-Beitrag finden Sie die Beschreibung einer weiteren möglichen Ursache für die Kommunikationsprobleme.

Wiederholen Sie die oberen Schritte für alle weiteren Knoten.

6 - Python-Komponenten installieren

Auf dem Ansible-Master werden noch die Python-Komponenten benötigt.

apt-get install python3-pip

Mit folgenden Befehlen können Sie überprüfen, ob die Installation korrekt war:

pip3 --version

7 - kubespray herunterladen

Klonen Sie das kubespray git Repository von Github.com auf die Ansible Master-VM.

git clone https://github.com/kubernetes-sigs/kubespray.git

Wenn die git-Komponente nicht auf dem System installiert ist, wird Ihnen angeboten die git-core-Version zu installieren.

8 – kubespray – Komponenten installieren

Installieren Sie die für Kubespray benötigten Komponenten. Wechseln Sie ins kubespray-Verzeichnis und installieren Sie die kubespray-Pakete. Diese sind in der Datei requirements.txt aufgelistet.

cd kubespray

Mit dem Kommando ansible --version erfahren Sie, ob die Version korrekt war.

9 - Inventory-Beispieldatei kopieren

Im weiteren Schritt wird die Inventory-Beispieldatei in den Ordner des aktuell angemeldeten Benutzers kopiert:

cp -rfp inventory/sample inventory/mycluster

10 – hosts.yml erzeugen

Mit unteren Schritten wird die Datei hosts.yml für Kubespray erstellt und vorbereitet. Die hosts-Datei ist anschließend in dem Ordner /home/Name-des-Users/kubespray/inventory/mycluster/ zu finden:

hosts yml

10.1. Es wird eine Variable „IPS“, die die IP-Adressen des zukünftigen Kubernetes-Clusters beinhaltet, erstellt. (für meinen Cluster benötige ich sechs IP-Adressen)

declare -a IPS=(192.168.1.171 192.168.1.172 192.168.1.173 192.168.1.174 192.168.1.175 192.168.1.176)

declare

10.2. Die Information aus der Variablen fließt in die Datei hosts.yml

CONFIG_FILE=inventory/mycluster/hosts.yml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

Bei Bedarf können Sie die Standard-Konfiguration anpassen.

Eine weitere Konfigurationsdatei, die oft angepasst wird, ist die k8s-cluster.yml. Die Datei ist in dem Ordner inventory/mycluster/group_vars/k8s_cluster/ zu finden.  In meinem Fall habe ich die Container Runtime docker durch containerd ersetzt.

012 container manager containerd

Weitere sinnvolle Einstellungen finden Sie in der Datei: inventory/mycluster/group_vars/all/all.yml

11 - Installation starten

Wir sind endlich so weit, dass das Ansible-Playbook ausgeführt werden kann.

ansible-playbook -i inventory/mycluster/hosts.yml --become cluster.yml

alternative Schreibweise:

ansible-playbook -i inventory/mycluster/hosts.yml cluster.yml -b -v --private-key=~/.ssh/private_key

Die untere Befehlskette hat bei mir eine Fehlermeldung (fatal: [node1]: FAILED! => {"msg": "Missing sudo password"}) verursacht, da die SSH-Anbindung der Knoten nicht per Root ssh-copy-id Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein! war (vermutlich).

ansible-playbook -i inventory/mycluster/hosts.yml --become --become-user=root cluster.yml diese Befehlskette ist wichtig, wenn Sie die Root-Rechte erlangen wollen.

Nach zirka 30 Minuten wird die Installation abgeschlossen.

12 - kubectl installieren

Nach einer erfolgreichen Installation werden wir auf der Admin-VM noch die kubectl-Komponenten installieren.

curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl

Die curl-Komponente muss ggf. installiert werden, falls diese nicht vorhanden ist.

13 – Konfiguration übertragen

13.1. In dem Ordner ~/kubespray befindet sich eine neue Datei namens kubectl. Die Rechte auf diese Datei müssen noch angepasst werden, bzw. um die Execute-Berechtigung ergänzt werden:

chmod +x kubectl

Weiterhin wird die Datei kubectl in den /usr/bin-Ordner kopiert:

sudo cp kubectl /usr/bin/

13.2.  Im nächsten Schritt wird die admin.conf-Datei von erstem Master auf die Admin-VM in den Ordner home/username/.kube kopiert. Dafür muss der Ordner noch erstellt werden.

mkdir .kube

13.3. Die schnellste Methode für die Erstellung der config-Datei wäre:

nano ~/.kube/config

Übertragen Sie die Inhalte der /etc/kubernetes/admin.conf (sudo cat admin.conf) vom Master-Node z.B. per Copy & Paste in die config-Datei.

Wichtig:  Überprüfen Sie die IP-Adresse des Masters bevor Sie die Datei abspeichern. Es kann vorkommen, dass da die Localhost-Adresse eingetragen ist:  https://127.0.0.1:6443

14 – Installation Check

Kubectl überprüfen:

kubectl version

Cluster überprüfen:

kubectl get nodes