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
do1.29.4
- zaktualizowano
MOLECULE
- użycie
alvistack
zamiastgeneric
Vagrant boxes
- użycie
25.0.1+1.28.8
- AKTUALIZACJA
- zaktualizowano
k8s_release
do1.28.8
- zaktualizowano
25.0.0+1.28.5
AKTUALIZACJA
- zaktualizowano
k8s_release
do1.28.5
- zaktualizowano
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
ansible-galaxy install githubixx.kubernetes_worker