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 auf 1.29.4
  • MOLECULE

    • Verwende alvistack anstelle von generic Vagrant-Boxen

25.0.1+1.28.8

  • AKTUALISIERUNG
    • Update k8s_release auf 1.28.8

25.0.0+1.28.5

  • AKTUALISIERUNG

    • Update k8s_release auf 1.28.5
  • 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 mit ansible-galaxy role install -r requirements.yml (Ändere die version 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

http://www.tauceti.blog

Über das Projekt

Installs Kubernetes worker.

Installieren
ansible-galaxy install githubixx.kubernetes_worker
Lizenz
gpl-3.0
Downloads
1.6k
Besitzer
Senior System Engineer - Python, Go, Cloud, Kubernetes, Commodore, Retro, 80's ;-)