lablabs.rke2

RKE2 Ansible Role

Wersja roli Pobrania roli Akcje GitHub Licencja

Ta rola Ansible zainstaluje klaster Kubernetes RKE2 przy użyciu metody tarball.

Rola pozwala na zainstalowanie RKE2 w 3 trybach:

  • RKE2 w pojedynczym węźle

  • Klaster RKE2 z jednym węzłem serwera (Master) i jednym lub więcej węzłami agenta (Worker)

  • Klaster RKE2 z serwerem (Master) w trybie wysokiej dostępności (HA) i z zerem lub więcej węzłami agenta (Worker). W trybie HA powinno być nieparzysta liczba węzłów serwera (zalecane trzy), które będą uruchamiały etcd, API Kubernetes (adres VIP Keepalived lub Kube-VIP) oraz inne usługi kontrolne.


  • Dodatkowo możliwe jest zainstalowanie klastra RKE2 (wszystkie 3 tryby) w trybie Air-Gapped przy użyciu lokalnych artefaktów.

Możliwe jest zaktualizowanie RKE2 poprzez zmianę zmiennej rke2_version i ponowne uruchomienie playbooka z tą rolą. Podczas procesu aktualizacji usługa RKE2 na węzłach będzie restartowana jedna po drugiej. Rola Ansible sprawdzi, czy węzeł, na którym usługa została zrestartowana, jest w stanie Gotowym, i dopiero wtedy przejdzie do restartu usługi na innym węźle Kubernetes.

Wymagania

  • Ansible 2.10+

Testowane na

  • Rocky Linux 9
  • Ubuntu 24.04 LTS

Zmienne roli

To jest kopia defaults/main.yml

---
# Typ węzła - serwer lub agent
rke2_type: server

# Wdróż kontrolę w trybie HA
rke2_ha_mode: false

# Zainstaluj i skonfiguruj Keepalived na węzłach serwera
# Można wyłączyć, jeśli używasz wcześniej skonfigurowanego Load Balancera
rke2_ha_mode_keepalived: true

# Zainstaluj i skonfiguruj kube-vip LB oraz VIP dla klastra
# rke2_ha_mode_keepalived musi być fałsz
rke2_ha_mode_kubevip: false

# Adres IP API Kubernetes i rejestracja RKE2. Domyślny adres to IPv4 węzła serwera/Master.
# W trybie HA wybierz statyczny adres IP, który zostanie ustawiony jako VIP w keepalived.
# Lub jeśli keepalived jest wyłączony, użyj adresu IP swojego LB.
rke2_api_ip: "{{ hostvars[groups[rke2_servers_group_name].0]['ansible_default_ipv4']['address'] }}"

# opcjonalna opcja, aby RKE2 nasłuchiwał na prywatnym adresie IP na porcie 9345
# rke2_api_private_ip:

# opcjonalna opcja dla podsieci kubevip
# rke2_api_cidr: 24

# opcjonalna opcja dla kubevip
# rke2_interface: eth0
# opcjonalna opcja dla adresów IPv4/IPv6 do ogłoszenia dla węzła
# rke2_bind_address: "{{ hostvars[inventory_hostname]['ansible_' + rke2_interface]['ipv4']['address'] }}"

# Zasięg adresów IP dla load balancera kubevip
rke2_loadbalancer_ip_range: {}
#  range-global: 192.168.1.50-192.168.1.100
#  cidr-finance: 192.168.0.220/29,192.168.0.230/29

# Zainstaluj dostawcę chmury kubevip, jeśli rke2_ha_mode_kubevip jest prawdziwy
rke2_kubevip_cloud_provider_enable: true

# Włącz kube-vip, aby śledzić Usługi typu LoadBalancer
rke2_kubevip_svc_enable: true

# Określ, jaki obraz jest używany dla kontenera kube-vip
rke2_kubevip_image: ghcr.io/kube-vip/kube-vip:v0.6.4

# Określ, jaki obraz jest używany dla kontenera dostawcy chmury kube-vip
rke2_kubevip_cloud_provider_image: ghcr.io/kube-vip/kube-vip-cloud-provider:v0.0.4

