githubixx.kubernetes_worker
ansible-role-kubernetes-worker
Diese Ansible-Rolle wird in Kubernetes the not so hard way with Ansible - Worker verwendet. Diese Ansible-Rolle richtet Kubernetes-Worker-Knoten ein. Für weitere Informationen siehe Kubernetes the not so hard way with Ansible - Worker.
Versionen
Ich versioniere jede Veröffentlichung und halte mich an semantische Versionierung. Wenn du die Rolle verwenden möchtest, empfehle ich, die neueste Version zu überprüfen. Der Hauptzweig ist im Prinzip Entwicklungszweig, während die Versionen stabile Releases kennzeichnen. Eine Version 24.0.0+1.27.8
bedeutet, dies ist das Release 24.0.0
dieser Rolle und es ist für Kubernetes-Version 1.27.8
gedacht (sollte aber auch mit jeder K8s 1.27.x Version funktionieren). Wenn sich die Rolle selbst ändert, wird der Teil X.Y.Z
vor dem +
erhöht. Ändert sich die Kubernetes-Version, wird X.Y.Z
nach dem +
ebenfalls erhöht. Das ermöglicht es, Fehlerbehebungen und neue Hauptversionen der Rolle zu kennzeichnen, während sie weiterhin für eine bestimmte Kubernetes-Version entwickelt wird. Das ist besonders nützlich für größere Kubernetes-Versionen mit brechenden Änderungen.
Voraussetzungen
Dieses Playbook setzt voraus, dass du bereits die Kubernetes-Controller-Komponenten (siehe kubernetes-controller und Kubernetes the not so hard way with Ansible - Control plane) installiert hast.
Du benötigst auch containerd, CNI-Plugins und runc installiert. Um Kubernetes-Pods die Kommunikation zwischen verschiedenen Hosts zu ermöglichen, ist es sinnvoll, später Cilium zu installieren, sobald die Worker-Knoten laufen. Natürlich sind auch Calico
, WeaveNet
, kube-router
oder flannel oder andere Kubernetes-Netzwerklösungen gültige Optionen.
Unterstützte Betriebssysteme
- Ubuntu 20.04 (Focal Fossa)
- Ubuntu 22.04 (Jammy Jellyfish)
Änderungsprotokoll
Änderungshistorie:
Siehe vollständige CHANGELOG.md
WICHTIG Version 24.0.0+1.27.8
hatte viele potenziell brechende Änderungen. Wenn du von einer Version < 24.0.0+1.27.8
aktualisierst, lies bitte auch das Änderungsprotokoll dieser Version!
Kürzliche Änderungen:
26.0.0+1.29.4
AKTUALISIERUNG
- Update
k8s_release
auf1.29.4
- Update
MOLECULE
- Verwende
alvistack
anstelle vongeneric
Vagrant-Boxen
- Verwende
25.0.1+1.28.8
- AKTUALISIERUNG
- Update
k8s_release
auf1.28.8
- Update
25.0.0+1.28.5
AKTUALISIERUNG
- Update
k8s_release
auf1.28.5
- Update
ANDERE ÄNDERUNGEN
- Github-Aktion anpassen wegen Änderungen in Ansible Galaxy
.yamllint
: maximale Zeilenlänge von 200 auf 300 erhöhen
MOLECULE
- Wechsel zu Ubuntu 22.04 für Test-VM
- IP-Adressen ändern
- Gemeinsame Namen für Zertifikate anpassen / Algorithmus auf ecdsa und Algorithmusgröße ändern
collections.yml
entfernen
Installation
Direkt von Github herunterladen (Wechsel in das Ansible-Rollenverzeichnis, bevor du klonst. Du kannst den Rollpfad mit dem Befehl
ansible-config dump | grep DEFAULT_ROLES_PATH
herausfinden):git clone https://github.com/githubixx/ansible-role-kubernetes-worker.git githubixx.kubernetes_worker
Über den
ansible-galaxy
-Befehl und direkt von Ansible Galaxy herunterladen:ansible-galaxy install role githubixx.kubernetes_worker
Erstelle eine Datei
requirements.yml
mit folgendem Inhalt (dies wird die Rolle von Github herunterladen) und installiere mitansible-galaxy role install -r requirements.yml
(Ändere dieversion
falls nötig):
---
roles:
- name: githubixx.kubernetes_worker
src: https://github.com/githubixx/ansible-role-kubernetes-worker.git
version: 26.0.0+1.29.4
Rollenvariablen
# Das Basisverzeichnis für Kubernetes-Konfigurations- und Zertifikatsdateien
# bezogen auf alle Worker-Knoten. Nach dem Abschluss des Playbooks enthält
# dieses Verzeichnis verschiedene Unterordner.
k8s_worker_conf_dir: "/etc/kubernetes/worker"
# Alle Zertifikatsdateien (IP-Zertifikat Infrastruktur bezogen) die in
# "k8s_worker_certificates" angegeben sind (siehe "vars/main.yml") werden hier
# gespeichert. Der Eigentümer und die Gruppe dieses neuen Verzeichnisses werden
# "root" sein. Dateiberechtigungen werden "0640" sein.
k8s_worker_pki_dir: "{{ k8s_worker_conf_dir }}/pki"
# Das Verzeichnis zum Speichern der Kubernetes-Binärdateien (siehe "k8s_worker_binaries"
# Variable in "vars/main.yml"). Der Eigentümer und die Gruppe dieses neuen Verzeichnisses
# sind in beiden Fällen "root". Berechtigungen für dieses Verzeichnis betragen "0755".
#
# HINWEIS: Das Standardverzeichnis "/usr/local/bin" existiert normalerweise bereits in jeder
# Linux-Installation mit dem erwähnten Eigentümer, der Gruppe und den Berechtigungen. Wenn
# deine aktuellen Einstellungen anders sind, erwäge ein anderes Verzeichnis. Stelle jedoch sicher,
# dass das neue Verzeichnis in deinem "$PATH"-Variablenwert enthalten ist.
k8s_worker_bin_dir: "/usr/local/bin"
# K8s-Release
k8s_worker_release: "1.29.4"
# Die Schnittstelle, auf der die Kubernetes-Dienste abhören sollen. Da
# alle Cluster-Kommunikation eine VPN-Schnittstelle verwenden sollte, ist
# der Schnittstellenname normalerweise "wg0" (WireGuard), "peervpn0" (PeerVPN) oder "tap0".
#
# Das Netzwerk, auf dem die Kubernetes-Worker-Dienste abhören sollen. Das sind:
#
# - kube-proxy
# - kubelet
#
k8s_interface: "eth0"
# Das Verzeichnis, von dem die K8s-Zertifikate kopiert werden sollen. Standardmäßig
# wird dies auf das lokale $HOME des Benutzers erweitert (der Benutzer, der "ansible-playbook ..."
# ausführt plus "/k8s/certs". Das bedeutet, wenn das $HOME-Verzeichnis des Benutzers z.B.
# "/home/da_user" ist, dann hat "k8s_ca_conf_directory" den Wert
# "/home/da_user/k8s/certs".
k8s_ca_conf_directory: "{{ '~/k8s/certs' | expanduser }}"
# Die IP-Adresse oder der Hostname des Kubernetes API-Endpunkts. Diese Variable
# wird von "kube-proxy" und "kubelet" verwendet, um eine Verbindung zum "kube-apiserver"
# (Kubernetes API-Server) herzustellen.
#
# Standardmäßig wird hier der erste Host in der Ansible-Gruppe "k8s_controller" angegeben.
# HINWEIS: Diese Einstellung ist nicht fehlertolerant! Das bedeutet,
# wenn der erste Host in der Ansible-Gruppe "k8s_controller" ausgefallen ist,
# funktioniert der Worker-Knoten und seine Arbeitslast weiter, aber der Worker
# Knoten erhält keine Updates mehr vom Kubernetes API-Server.
#
# Falls du einen Lastenausgleich hast, der den Verkehr zwischen allen
# Kubernetes API-Servern verteilt, sollte hier entweder die IP-Adresse
# oder der DNS-Name angegeben werden. Du musst jedoch sicherstellen,
# dass die IP-Adresse oder der DNS-Name, die du hier verwenden möchtest,
# im TLS-Zertifikat des Kubernetes API-Servers enthalten sind
# (siehe "k8s_apiserver_cert_hosts" Variable von
# https://github.com/githubixx/ansible-role-kubernetes-ca
# Rolle). Wenn nicht spezifiziert, erhältst du Zertifikatfehler in den
# Protokollen der oben genannten Dienste.
k8s_worker_api_endpoint_host: "{% set controller_host = groups['k8s_controller'][0] %}{{ hostvars[controller_host]['ansible_' + hostvars[controller_host]['k8s_interface']].ipv4.address }}"
# Wie oben, nur für den Port. Er gibt an, auf welchem Port die
# Kubernetes API-Server abhören. Wiederum, falls ein Lastenausgleich
# vorhanden ist, der die Anfragen an die Kubernetes API-Server verteilt,
# gib den Port des Lastenausgleichs hier an.
k8s_worker_api_endpoint_port: "6443"
# OS-Pakete, die auf einem Kubernetes-Worker-Knoten benötigt werden. Du kannst jederzeit andere
# Pakete hinzufügen. Sei dir jedoch bewusst, dass, wenn du eines oder mehrere der Standardpakete
# entfernst, dein Worker-Knoten möglicherweise nicht wie erwartet funktioniert oder gar nicht funktioniert.
k8s_worker_os_packages:
- ebtables
- ethtool
- ipset
- conntrack
- iptables
- iptstate
- netstat-nat
- socat
- netbase
# Verzeichnis zum Speichern der kubelet-Konfiguration
k8s_worker_kubelet_conf_dir: "{{ k8s_worker_conf_dir }}/kubelet"
# kubelet-Einstellungen
#
# Wenn du die Verwendung von "RuntimeDefault" als das Standard-seccomp-Profil für alle Arbeitslasten aktivieren möchtest,
# füge diese Einstellungen zu "k8s_worker_kubelet_settings" hinzu:
#
# "seccomp-default": ""
#
# Siehe auch:
# https://kubernetes.io/docs/tutorials/security/seccomp/#enable-the-use-of-runtimedefault-as-the-default-seccomp-profile-for-all-workloads
k8s_worker_kubelet_settings:
"config": "{{ k8s_worker_kubelet_conf_dir }}/kubelet-config.yaml"
"node-ip": "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
"kubeconfig": "{{ k8s_worker_kubelet_conf_dir }}/kubeconfig"
# kubelet kubeconfig
k8s_worker_kubelet_conf_yaml: |
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}
authentication:
anonymous:
enabled: false
webhook:
enabled: true
x509:
clientCAFile: "{{ k8s_worker_pki_dir }}/ca-k8s-apiserver.pem"
authorization:
mode: Webhook
clusterDomain: "cluster.local"
clusterDNS:
- "10.32.0.254"
failSwapOn: true
healthzBindAddress: "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
healthzPort: 10248
runtimeRequestTimeout: "15m"
serializeImagePulls: false
tlsCertFile: "{{ k8s_worker_pki_dir }}/cert-{{ inventory_hostname }}.pem"
tlsPrivateKeyFile: "{{ k8s_worker_pki_dir }}/cert-{{ inventory_hostname }}-key.pem"
cgroupDriver: "systemd"
registerNode: true
containerRuntimeEndpoint: "unix:///run/containerd/containerd.sock"
# Verzeichnis zum Speichern der kube-proxy-Konfiguration
k8s_worker_kubeproxy_conf_dir: "{{ k8s_worker_conf_dir }}/kube-proxy"
# kube-proxy-Einstellungen
k8s_worker_kubeproxy_settings:
"config": "{{ k8s_worker_kubeproxy_conf_dir }}/kubeproxy-config.yaml"
k8s_worker_kubeproxy_conf_yaml: |
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}
clientConnection:
kubeconfig: "{{ k8s_worker_kubeproxy_conf_dir }}/kubeconfig"
healthzBindAddress: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}:10256
mode: "ipvs"
ipvs:
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 2s
iptables:
masqueradeAll: true
clusterCIDR: "10.200.0.0/16"
Abhängigkeiten
Beispiel-Playbook
- hosts: k8s_worker
roles:
- githubixx.kubernetes_worker
Test
Diese Rolle hat eine kleine Testkonfiguration, die mit Molecule, libvirt (vagrant-libvirt) und QEMU/KVM erstellt wird. Siehe meinen Blogbeitrag Testing Ansible roles with Molecule, libvirt (vagrant-libvirt) and QEMU/KVM wie man das einrichtet. Die Testkonfiguration ist hier.
Danach kann Molecule ausgeführt werden. Dies wird ein paar virtuelle Maschinen (VM) mit unterstütztem Ubuntu-Betriebssystem einrichten und ein Kubernetes-Cluster installieren:
molecule converge
Zu diesem Zeitpunkt ist der Cluster nicht voll funktionsfähig, da ein Netzwerk-Plugin fehlt. Zum Beispiel ist eine Kommunikation zwischen Pods auf zwei verschiedenen Knoten noch nicht möglich. Um dies zu beheben, kann der folgende Befehl verwendet werden, um Cilium für alle Kubernetes-Netzwerk-Anforderungen und CoreDNS für Kubernetes-DNS-Angelegenheiten zu installieren:
molecule converge -- --extra-vars k8s_worker_setup_networking=install
Danach hast du im Grunde ein voll funktionsfähiges Kubernetes-Cluster.
Ein kleiner Verifizierungsschritt ist ebenfalls enthalten:
molecule verify
Um aufzuräumen, führe aus:
molecule destroy
Lizenz
GNU GENERAL PUBLIC LICENSE Version 3
Autor Informationen
ansible-galaxy install githubixx.kubernetes_worker