Kubeadm (Français)
Kubeadm est un outil pour installer et configurer un nœud Kubernetes en utilisant la distribution officielle.
Requis
Le service kubelet doit être installé et démarré sur chaque ordinateur participant à la grappe Kubernetes. Il permet le démarrage des composants de contrôle à partir des définitions entreposées dans le dossier /etc/kubernetes/manifest. Il est le contrôleur local et communique avec l’API pour recevoir les instructions de création et destruction de Pod.
Le programme kubeadm doit être installé sur chaque ordinateur pour l’installation, la mise à jour des composants ou un changement de la configuration. La configuration est sauvegardée directement dans Kubernetes et kubeadm permet de la récupérer et de l’installer sur chaque machine.
Configuration
La configuration des composants utilise un fichier de déclaration lu par kubeadm pour générer des fichiers de configuration et les arguments de lancement des services (kubelet). Tous les « documents » YAML peuvent être réunis dans un même fichier, séparés par « --- », pour simplifier les commandes à un seul paramètres --config=options.yaml.
ClusterConfiguration
Il faut choisir deux plages d’adresses IP que les composants Kubernetes pourront utiliser pour communiquer entre eux.
Ces plages d’adresses ne doivent pas se superposer à d’autres plages d’adresses utilisées sur le réseau.
Les Pods recevront une adresse parmi celles fournies par controllerManager.extraArgs.cluster-cidr
qui définit un sous-ensemble de podSubnet.
- serviceSubnet et podSubnet
- sont des plages d’adresses séparées par des virgules.
- dnsDomain
- est le domaine DNS associé à la grappe Kubernetes. Il est alimenté automatiquement mais doit avoir un nom dissociable des DNS existants.
- apiServer.certSANs
- permet d’ajouter le nom DNS de la machine contenant le serveur d’API à son certificat. Cela simplifie la configuration des outils voulant communiquer avec l’API Kubernetes.
cluster.yaml
clusterName: "Kube" networking: serviceSubnet: "10.84.0.0/16" podSubnet: "10.85.0.0/16" dnsDomain: "cluster.local" controllerManager: extraArgs: allocate-node-cidrs: true cluster-cidr: "10.85.0.0/16" node-cidr-mask-size-ipv4: "24"
Pour un réseau privilégiant IPv6, les subnet doivent contenir en premier une plage IPv6 et tous les services utiliser bind-address: '::'
.
Une configuration complète est disponible ici.
KubeletConfiguration
Ce fichier contient les options commune à tous les kubelet de la grappe. Elle est publiée sur etcd pour être accessible de chaque nœud. En cas de modification, il faut manuellement (kubeadm) installer la nouvelle configuration sur chaque machine.
Les options importantes sont
- failSwapOn (note)
- (bool) autorise la présence de swap. La présence de swap fausse la mesure de la mémoire utilisée par les processus.
- systemReserved
- mesure la quantité de ressources système en moins utilisable par Kubernetes.
- kubeReserved
- mesure la quantité de ressources restantes réservées aux composants centraux de Kubernetes.
kubelet.yaml
apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration systemReserved: cpu: "1" memory: "1G" kubeReserved: cpu: "500m" memory: "500M"
Pour un réseau privilégiant IPv6, les options suivantes doivent contenir une adresse IPv6 :
address: "::"
-
clusterDNS: [...]
est une liste d’adresses appartenant à l’intervalle définie par cluster-cidr. -
healthzBindAddress: "::1"
sert d’entrée dans un Pod pour les tests de réponse du service.
Démarrage Kubernetes
Premier Nœud
Le premier nœud installe les composants du control-plane (apiserver, etcd, controler-manager, scheduler), génère des certificats x509 pour les communication et démarre les premiers modules dans Kubernetes (coredns, kube-proxy). Suivre ce tutoriel pour utiliser ses propres certificats.
La commande kubeadm init ne s’utilise que sur le premier nœud et se divise en plusieurs phases. Par défaut toutes les phases sont réalisées dans l’ordre et sans modifier les fichiers déjà présents sur la machine. Il est possible de demander une phase en particulier mais elle échouera si ses dépendances ne sont pas complètes.
InitConfiguration
Le groupe nodeRegistration contient les options faisant le lien entre un nœud, son matériel et le monde extérieur.
- criSocket
- (ex unix:///run/crio/crio.sock) dépend du contrôleur de conteneur installé sur la machine. Ce sera généralement cri-o et containerd.
- name
- est le nom donné à ce nœud. Chaque nœud doit posséder un nom différent.
- kubeletExtraArgs
- complète KubeletConfiguration avec les options individuelles, comme
node-ip
qui est la liste des adresses publiques à lesquelles joindre ce nœud.
Autres Nœuds
Pour ajouter des nœuds à la grappe, ils doivent mettre en place une relation de confiance à double sens avec le control-plane. La méthode du jeton utilise un jeton temporaire créé par le maître que le nouvel arrivant doit présenter pour prouver que l’administrateur a bien accès à l’API Kubernetes. Pour vérifier que la première connexion n’a pas été détournée, kubeadm join utilise le hash de la clé publique utilisée par le maître.
La commande kubeadm token create
, utilisée depuis une session avec accès à l’API, génère un jeton.
La commande kubeadm join --discovery-token=<token> --discovery-token-ca-cert-hash="<hash-type>:<hex-encoded-value>" <master-IP>:6443
génère les certificats du nœud, configure kubelet et le démarre puis l’enregistre dans la grappe.
Personnalisation du control-plane
Kubeadm installe les définitions pour kube-apiserver, kube-controller-manager et kube-scheduler dans le dossier /etc/kubernetes/manifests du nœud principal. À la moindre modification, le service kubelet éteint et redémarre les Pods correspondants pour appliquer les modifications.
La méthode conseillée pour appliquer des modifications est d’utiliser Kubeadm avec des correctifs.
Ces correctifs peuvent être appliqués à l’initialisation d’un nœud ou pendant sa mise à jour: kubeadm upgrade apply --patches PATCHES
.
PATCHES
est un dossier contenant des fichiers de correctifs nommés selon le schéma target[suffix][+patchtype].
Sans nécessités particulières, ces fichiers peuvent être nommés directement avec le nom du composant à modifier.
kube-apiserver.yaml
apiVersion: v1 kind: Pod metadata: name: kube-apiserver spec: containers: - name: kube-apiserver env: - name: GOMAXPROCS valueFrom: resourceFieldRef: resource: limits.cpu - name: GOMEMLIMIT valueFrom: resourceFieldRef: resource: requests.memory resources: requests: cpu: "100m" memory: "600Mi" limits: cpu: "4" memory: "700Mi" readinessProbe: periodSeconds: 15
Cet exemple diminue la fréquence du test readiness, réserve et limite la mémoire et informe le programme Go de ces nouvelles limitations. GOMEMLIMIT est une limite douce.
Outils supplémentaires
Les composants de base Kubernetes ne gèrent que l’orchestration et le démarrage des Pods. Il faut ensuite installer un certain nombre de composants supplémentaires dans Kubernetes pour un fonctionnement complet.
Réseau
La communication réseau entre Pods et entre Nodes nécessite des programmes et configurations supplémentaires sur chaque machine. Tout cela est géré par le Container Runtime Interface' comme Cilium, Calico ou Flannel.
Kubernetes propose une configuration unifiée pour les Ingress (obsolète) et les Gateway. Il existe de nombreux programme pour réaliser ces tâches, dont traefik, ingress, Cilium, envoy.
GPUs
L’utilisation des GPUs comme ressource matérielle au même titre que les CPUs et la RAM n’est pas supportée par le Kubernetes Scheduler basique. Cette ressource est contrôlée par un device-plugin (voir cette documentation).