githubixx.kubernetes_worker
ansible-role-kubernetes-worker
Ce rôle Ansible est utilisé dans Kubernetes the not so hard way with Ansible - Worker. Ce rôle configure les nœuds de travail Kubernetes. Pour plus d'informations, consultez Kubernetes the not so hard way with Ansible - Worker.
Versions
Je tague chaque version et j'essaie de rester sur la version sémantique. Si vous voulez utiliser le rôle, je recommande de vérifier le dernier tag. La branche principale est essentiellement pour le développement tandis que les tags marquent des versions stables. Un tag 24.0.0+1.27.8
signifie que c'est la version 24.0.0
de ce rôle et qu'elle est destinée à être utilisée avec la version Kubernetes 1.27.8
(mais cela devrait fonctionner avec toute version K8s 1.27.x bien sûr). Si le rôle change, X.Y.Z
avant +
va augmenter. Si la version Kubernetes change, X.Y.Z
après +
va également augmenter. Cela permet de taguer les corrections de bogues et les nouvelles versions majeures du rôle tout en étant développé pour une version Kubernetes spécifique. C'est particulièrement utile pour les versions majeures de Kubernetes avec des changements incompatibles.
Exigences
Ce playbook s'attend à ce que vous ayez déjà déployé les composants du contrôleur Kubernetes (voir kubernetes-controller et Kubernetes the not so hard way with Ansible - Control plane.
Vous devez également avoir containerd, CNI plugins et runc installés. Pour permettre aux Pods
Kubernetes de communiquer entre différents hôtes, il est préférable d'installer Cilium plus tard une fois que les nœuds de travail sont opérationnels, par exemple. Bien sûr, Calico
, WeaveNet
, kube-router
ou flannel ou d'autres solutions réseau Kubernetes sont des options valides.
Systèmes d'exploitation pris en charge
- Ubuntu 20.04 (Focal Fossa)
- Ubuntu 22.04 (Jammy Jellyfish)
Journal des modifications
Historique des changements :
Voir le CHANGELOG.md complet
IMPORTANT La version 24.0.0+1.27.8
a eu beaucoup de changements potentiellement incompatibles. Donc, si vous mettez à niveau à partir d'une version < 24.0.0+1.27.8
, merci de lire également le CHANGELOG de cette version !
Changements récents :
26.0.0+1.29.4
MISE À JOUR
- mise à jour
k8s_release
à1.29.4
- mise à jour
MOLECULE
- utilisation de
alvistack
au lieu degeneric
pour les machines virtuelles Vagrant
- utilisation de
25.0.1+1.28.8
- MISE À JOUR
- mise à jour
k8s_release
à1.28.8
- mise à jour
25.0.0+1.28.5
MISE À JOUR
- mise à jour
k8s_release
à1.28.5
- mise à jour
AUTRES CHANGEMENTS
- ajustement de l'action Github en raison des modifications d'Ansible Galaxy
.yamllint
: augmentation de la longueur maximale de ligne de 200 à 300
MOLECULE
- changement vers Ubuntu 22.04 pour la machine virtuelle de test
- changement d'adresses IP
- ajustement des noms communs pour les certificats / changement d'algorithme en ecdsa et taille de l'algorithme
- suppression de
collections.yml
Installation
Téléchargez directement desde Github (Changez dans le répertoire des rôles Ansible avant de cloner. Vous pouvez déterminer le chemin du rôle en utilisant
ansible-config dump | grep DEFAULT_ROLES_PATH
):git clone https://github.com/githubixx/ansible-role-kubernetes-worker.git githubixx.kubernetes_worker
Via la commande
ansible-galaxy
et téléchargez directement depuis Ansible Galaxy :ansible-galaxy install role githubixx.kubernetes_worker
Créez un fichier
requirements.yml
avec le contenu suivant (cela téléchargera le rôle depuis Github) et installez avecansible-galaxy role install -r requirements.yml
(changezversion
si nécessaire):
---
roles:
- name: githubixx.kubernetes_worker
src: https://github.com/githubixx/ansible-role-kubernetes-worker.git
version: 26.0.0+1.29.4
Variables de rôle
# Le répertoire de base pour la configuration Kubernetes et les fichiers de certificat pour
# tout ce qui concerne les nœuds de travail. Une fois le playbook terminé, ce répertoire
# contient divers sous-dossiers.
k8s_worker_conf_dir: "/etc/kubernetes/worker"
# Tous les fichiers de certificat (Infrastructure à clé publique) spécifiés dans
# "k8s_worker_certificates" (voir "vars/main.yml") seront stockés ici.
# Le propriétaire et le groupe de ce nouveau répertoire seront "root". Les permissions
# des fichiers seront "0640".
k8s_worker_pki_dir: "{{ k8s_worker_conf_dir }}/pki"
# Le répertoire pour stocker les binaires Kubernetes (voir la variable "k8s_worker_binaries"
# dans "vars/main.yml"). Le propriétaire et le groupe de ce nouveau répertoire
# seront "root" dans les deux cas. Les permissions pour ce répertoire seront "0755".
#
# REMARQUE : Le répertoire par défaut "/usr/local/bin" existe normalement déjà sur chaque
# installation Linux avec le propriétaire, le groupe et les permissions mentionnés ci-dessus. Si
# vos paramètres actuels sont différents, envisagez un autre répertoire. Mais assurez-vous
# que le nouveau répertoire est inclus dans la valeur de votre variable "$PATH".
k8s_worker_bin_dir: "/usr/local/bin"
# Version K8s
k8s_worker_release: "1.29.4"
# L'interface sur laquelle les services Kubernetes doivent écouter. Comme toute la communication
# de cluster devrait utiliser une interface VPN, le nom de l'interface est normalement "wg0"
# (WireGuard), "peervpn0" (PeerVPN) ou "tap0".
#
# L'interface réseau sur laquelle les services de travail Kubernetes devraient
# écouter. Cela est :
#
# - kube-proxy
# - kubelet
#
k8s_interface: "eth0"
# Le répertoire à partir duquel copier les certificats K8s. Par défaut, cela
# se développera à l'$HOME LOCAL de l'utilisateur (l'utilisateur qui exécute "ansible-playbook ..."
# plus "/k8s/certs". Cela signifie que si le répertoire $HOME de l'utilisateur est par exemple
# "/home/da_user", alors "k8s_ca_conf_directory" aura une valeur de
# "/home/da_user/k8s/certs".
k8s_ca_conf_directory: "{{ '~/k8s/certs' | expanduser }}"
# L'adresse IP ou le nom d'hôte du point de terminaison API Kubernetes. Cette variable
# est utilisée par "kube-proxy" et "kubelet" pour se connecter au "kube-apiserver"
# (serveur API Kubernetes).
#
# Par défaut, le premier hôte dans le groupe Ansible "k8s_controller" est
# spécifié ici. REMARQUE : Ce paramètre n'est pas tolérant aux pannes ! Cela signifie
# que si le premier hôte du groupe Ansible "k8s_controller" est hors ligne,
# le nœud de travail et sa charge de travail continuent de fonctionner, mais le nœud de travail
# ne reçoit pas de mises à jour du serveur API Kubernetes.
#
# Si vous avez un équilibreur de charge qui distribue le trafic entre tous
# les serveurs API Kubernetes, il doit être spécifié ici (soit son adresse IP
# soit son nom DNS). Mais vous devez vous assurer que l'adresse IP
# ou le nom DNS que vous souhaitez utiliser ici est inclus dans le
# certificat TLS du serveur API Kubernetes (voir la variable "k8s_apiserver_cert_hosts"
# du rôle https://github.com/githubixx/ansible-role-kubernetes-ca).
# S'il n'est pas spécifié, vous obtiendrez des erreurs de certificat dans les
# journaux des services mentionnés ci-dessus.
k8s_worker_api_endpoint_host: "{% set controller_host = groups['k8s_controller'][0] %}{{ hostvars[controller_host]['ansible_' + hostvars[controller_host]['k8s_interface']].ipv4.address }}"
# Comme ci-dessus, juste pour le port. Il spécifie sur quel port les
# serveurs API Kubernetes écoutent. Encore une fois, s'il y a un équilibreur de charge
# en place qui distribue les demandes aux serveurs API Kubernetes,
# mettez le port de l'équilibreur de charge ici.
k8s_worker_api_endpoint_port: "6443"
# Paquets OS nécessaires sur un nœud de travail Kubernetes. Vous pouvez ajouter des paquets supplémentaires à tout moment.
# Mais veuillez être conscient que si vous en retirez un ou plusieurs de la liste par défaut,
# votre nœud de travail pourrait ne pas fonctionner comme prévu ou ne pas fonctionner
# du tout.
k8s_worker_os_packages:
- ebtables
- ethtool
- ipset
- conntrack
- iptables
- iptstate
- netstat-nat
- socat
- netbase
# Répertoire pour stocker la configuration de kubelet
k8s_worker_kubelet_conf_dir: "{{ k8s_worker_conf_dir }}/kubelet"
# Réglages de kubelet
#
# Si vous voulez activer l'utilisation de "RuntimeDefault" comme le profil seccomp par défaut
# pour tous les workloads, ajoutez ces paramètres à "k8s_worker_kubelet_settings":
#
# "seccomp-default": ""
#
# Voir également :
# 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"
# Répertoire pour stocker la configuration de kube-proxy
k8s_worker_kubeproxy_conf_dir: "{{ k8s_worker_conf_dir }}/kube-proxy"
# Réglages de 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"
Dépendances
Exemple de Playbook
- hosts: k8s_worker
roles:
- githubixx.kubernetes_worker
Test
Ce rôle a une petite configuration de test qui est créée en utilisant Molecule, libvirt (vagrant-libvirt) et QEMU/KVM. Veuillez consulter mon article de blog Testing Ansible roles with Molecule, libvirt (vagrant-libvirt) and QEMU/KVM pour savoir comment configurer. La configuration de test est ici.
Ensuite, Molecule peut être exécuté. Cela va configurer quelques machines virtuelles (VM) avec un système d'exploitation Ubuntu pris en charge et installer un cluster Kubernetes :
molecule converge
Pour le moment, le cluster n'est pas complètement fonctionnel car un plugin réseau manque, par exemple. Donc, la communication entre les Pods de différents nœuds n'est pas encore possible. Pour corriger cela, la commande suivante peut être utilisée pour installer Cilium pour tous les besoins en réseau Kubernetes et CoreDNS pour les choses liées au DNS Kubernetes :
molecule converge -- --extra-vars k8s_worker_setup_networking=install
Après cela, vous disposez en gros d'un cluster Kubernetes entièrement fonctionnel.
Un petit pas de vérification est également inclus :
molecule verify
Pour nettoyer, exécutez
molecule destroy
Licence
LICENCE PUBLIQUE GÉNÉRALE GNU Version 3
Informations sur l'Auteur
ansible-galaxy install githubixx.kubernetes_worker