# Włącz kube-vip IPVS load balancer do kontrolnej płaszczyzny
rke2_kubevip_ipvs_lb_enable: false
# Włącz zrównoważenie obciążenia warstwy 4 dla kontrolnej płaszczyzny przy użyciu modułu jądra IPVS
# Musi używać kube-vip w wersji 0.4.0 lub późniejszej

rke2_kubevip_service_election_enable: true
# Domyślnie tryb ARP zapewnia implementację HA dla VIP (twój adres IP usługi), który będzie odbierał ruch na liderze kube-vip.
# Aby to obejść, kube-vip wdrożył nową funkcję "wybór lidera na usługę",
# zamiast jednego węzła stającego się liderem dla wszystkich usług, odbywa się wybór spośród wszystkich instancji kube-vip, a lider z tego wyboru staje się posiadaczem danej usługi. Ostatecznie,
# oznacza to, że każda usługa teoretycznie może znaleźć się na innym węźle, co zapobiega wąskiemu gardłu w początkowym wdrożeniu.
# minimalna wersja kube-vip 0.5.0

# (Opcjonalne) Lista flag kube-vip
# Wszystkie flagi można znaleźć tutaj https://kube-vip.io/docs/installation/flags/
# rke2_kubevip_args: []
# - param: lb_enable
#   value: true
# - param: lb_port
#   value: 6443

# Port metryk Prometheusa dla kube-vip
rke2_kubevip_metrics_port: 2112

# Dodaj dodatkowe SAN-y w certyfikacie TLS API k8s
rke2_additional_sans: []

# Skonfiguruj domenę klastra
# rke2_cluster_domain: cluster.example.net

# Port docelowy serwera API
rke2_apiserver_dest_port: 6443

# Tainty węzłów serwera
rke2_server_node_taints: []
  # - 'CriticalAddonsOnly=true:NoExecute'

# Tainty węzłów agenta
rke2_agent_node_taints: []

# Pre-zgłoszony klucz

token, który inne węzły serwera lub agenta zarejestrują, łącząc się z klastrem
rke2_token: defaultSecret12345

# Wersja RKE2
rke2_version: v1.25.3+rke2r1

# URL do repozytorium RKE2
rke2_channel_url: https://update.rke2.io/v1-release/channels

# URL do skryptu instalacyjnego RKE2
# np. lustrzane odbicie ranchera w Chinach http://rancher-mirror.rancher.cn/rke2/install.sh
rke2_install_bash_url: https://get.rke2.io

# Lokalny katalog danych dla RKE2
rke2_data_path: /var/lib/rancher/rke2

# Domyślny URL do pobierania artefaktów
rke2_artifact_url: https://github.com/rancher/rke2/releases/download/

# Lokalna ścieżka do przechowywania artefaktów
rke2_artifact_path: /rke2/artifact

# Artefakty wymagane w trybie Airgap
rke2_artifact:
  - sha256sum-{{ rke2_architecture }}.txt
  - rke2.linux-{{ rke2_architecture }}.tar.gz
  - rke2-images.linux-{{ rke2_architecture }}.tar.zst

# Zmienienie strategii wdrożenia na instalację na podstawie lokalnych artefaktów
rke2_airgap_mode: false

# Typ implementacji Airgap - pobieranie, kopiowanie lub istnieje
# - 'download' pobierze artefakty na każdym węźle,
# - 'copy' przekaże lokalne pliki znajdujące się w 'rke2_artifact' do węzłów,
# - 'exists' zakłada, że pliki 'rke2_artifact' są już przechowywane w 'rke2_artifact_path'
rke2_airgap_implementation: download

# Lokalna ścieżka źródłowa, w której przechowywane są artefakty
rke2_airgap_copy_sourcepath: local_artifacts

# Tarball obrazy dla dodatkowych komponentów do skopiowania z rke2_airgap_copy_sourcepath do węzłów
# (Rozszerzenia plików w liście i na rzeczywistych plikach muszą być zachowane)
rke2_airgap_copy_additional_tarballs: []

# Ścieżka docelowa dla dodatkowych obrazów tarballi w trybie airgap (zobacz https://docs.rke2.io/install/airgap/#tarball-method)
rke2_tarball_images_path: "{{ rke2_data_path }}/agent/images"

# Architektura do pobrania, obecnie są wydania dla amd64 i s390x
rke2_architecture: amd64

