lablabs.rke2

RKE2 Rôle Ansible

Version du rôle Téléchargements du rôle Actions GitHub Licence

Ce rôle Ansible installera un cluster Kubernetes RKE2. RKE2 sera installé en utilisant la méthode tarball.

Le rôle peut installer RKE2 dans 3 modes :

  • RKE2 nœud unique

  • Cluster RKE2 avec un nœud Serveur (Maître) et un ou plusieurs nœuds Agent (Travailleur)

  • Cluster RKE2 avec Serveur (Maître) en mode Haute Disponibilité et zéro ou plusieurs nœuds Agent (Travailleur). En mode HA, vous devez avoir un nombre impair (trois recommandé) de nœuds Serveurs (Maître) qui exécuteront etcd, l'API Kubernetes (adresse VIP de Keepalived ou Kube-VIP), et d'autres services de contrôle.


  • De plus, il est possible d'installer le cluster RKE2 (tous les 3 modes) en mode Air-Gapped avec l'utilisation d'artefacts locaux.

Il est possible de mettre à jour RKE2 en changeant la variable rke2_version et en exécutant à nouveau le playbook avec ce rôle. Pendant le processus de mise à jour, le service RKE2 sur les nœuds sera redémarré un par un. Le rôle Ansible vérifiera si le nœud sur lequel le service a été redémarré est dans un état prêt avant de procéder au redémarrage du service sur un autre nœud Kubernetes.

Exigences

  • Ansible 2.10+

Testé sur

  • Rocky Linux 9
  • Ubuntu 24.04 LTS

Variables du rôle

Ceci est une copie de defaults/main.yml

---
# Le type de nœud - serveur ou agent
rke2_type: serveur

# Déployer le plan de contrôle en mode HA
rke2_ha_mode: faux

# Installer et configurer Keepalived sur les nœuds Serveur
# Peut être désactivé si vous utilisez un équilibreur de charge préconfiguré
rke2_ha_mode_keepalived: vrai

# Installer et configurer kube-vip LB et VIP pour le cluster
# rke2_ha_mode_keepalived doit être faux
rke2_ha_mode_kubevip: faux

# Adresse IP de l'API Kubernetes et de l'enregistrement RKE2. L'adresse par défaut est l'IPv4 du nœud Serveur/Maître.
# En mode HA, choisissez une IP statique qui sera définie comme VIP dans keepalived.
# Ou si keepalived est désactivé, utilisez l'adresse IP de votre LB.
rke2_api_ip: "{{ hostvars[groups[rke2_servers_group_name].0]['ansible_default_ipv4']['address'] }}"

# option facultative pour RKE2 Server d'écouter sur une adresse IP privée sur le port 9345
# rke2_api_private_ip:

# option facultative pour sous-réseau kubevip
# rke2_api_cidr: 24

# option facultative pour kubevip
# rke2_interface: eth0
# option facultative pour adresses IPv4/IPv6 à annoncer pour le nœud
# rke2_bind_address: "{{ hostvars[inventory_hostname]['ansible_' + rke2_interface]['ipv4']['address'] }}"

# Plage IP de l'équilibreur de charge kubevip
rke2_loadbalancer_ip_range: {}
#  plage-global: 192.168.1.50-192.168.1.100
#  cidr-finance: 192.168.0.220/29,192.168.0.230/29

# Installer le fournisseur de cloud kubevip si rke2_ha_mode_kubevip est vrai
rke2_kubevip_cloud_provider_enable: vrai

# Activer kube-vip pour surveiller les services de type LoadBalancer
rke2_kubevip_svc_enable: vrai

# Spécifier quelle image est utilisée pour le conteneur kube-vip
rke2_kubevip_image: ghcr.io/kube-vip/kube-vip:v0.6.4

# Spécifier quelle image est utilisée pour le conteneur fournisseur cloud kube-vip
rke2_kubevip_cloud_provider_image: ghcr.io/kube-vip/kube-vip-cloud-provider:v0.0.4

# Activer l'équilibreur de charge IPVS kube-vip pour le plan de contrôle
rke2_kubevip_ipvs_lb_enable: faux
# Activer l'équilibrage de charge de couche 4 pour le plan de contrôle utilisant le module noyau IPVS
# Doit utiliser kube-vip version 0.4.0 ou plus

rke2_kubevip_service_election_enable: vrai
# Par défaut, le mode ARP fournit une implémentation HA d'un VIP (votre adresse IP de service) qui recevra le trafic sur le leader kube-vip.
# Pour contourner cela, kube-vip a mis en œuvre une nouvelle fonction appelée "élection de leader par service",
# au lieu qu'un nœud devienne le leader pour tous les services, une élection a lieu entre toutes les instances kube-vip et le leader de cette élection devient le détenteur de ce service. En fin de compte,
# cela signifie que chaque service peut se retrouver sur un nœud différent lorsqu'il est créé théoriquement empêchant un goulot d'étranglement lors du déploiement initial.
# version kube-vip minimum 0.5.0

