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
  • MOLECULE

    • utilisation de alvistack au lieu de generic pour les machines virtuelles Vagrant

25.0.1+1.28.8

  • MISE À JOUR
    • mise à jour k8s_release à 1.28.8

25.0.0+1.28.5

  • MISE À JOUR

    • mise à jour k8s_release à 1.28.5
  • 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 avec ansible-galaxy role install -r requirements.yml (changez version 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

http://www.tauceti.blog

À propos du projet

Installs Kubernetes worker.

Installer
ansible-galaxy install githubixx.kubernetes_worker
Licence
gpl-3.0
Téléchargements
1.6k
Propriétaire
Senior System Engineer - Python, Go, Cloud, Kubernetes, Commodore, Retro, 80's ;-)