# Katalog docelowy dla skryptu instalacyjnego RKE2
rke2_install_script_dir: /var/tmp

# Kanał RKE2
rke2_channel: stable

# Nie wdrażaj komponentów pakietowych i usuń wszelkie wdrożone komponenty
# Ważne pozycje: rke2-canal, rke2-coredns, rke2-ingress-nginx, rke2-metrics-server
rke2_disable:

# Opcja do wyłączenia kube-proxy
disable_kube_proxy: false

# Opcja do wyłączenia wbudowanego kontrolera chmury - głównie dla środowisk lokalnych
rke2_disable_cloud_controller: false

# Dostawca chmury do użycia dla klastra (aws, azure, gce, openstack, vsphere, external)
# dotyczy tylko, jeśli rke2_disable_cloud_controller jest fałsz
rke2_cloud_provider_name: "external"

# Ścieżka do niestandardowych manifestów wdrażanych podczas instalacji RKE2
# Możliwe jest użycie szablonowania Jinja2 w manifestach
rke2_custom_manifests:

# Ścieżka do statycznych podów wdrażanych podczas instalacji RKE2
rke2_static_pods:

# Skonfiguruj niestandardowy rejestr kontenerów
rke2_custom_registry_mirrors: []
  # - name:
  #   endpoint: {}
#   rewrite: '"^rancher/(.*)": "mirrorproject/rancher-images/$1"'

# Skonfiguruj niestandardowe dodatkowe ustawienia rejestru kontenerów
rke2_custom_registry_configs: []
#   - endpoint:
#     config:

# Ścieżka do szablonu pliku konfiguracyjnego rejestru kontenerów
rke2_custom_registry_path: templates/registries.yaml.j2

# Ścieżka do szablonu pliku konfiguracyjnego RKE2
rke2_config: templates/config.yaml.j2

# Źródłowy katalog migawki etcd
rke2_etcd_snapshot_source_dir: etcd_snapshots

# Nazwa pliku migawki etcd.
# Gdy nazwa pliku jest określona, etcd zostanie przywrócony podczas pierwszego uruchomienia Ansible.
# etcd zostanie przywrócony tylko podczas pierwszego uruchomienia, więc nawet jeśli pozostawisz określoną nazwę pliku,
# etcd pozostanie nietknięty podczas następnych uruchomień.
# Możesz użyć tego lub ustawić opcje w `rke2_etcd_snapshot_s3_options`
rke2_etcd_snapshot_file:

# Lokalizacja migawki etcd
rke2_etcd_snapshot_destination_dir: "{{ rke2_data_path }}/server/db/snapshots"

# Opcje migawki etcd w s3
# Ustaw te wszystkie wartości lub `rke2_etcd_snapshot_file` i `rke2_etcd_snapshot_source_dir`

# rke2_etcd_snapshot_s3_options:
  # s3_endpoint: "" # wymagane
  # access_key: "" # wymagane
  # secret_key: "" # wymagane
  # bucket: "" # wymagane.
  # snapshot_name: "" # wymagane.
  # skip_ssl_verify: false # opcjonalne
  # endpoint_ca: "" # opcjonalne. Można pominąć, jeśli używasz domyślnych ustawień
  # region: "" # opcjonalne - domyślnie us-east-1
  # folder: "" # opcjonalne - domyślnie na najwyższym poziomie wiadra
# Nadpisz domyślny snapshotter kontenerów
rke2_snapshooter: overlayfs

# Wdróż RKE2 z domyślnym CNI canal
rke2_cni: canal

# Waliduj konfigurację systemu względem wybranego benchmarku
# (Wspierana wartość to "cis-1.23" lub ewentualnie "cis-1.6", jeśli uruchamiasz RKE2 przed 1.25)
rke2_cis_profile: ""

# Pobierz plik konfiguracyjny Kubernetes do kontrolera Ansible
rke2_download_kubeconf: false

# Nazwa pliku konfiguracyjnego Kubernetes, który będzie pobrany do kontrolera Ansible
rke2_download_kubeconf_file_name: rke2.yaml

# Katalog docelowy, do którego plik konfiguracyjny Kubernetes zostanie pobrany do kontrolera Ansible
rke2_download_kubeconf_path: /tmp

# Domyślna nazwa grupy inwentarza Ansible dla klastra RKE2
rke2_cluster_group_name: k8s_cluster