# (Facultatif) Une liste d'options kube-vip
# Toutes les options peuvent être trouvées ici https://kube-vip.io/docs/installation/flags/
# rke2_kubevip_args: []
# - param: lb_enable
#   value: vrai
# - param: lb_port
#   value: 6443

# Port de métriques Prometheus pour kube-vip
rke2_kubevip_metrics_port: 2112

# Ajouter des SAN supplémentaires dans le certificat TLS de l'API k8s
rke2_additional_sans: []

# Configurer le domaine du cluster
# rke2_cluster_domain: cluster.example.net

# Port de destination du serveur API
rke2_apiserver_dest_port: 6443

# Taints des nœuds Serveur
rke2_server_node_taints: []
  # - 'CriticalAddonsOnly=true:NoExecute'

# Taints des nœuds Agent
rke2_agent_node_taints: []

# Token secret partagé que d'autres nœuds serveur ou agent utiliseront pour s'enregistrer lors de la connexion au cluster
rke2_token: defaultSecret12345

# Version de RKE2
rke2_version: v1.25.3+rke2r1

# URL vers le dépôt RKE2
rke2_channel_url: https://update.rke2.io/v1-release/channels

# URL vers le script d'installation RKE2
# par exemple, le miroir chinois de Rancher http://rancher-mirror.rancher.cn/rke2/install.sh
rke2_install_bash_url: https://get.rke2.io

# Répertoire de données local pour RKE2
rke2_data_path: /var/lib/rancher/rke2

# URL par défaut pour récupérer les artefacts
rke2_artifact_url: https://github.com/rancher/rke2/releases/download/

# Chemin local pour stocker les artefacts
rke2_artifact_path: /rke2/artifact

# Artefacts nécessaires pour l'airgap
rke2_artifact:
  - sha256sum-{{ rke2_architecture }}.txt
  - rke2.linux-{{ rke2_architecture }}.tar.gz
  - rke2-images.linux-{{ rke2_architecture }}.tar.zst

# Change la stratégie de déploiement pour installer à partir d'artefacts locaux
rke2_airgap_mode: faux

# Type d'implémentation Airgap - télécharger, copier ou existe
# - 'download' récupérera les artefacts sur chaque nœud,
# - 'copy' transférera les fichiers locaux dans 'rke2_artifact' vers les nœuds,
# - 'exists' suppose que les fichiers 'rke2_artifact' sont déjà stockés dans 'rke2_artifact_path'
rke2_airgap_implementation: download

# Chemin source local où les artefacts sont stockés
rke2_airgap_copy_sourcepath: local_artifacts

# Images tarball pour des composants supplémentaires à copier de rke2_airgap_copy_sourcepath vers les nœuds
# (Les extensions de fichiers dans la liste et sur les fichiers réels doivent être conservées)
rke2_airgap_copy_additional_tarballs: []

# Destination pour les tarballs d'images supplémentaires en mode airgap (voir https://docs.rke2.io/install/airgap/#tarball-method)
rke2_tarball_images_path: "{{ rke2_data_path }}/agent/images"

# Architecture à télécharger, actuellement des versions existent pour amd64 et s390x
rke2_architecture: amd64

# Répertoire de destination pour le script d'installation RKE2
rke2_install_script_dir: /var/tmp

# Canal RKE2
rke2_channel: stable

# Ne pas déployer de composants packagés et supprimer les composants déployés
# Éléments valides : rke2-canal, rke2-coredns, rke2-ingress-nginx, rke2-metrics-server
rke2_disable:

# Option pour désactiver kube-proxy
disable_kube_proxy: faux

# Option pour désactiver le contrôleur de cloud intégré - principalement pour sur site
rke2_disable_cloud_controller: faux

# Fournisseur cloud à utiliser pour le cluster (aws, azure, gce, openstack, vsphere, externe)
# applicable seulement si rke2_disable_cloud_controller est vrai
rke2_cloud_provider_name: "externe"

# Chemin vers les manifests personnalisés déployés lors de l'installation de RKE2
# Il est possible d'utiliser le templating Jinja2 dans les manifests
rke2_custom_manifests:

# Chemin vers les pods statiques déployés lors de l'installation de RKE2
rke2_static_pods:

# Configurer des miroirs de registre Containerd personnalisés
rke2_custom_registry_mirrors: []
  # - name:
  #   endpoint: {}
#   rewrite: '"^rancher/(.*)": "mirrorproject/rancher-images/$1"'

# Configurer des configurations supplémentaires pour le registre Containerd personnalisé
rke2_custom_registry_configs: []
#   - endpoint:
#     config:

# Chemin vers le modèle de fichier de configuration du registre Container
rke2_custom_registry_path: templates/registries.yaml.j2

# Chemin vers le modèle de fichier de configuration RKE2
rke2_config: templates/config.yaml.j2

# Répertoire source des snapshots etcd
rke2_etcd_snapshot_source_dir: etcd_snapshots

# Nom du fichier snapshot etcd.
# Lorsque le nom de fichier est défini, etcd sera restauré lors de l'exécution initiale du logiciel Ansible.
# L'etcd sera restauré uniquement lors de l'exécution initiale, donc même si vous laissez le nom de fichier précisé,
# l'etcd restera intact lors des exécutions suivantes.
# Vous pouvez soit utiliser cela, soit définir des options dans `rke2_etcd_snapshot_s3_options`
rke2_etcd_snapshot_file:

# Emplacement du snapshot etcd
rke2_etcd_snapshot_destination_dir: "{{ rke2_data_path }}/server/db/snapshots"

# Options s3 pour le snapshot etcd
# Définissez soit toutes ces valeurs soit `rke2_etcd_snapshot_file` et `rke2_etcd_snapshot_source_dir`

# rke2_etcd_snapshot_s3_options:
  # s3_endpoint: "" # requis
  # access_key: "" # requis
  # secret_key: "" # requis
  # bucket: "" # requis
  # snapshot_name: "" # requis.
  # skip_ssl_verify: faux # optionnel
  # endpoint_ca: "" # optionnel. Peut être ignoré si vous utilisez les valeurs par défaut
  # region: "" # optionnel - par défaut us-east-1
  # folder: "" # optionnel - par défaut niveau supérieur du bucket
# Remplacer le snapshotter containerd par défaut
rke2_snapshooter: overlayfs

# Déployer RKE2 avec le CNI canal par défaut
rke2_cni: canal

# Valider la configuration système par rapport au benchmark sélectionné
# (Valeur prise en charge est "cis-1.23" ou éventuellement "cis-1.6" si vous utilisez RKE2 avant 1.25)
rke2_cis_profile: ""

# Télécharger le fichier de configuration Kubernetes vers le contrôleur Ansible
rke2_download_kubeconf: faux

# Nom du fichier de configuration Kubernetes qui sera téléchargé sur le contrôleur Ansible
rke2_download_kubeconf_file_name: rke2.yaml

# Répertoire de destination où le fichier de configuration Kubernetes sera téléchargé sur le contrôleur Ansible
rke2_download_kubeconf_path: /tmp

# Nom par défaut du groupe d'inventaire Ansible pour le cluster RKE2
rke2_cluster_group_name: k8s_cluster

# Nom par défaut du groupe d'inventaire Ansible pour les serveurs RKE2
rke2_servers_group_name: masters

# Nom par défaut du groupe d'inventaire Ansible pour les agents RKE2
rke2_agents_group_name: workers

# (Facultatif) Une liste d'options pour le serveur API Kubernetes
# Toutes les options peuvent être trouvées ici https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver
# rke2_kube_apiserver_args: []

# (Facultatif) Liste des étiquettes de nœud
# k8s_node_label: []

# (Facultatif) Options de configuration supplémentaires du serveur RKE2
# Vous pouvez trouver les options sur https://docs.rke2.io/reference/server_config
# rke2_server_options:
#   - "option: value"
#   - "node-ip: {{ rke2_bind_address }}"  # ex : (agent/networking) adresses IPv4/IPv6 à annoncer pour le nœud

# (Facultatif) Options de configuration supplémentaires de l'agent RKE2
# Vous pouvez trouver les options sur https://docs.rke2.io/reference/linux_agent_config
# rke2_agent_options:
#   - "option: value"
#   - "node-ip: {{ rke2_bind_address }}"  # ex : (agent/networking) adresses IPv4/IPv6 à annoncer pour le nœud

# (Facultatif) Configurer un Proxy
# Toutes les options peuvent être trouvées ici https://docs.rke2.io/advanced#configuring-an-http-proxy
# rke2_environment_options: []
#   - "option=value"
#   - "HTTP_PROXY=http://your-proxy.example.com:8888"

# (Facultatif) Personnaliser les arguments du gestionnaire kube-controller par défaut
# Cette fonctionnalité permet d'ajouter l'argument s'il n'est pas présent par défaut ou de le remplacer s'il existe déjà.
# rke2_kube_controller_manager_arg:
#   - "bind-address=0.0.0.0"

# (Facultatif) Personnaliser les arguments du planificateur kube par défaut
# Cette fonctionnalité permet d'ajouter l'argument s'il n'est pas présent par défaut ou de le remplacer s'il existe déjà.
# rke2_kube_scheduler_arg:
#   - "bind-address=0.0.0.0"

# (Facultatif) Configurer nginx via 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: {}

