githubixx.kubernetes_worker

ansible-role-kubernetes-worker

Ta rola Ansible jest używana w Kubernetes the not so hard way with Ansible - Worker. Ta rola Ansible konfiguruje węzły robocze Kubernetes. Aby uzyskać więcej informacji, zapraszam do zapoznania się z Kubernetes the not so hard way with Ansible - Worker.

Wersje

Oznaczam każdy wydanie i staram się stosować semantic versioning. Jeśli chcesz użyć tej roli, zalecam korzystanie z najnowszej wersji. Gałąź master to w zasadzie rozwój, podczas gdy znaczniki oznaczają stabilne wydania. Znak 24.0.0+1.27.8 oznacza, że jest to wydanie 24.0.0 tej roli i jest przeznaczone do użycia z wersją Kubernetes 1.27.8 (powinno działać z każdą wersją K8s 1.27.x, oczywiście). Jeśli rola zmienia się, X.Y.Z przed + się zwiększy. Jeśli zmieni się wersja Kubernetes, X.Y.Z po + też się zwiększy. To pozwala na oznaczanie poprawek błędów i nowych wersji głównych roli, podczas gdy jest ona nadal rozwijana dla konkretnej wersji Kubernetes. To jest szczególnie przydatne w przypadku głównych wydań Kubernetes z wprowadzającymi zmiany.

Wymagania