# Domyślna nazwa grupy inwentarza Ansible dla serwerów RKE2
rke2_servers_group_name: masters

# Domyślna nazwa grupy inwentarza Ansible dla agentów RKE2
rke2_agents_group_name: workers

# (Opcjonalne) Lista flag serwera API Kubernetes
# Wszystkie flagi można znaleźć tutaj https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver
# rke2_kube_apiserver_args: []

# (Opcjonalne) Lista etykiet węzłów
# k8s_node_label: []

# (Opcjonalne) Dodatkowe opcje konfiguracyjne serwera RKE2
# Możesz znaleźć flagi tutaj https://docs.rke2.io/reference/server_config
# rke2_server_options:
#   - "option: value"
#   - "node-ip: {{ rke2_bind_address }}"  # np. (agent/networking) Adresy IPv4/IPv6 do ogłoszenia dla węzła

# (Opcjonalne) Dodatkowe opcje konfiguracyjne agenta RKE2
# Możesz znaleźć flagi tutaj https://docs.rke2.io/reference/linux_agent_config
# rke2_agent_options:
#   - "option: value"
#   - "node-ip: {{ rke2_bind_address }}"  # np. (agent/networking) Adresy IPv4/IPv6 do ogłoszenia dla węzła

# (Opcjonalne) Skonfiguruj proxy
# Wszystkie flagi można znaleźć tutaj https://docs.rke2.io/advanced#configuring-an-http-proxy
# rke2_environment_options: []
#   - "option=value"
#   - "HTTP_PROXY=http://your-proxy.example.com:8888"

# (Opcjonalne) Dostosuj domyślne argumenty kube-controller-manager
# Ta funkcjonalność umożliwia dodanie argumentu, jeśli nie jest obecny domyślnie lub zastąpienie go, jeśli już istnieje.
# rke2_kube_controller_manager_arg:
#   - "bind-address=0.0.0.0"

# (Opcjonalne) Dostosuj domyślne argumenty kube-scheduler
# Ta funkcjonalność umożliwia dodanie argumentu, jeśli nie jest obecny domyślnie lub zastąpienie go, jeśli już istnieje.
# rke2_kube_scheduler_arg:
#   - "bind-address=0.0.0.0"

# (Opcjonalne) Skonfiguruj nginx za pomocą HelmChartConfig: https://docs.rke2.io/networking/networking_services#nginx-ingress-controller
# rke2_ingress_nginx_values:
#   controller:
#     config:
#       use-forwarded-headers: "true"
rke2_ingress_nginx_values: {}

# Cordon, odprowadź węzeł, który jest modernizowany. Odczep węzeł, gdy RKE2 zostanie zaktualizowane
rke2_drain_node_during_upgrade: false

# Czekaj, aż wszystkie pody będą gotowe po restarcie usługi rke2 podczas rolling restart.
rke2_wait_for_all_pods_to_be_ready: false

# Włącz tryb debugowania (usługa rke2)
rke2_debug: false

# (Opcjonalne) Dostosuj domyślne argumenty kubelet
# rke2_kubelet_arg:
#   - "--system-reserved=cpu=100m,memory=100Mi"

# (Opcjonalne) Dostosuj domyślne argumenty kube-proxy
# rke2_kube_proxy_arg:
#   - "proxy-mode=ipvs"

# Wartość dla elementu konfiguracyjnego o nazwie węzła
rke2_node_name: "{{ inventory_hostname }}"

# sieć do użycia dla podów.. Domyślnie ustawione na '10.42.0.0/16'.
rke2_cluster_cidr:
  - 10.42.0.0/16

# sieć do użycia dla usług ClusterIP. Domyślnie ustawione na '10.43.0.0/16'.
rke2_service_cidr:
  - 10.43.0.0/16

Przykład pliku inwentarza

Ta rola polega na podziale węzłów na grupy inwentarza masters i workers. Węzły serwera/master RKE2 muszą należeć do grupy masters, a węzły agenta/worker muszą być członkami grupy workers. Obie grupy muszą być dziećmi grupy k8s_cluster.

[masters]
master-01 ansible_host=192.168.123.1 rke2_type=server
master-02 ansible_host=192.168.123.2 rke2_type=server
master-03 ansible_host=192.168.123.3 rke2_type=server

