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
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
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
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
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
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:
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)
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.
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