# Cordonner, vider le nœud en cours de mise à niveau. Décordonner le nœud une fois que RKE2 est mis à jour.
rke2_drain_node_during_upgrade: faux

# Attendre que tous les pods soient prêts après le redémarrage du service rke2-service lors du redémarrage progressif.
rke2_wait_for_all_pods_to_be_ready: faux

# Activer le mode débogage (rke2-service)
rke2_debug: faux

# (Facultatif) Personnaliser les arguments kubelet par défaut
# rke2_kubelet_arg:
#   - "--system-reserved=cpu=100m,memory=100Mi"

# (Facultatif) Personnaliser les arguments kube-proxy par défaut
# rke2_kube_proxy_arg:
#   - "proxy-mode=ipvs"

# La valeur pour l'élément de configuration node-name
rke2_node_name: "{{ inventory_hostname }}"

# le réseau à utiliser pour les Pods.. Défini par défaut sur '10.42.0.0/16'.
rke2_cluster_cidr:
  - 10.42.0.0/16

# le réseau à utiliser pour les services ClusterIP. Défini par défaut sur '10.43.0.0/16'.
rke2_service_cidr:
  - 10.43.0.0/16

Exemple de fichier d'inventaire

Ce rôle repose sur la distribution des nœuds dans les groupes d'inventaire masters et workers. Les nœuds maîtres/serveurs Kubernetes doivent appartenir au groupe masters et les nœuds agents/travailleurs doivent faire partie du groupe workers. Les deux groupes doivent être des enfants du groupe k8s_cluster.

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

[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

Exemple de playbook

Ce playbook déploiera RKE2 sur un seul nœud agissant à la fois comme serveur et agent.

- name: Déployer RKE2
  hosts: node
  become: yes
  roles:
     - role: lablabs.rke2

Ce playbook déploiera RKE2 sur un cluster avec un nœud serveur (maître) et plusieurs nœuds agents (travailleurs).

- name: Déployer RKE2
  hosts: all
  become: yes
  roles:
     - role: lablabs.rke2

Ce playbook déploiera RKE2 sur un cluster avec un serveur (maître) et plusieurs nœuds agents (travailleurs) en mode air-gapped. Il utilisera Multus et Calico comme CNI.

- name: Déployer RKE2
  hosts: all
  become: yes
  vars:
    rke2_airgap_mode: vrai
    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

Ce playbook déploiera RKE2 sur un cluster avec un plan de contrôle serveur (maître) HA et plusieurs nœuds agents (travailleurs). Les nœuds (maîtres) seront marqués de sorte que la charge de travail sera distribuée uniquement sur les nœuds agents. Le rôle installera également keepalived sur les nœuds de contrôle et configurera une adresse VIP à laquelle l'API Kubernetes sera accessible. Il téléchargera également le fichier de configuration Kubernetes sur la machine locale.

- name: Déployer RKE2
  hosts: all
  become: yes
  vars:
    rke2_ha_mode: vrai
    rke2_api_ip : 192.168.123.100
    rke2_download_kubeconf: vrai
    rke2_server_node_taints:
      - 'CriticalAddonsOnly=true:NoExecute'
  roles:
     - role: lablabs.rke2

Avoir un token séparé pour les nœuds agents

Conformément à la documentation de configuration du serveur, il est possible de définir un token agent, qui sera utilisé par les nœuds agents pour se connecter au cluster, leur donnant moins d'accès au cluster que les nœuds serveurs. Les modifications suivantes à la configuration ci-dessus seraient nécessaires :

  • supprimer rke2_token des variables globales
  • ajouter à group_vars/masters.yml :
rke2_token: defaultSecret12345
rke2_agent_token: agentSecret54321
  • ajouter à group_vars/workers.yml :
rke2_token: agentSecret54321

Alors que le changement de token du serveur est problématique, le token de l'agent peut être tourné à volonté, tant que les serveurs et agents ont la même valeur et que les services (rke2-server et rke2-agent, selon le cas) ont été redémarrés pour s'assurer que les processus utilisent la nouvelle valeur.

Dépannage

Playbook bloqué lors du démarrage du service RKE2 sur les agents

Si le playbook commence à se bloquer à la tâche Démarrer le service RKE2 sur le reste des nœuds et échoue ensuite à la tâche Attendre que les nœuds restants soient prêts, vous avez probablement certaines limitations sur le réseau de vos nœuds.

Veuillez vérifier les Règles Inbound requises pour les Nœuds Serveur RKE2 au lien suivant : https://docs.rke2.io/install/requirements/#networking.

Licence

MIT

Informations sur l'auteur

Créé en 2021 par Labyrinth Labs

À propos du projet

This Ansible Role will deploy Rancher RKE2 Kubernetes

Installer
ansible-galaxy install lablabs.rke2
Licence
mit
Téléchargements
776.7k
Propriétaire