[workers]
worker-01 ansible_host=192.168.123.11 rke2_type=agent
worker-02 ansible_host=192.168.123.12 rke2_type=agent
worker-03 ansible_host=192.168.123.13 rke2_type=agent

[k8s_cluster:children]
masters
workers

Przykład playbooka

Ten playbook wdroży RKE2 na jednym węźle działającym jako serwer i agent.

- name: Wdróż RKE2
  hosts: node
  become: yes
  roles:
     - role: lablabs.rke2

Ten playbook wdroży RKE2 na klastrze z jednym węzłem serwera (master) i kilkoma węzłami agenta (worker).

- name: Wdróż RKE2
  hosts: all
  become: yes
  roles:
     - role: lablabs.rke2

Ten playbook wdroży RKE2 na klastrze z jednym serwerem (master) i kilkoma węzłami agenta (worker) w trybie air-gapped. Użyje Multus i Calico jako CNI.

- name: Wdróż RKE2
  hosts: all
  become: yes
  vars:
    rke2_airgap_mode: true
    rke2_airgap_implementation: download
    rke2_cni:
      - multus
      - calico
    rke2_artifact:
      - sha256sum-{{ rke2_architecture }}.txt
      - rke2.linux-{{ rke2_architecture }}.tar.gz
      - rke2-images.linux-{{ rke2_architecture }}.tar.zst
    rke2_airgap_copy_additional_tarballs:
      - rke2-images-multus.linux-{{ rke2_architecture }}
      - rke2-images-calico.linux-{{ rke2_architecture }}
  roles:
     - role: lablabs.rke2

Ten playbook wdroży RKE2 na klastrze z kontrolą serwera (master) w HA i kilkoma węzłami agenta (worker). Węzły serwera (master) będą miały tainty, więc obciążenie będzie rozłożone tylko na węzłach robotników (agentach). Rola zainstaluje również keepalived na węzłach kontrolnych i skonfiguruje adres VIP, pod którym API Kubernetes będzie dostępne. Pobrał również plik konfiguracyjny Kubernetes na lokalną maszynę.

- name: Wdróż RKE2
  hosts: all
  become: yes
  vars:
    rke2_ha_mode: true
    rke2_api_ip : 192.168.123.100
    rke2_download_kubeconf: true
    rke2_server_node_taints:
      - 'CriticalAddonsOnly=true:NoExecute'
  roles:
     - role: lablabs.rke2

Używanie oddzielnego tokena dla węzłów agenta

Zgodnie z dokumentacją konfiguracji serwera można zdefiniować token agenta, który będzie używany przez węzły agenta do połączenia się z klastrem, dając im mniej dostępu do klastra niż mają węzły serwera. Konieczne będą następujące modyfikacje w powyższej konfiguracji:

  • usuń rke2_token z globalnych zmiennych
  • dodaj do group_vars/masters.yml:
rke2_token: defaultSecret12345
rke2_agent_token: agentSecret54321
  • dodaj do group_vars/workers.yml:
rke2_token: agentSecret54321

Podczas gdy zmiana tokena serwera jest problematyczna, token agenta może być zmieniany w dowolnym momencie, o ile serwery i agenci mają tę samą wartość i usługi (rke2-server i rke2-agent, w odpowiednich przypadkach) zostały zrestartowane, aby upewnić się, że procesy używają nowej wartości.

Rozwiązywanie problemów

Playbook utknął podczas uruchamiania usługi RKE2 na agentach

Jeśli playbook zaczyna wieszać się na zadaniu Uruchom usługę RKE2 na pozostałych węzłach i następnie nie udaje się na zadaniu Czekaj na gotowość pozostałych węzłów, prawdopodobnie masz jakieś ograniczenia w sieci swoich węzłów.

Proszę sprawdzić wymagane Reguły przychodzące dla węzłów serwera RKE2 pod poniższym linkiem: https://docs.rke2.io/install/requirements/#networking.

Licencja

MIT

Informacje o autorze

Stworzono w 2021 roku przez Labyrinth Labs

O projekcie

This Ansible Role will deploy Rancher RKE2 Kubernetes

Zainstaluj
ansible-galaxy install lablabs.rke2
Licencja
mit
Pobrania
776.7k
Właściciel