Ten playbook zakłada, że już wdrożono komponenty kontrolera Kubernetes (zobacz kubernetes-controller oraz Kubernetes the not so hard way with Ansible - Control plane.

Musisz również zainstalować containerd, CNI plugins oraz runc. Aby umożliwić Pods w Kubernetes komunikację między różnymi hostami, sensowne jest zainstalowanie Cilium później, gdy węzły robocze będą działać. Oczywiście Calico, WeaveNet, kube-router lub flannel lub inne rozwiązania sieciowe Kubernetes są również opcjami.

Obsługiwane systemy operacyjne

  • Ubuntu 20.04 (Focal Fossa)
  • Ubuntu 22.04 (Jammy Jellyfish)

Zmiany

Historia zmian:

Zobacz pełny CHANGELOG.md

WAŻNE Wersja 24.0.0+1.27.8 miała wiele potencjalnych zmian, które mogą powodować problemy. Dlatego jeśli aktualizujesz z wersji < 24.0.0+1.27.8, proszę zapoznaj się z CHANGELOG tej wersji!

Ostatnie zmiany:

26.0.0+1.29.4

  • AKTUALIZACJA

    • zaktualizowano k8s_release do 1.29.4
  • MOLECULE

    • użycie alvistack zamiast generic Vagrant boxes

25.0.1+1.28.8

  • AKTUALIZACJA
    • zaktualizowano k8s_release do 1.28.8

25.0.0+1.28.5

  • AKTUALIZACJA

    • zaktualizowano k8s_release do 1.28.5
  • INNE ZMIANY

    • dostosowano akcję Github ze względu na zmiany w Ansible Galaxy
    • .yamllint: zwiększono maksymalną długość linii z 200 do 300
  • MOLECULE

    • zmiana na Ubuntu 22.04 dla VM testowych
    • zmiana adresów IP
    • dostosowanie nazw certyfikatów / zmiana algorytmu na ecdsa i rozmiaru algorytmu
    • usunięcie `collections.yml"

Instalacja

  • Bezpośrednio pobierz z Github (zmień katalog na rolę Ansible przed klonowaniem. Możesz znaleźć ścieżkę do roli, używając polecenia ansible-config dump | grep DEFAULT_ROLES_PATH): git clone https://github.com/githubixx/ansible-role-kubernetes-worker.git githubixx.kubernetes_worker

  • Poprzez polecenie ansible-galaxy i bezpośrednio pobierz z Ansible Galaxy: ansible-galaxy install role githubixx.kubernetes_worker

  • Stwórz plik requirements.yml z następującą zawartością (to pobierze rolę z Github) i zainstaluj za pomocą ansible-galaxy role install -r requirements.yml (zmień version, jeśli to konieczne):

---
roles:
  - name: githubixx.kubernetes_worker
    src: https://github.com/githubixx/ansible-role-kubernetes-worker.git
    version: 26.0.0+1.29.4

Zmienne roli

# Katalog główny dla konfiguracji Kubernetes i plików certyfikatów
# związanych ze wszystkimi węzłami roboczymi. Po zakończeniu playbooka
# ten katalog zawiera różne podfoldery.
k8s_worker_conf_dir: "/etc/kubernetes/worker"

# Wszystkie pliki certyfikatów (związane z Infrastrukturą Kluczy Prywatnych),
# określone w "k8s_worker_certificates" (patrz "vars/main.yml"),
# będą przechowywane tutaj.
# Właścicielem i grupą tego nowego katalogu będzie "root". Uprawnienia plików
# będą wynosić "0640".
k8s_worker_pki_dir: "{{ k8s_worker_conf_dir }}/pki"

# Katalog do przechowywania binarek Kubernetes (zobacz zmienną "k8s_worker_binaries"
# w "vars/main.yml"). Właścicielem i grupą tego nowego katalogu
# będzie "root". Uprawnienia dla tego katalogu będą wynosić "0755".
#
# UWAGA: Domyślny katalog "/usr/local/bin" zazwyczaj już istnieje w każdej
# instalacji systemu Linux z wymienionymi właścicielem, grupą i uprawnieniami. Jeśli
# twoje aktualne ustawienia się różnią, rozważ użycie innego katalogu. Upewnij się,
# że nowy katalog jest również uwzględniony w wartości zmiennej "$PATH".
k8s_worker_bin_dir: "/usr/local/bin"

# Wydanie K8s
k8s_worker_release: "1.29.4"

# Interfejs, na którym usługi Kubernetes powinny nasłuchiwać. Ponieważ cała 
# komunikacja w klastrze powinna korzystać z interfejsu VPN, nazwa interfejsu
# zwykle to "wg0" (WireGuard), "peervpn0" (PeerVPN) lub "tap0".
#
# Interfejs sieciowy, na którym usługi robocze Kubernetes powinny
# nasłuchiwać. To:
#
# - kube-proxy
# - kubelet
#
k8s_interface: "eth0"

# Katalog, z którego kopiowane będą certyfikaty K8s. Domyślnie
# rozszerzy się do lokalnego $HOME użytkownika (użytkownika, który uruchamia "ansible-playbook ...")
# plus "/k8s/certs". Oznacza to, że jeśli katalog $HOME użytkownika to e.g.
# "/home/da_user", to "k8s_ca_conf_directory" przyjmie wartość
# "/home/da_user/k8s/certs".
k8s_ca_conf_directory: "{{ '~/k8s/certs' | expanduser }}"

# Adres IP lub nazwa hosta punktu końcowego API Kubernetes. Zmienna ta
# jest używana przez "kube-proxy" i "kubelet" do połączenia się z "kube-apiserver"
# (serwerem API Kubernetes).
#
# Domyślnie pierwszy host w grupie Ansible "k8s_controller" jest
# określony tutaj. UWAGA: To ustawienie nie jest odporne na błędy! Oznacza to,
# że jeśli pierwszy host w grupie Ansible "k8s_controller" jest wyłączony,
# węzeł roboczy i jego ładunek będą nadal działać, ale węzeł
# roboczy nie odbierze żadnych aktualizacji z serwera API Kubernetes.
#
# Jeśli masz loadbalancer, który dystrybuuje ruch między wszystkimi
# serwerami API Kubernetes, powinien być tutaj określony (jego adres IP
# lub nazwa DNS). Musisz jednak upewnić się, że adres IP
# lub nazwa DNS, której chcesz użyć, są uwzględnione w certyfikacie TLS serwera API Kubernetes (zobacz "k8s_apiserver_cert_hosts"
# zmienna w https://github.com/githubixx/ansible-role-kubernetes-ca
# roli). Jeśli nie jest to określone, otrzymasz błędy certyfikatów w
# dziennikach wymienionych powyżej usług.
k8s_worker_api_endpoint_host: "{% set controller_host = groups['k8s_controller'][0] %}{{ hostvars[controller_host]['ansible_' + hostvars[controller_host]['k8s_interface']].ipv4.address }}"

# Jak powyżej, tylko dla portu. Określa, na którym porcie
# serwery API Kubernetes nasłuchują. Ponownie, jeśli jest na miejscu loadbalancer,
# który dystrybuuje żądania do serwerów API Kubernetes,
# umieść tutaj port loadbalancera.
k8s_worker_api_endpoint_port: "6443"

# Pakiety systemowe potrzebne na węźle roboczym Kubernetes. Możesz dodać dodatkowe
# pakiety w dowolnym momencie. Ale pamiętaj, że jeśli usuniesz jeden lub więcej z
# domyślnej listy, twój węzeł roboczy może nie działać zgodnie z oczekiwaniami lub w ogóle nie działać.
k8s_worker_os_packages:
  - ebtables
  - ethtool
  - ipset
  - conntrack
  - iptables
  - iptstate
  - netstat-nat
  - socat
  - netbase

# Katalog do przechowywania konfiguracji kubelet
k8s_worker_kubelet_conf_dir: "{{ k8s_worker_conf_dir }}/kubelet"

# Ustawienia kubelet
#
# Jeśli chcesz włączyć użycie "RuntimeDefault" jako domyślnego profilu seccomp
# dla wszystkich ładunków, dodaj te ustawienia do "k8s_worker_kubelet_settings":
#
# "seccomp-default": ""
#
# Zobacz także:
# 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"

# Katalog do przechowywania konfiguracji kube-proxy
k8s_worker_kubeproxy_conf_dir: "{{ k8s_worker_conf_dir }}/kube-proxy"

# Ustawienia kube-proxy
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"

Zależności

Przykład pliku playbook

- hosts: k8s_worker
  roles:
    - githubixx.kubernetes_worker

Testowanie

Ta rola ma mały setup testowy, który jest tworzony za pomocą Molecule, libvirt (vagrant-libvirt) i QEMU/KVM. Proszę zapoznać się z moim wpisem na blogu Testing Ansible roles with Molecule, libvirt (vagrant-libvirt) and QEMU/KVM jak skonfigurować. Konfiguracja testowa znajduje się tutaj.

Następnie można uruchomić Molecule. To skonfiguruje kilka maszyn wirtualnych (VM) z obsługiwanym systemem Ubuntu i zainstaluje klaster Kubernetes:

molecule converge

Na tym etapie klaster nie jest całkowicie funkcjonalny, ponieważ brakuje wtyczki sieciowej. Aby umożliwić komunikację między Podami na dwóch różnych węzłach, można użyć poniższego polecenia, aby zainstalować Cilium dla wszystkich potrzeb związanych z siecią Kubernetes i CoreDNS dla potrzeb związanych z DNS w Kubernetes:

molecule converge -- --extra-vars k8s_worker_setup_networking=install

Po tym masz zasadniczo w pełni funkcjonalny klaster Kubernetes.

Wbudowany jest również mały krok weryfikacji:

molecule verify

Aby sprzątnąć, uruchom

molecule destroy

Licencja

GNU GENERAL PUBLIC LICENSE Wersja 3

Informacje o autorze

http://www.tauceti.blog

O projekcie

Installs Kubernetes worker.

Zainstaluj
ansible-galaxy install githubixx.kubernetes_worker
Licencja
gpl-3.0
Pobrania
1.6k
Właściciel
Senior System Engineer - Python, Go, Cloud, Kubernetes, Commodore, Retro, 80's ;-)