INFOTHEMA

Auteur Sujet: [LJP-Infos] Installer et configurer un cluster Kubertnetes  (Lu 1678 fois)

Animateur

  • Administrator
  • Hero Member
  • *****
  • Messages: 5953
    • Voir le profil
[LJP-Infos] Installer et configurer un cluster Kubertnetes



Cette vidéo vous explique comment installer un cluster Kubernetes.
Pas un cluster MinicroKube ou tout autre dérivé light de Kube un vrai Kukernetes avec tout le tralala!

Kubernetes est un système de gestion de conteneurs très perfectionné, peut être un peu trop parfois, il existe alors dans de nombreuses déclinaisons souvent pour simplifier les tâches d'installation. Certains veulent alors faire croire que les versions allégées valent la complète, oui la plupart des fonctions y sont, la plupart, donc pas toutes! ça reste quand même des versions light de Kubernetes.

Ici je montre comment installer et se lancer dans la gestion d'un cluster Kubernetes avec toutes ses fonctions. On s'arrêtera à l'ajout d'un nouveau noeud avec comme rôle celui de Worker.

Bien que la vidéo s'arrêtera à l'ajout d'un nouveau noeud, il y a quand même beaucoup beaucoup de choses à dire.

Pour éviter d'avoir a donner toutes les commandes je vous fourni un fichier avec un résumé des commandes, même s'il fait plus de 300 lignes, il ne contient pas tout, ce document est disponible ici: https://drive.google.com/file/d/1Hpfs3KJS-hTlISC_uim9PBeWI3NEbDcf/view

Ce document explique comment installer un cluster Kubernetes.

Kubernetes existe dans de nombreuses déclinaisons qui simplifient les tâches d'installation mais qui restent des versions light de Kubernetes.
Ce document explique comment installer et se lancer dans la gestion d'un cluster kubernetes avec toutes ses fonctions.

* Il faudra souvent faire quelques essais pour trouver la version stable de Kubernetes pour le système d'exploitation voulu.
  (ici je prendrais la version 1.20.0 bien que la version 1.26 soit disponible!)

Ce document est disponible ici: https://drive.google.com/file/d/1Hpfs3KJS-hTlISC_uim9PBeWI3NEbDcf/view?usp=share_link

LJP-Infos le 03/12/2022


== Repartir de 0 ou en cas de souci
========================================================================


# En cas de souci:
– systemctl restart kubelet
– systemctl status kubelet
– journalctl -xeu kubelet

# Pour reset exécuter la commande sur le Master comme les Workers:
kubeadm reset && rm -rf /etc/cni/net.d

# Puis on relance l'init de kubeadm
kubeadm init
# ...
kubeadm init --pod-network-cidr 192.168.0.0/16 --kubernetes-version=v1.25.0
# Ou pour les workers
kubeadm join ....


== Prérequis / base
========================================================================

# On change le nom de la machine
vi /etc/hostname
kubemaster
vi /etc/resolv.conf
# On ne laisse que 2 DNS!

# On ne prend pas de risque on garde un nom simple, avec ou sans domaine (le domaine parfois peut aussi poser des soucis de connexion)

vi /etc/hosts
# Le poste local:
127.0.0.1       localhost
127.0.1.1       kubemaster kubemaster.loisel.loc
192.168.1.246    kubemaster kubemaster.loisel.loc

# et on ajoute ici les # noeuds
192.168.1.244    kubeworker kubeworker.loisel.loc

# Si vous n'utiliser que l'ipv4, suivant le cas on peut désactiver le bridge ipv6
vi /etc/sysctl.d/k8s.conf
# Commenter la ligne correspondante... ou on met 0
net.bridge.bridge-nf-call-ip6tables = 0

# Et utiliser "nmtui" pour désactivier l'ipv6 au niveau de l'interface
nmtui

* Il est également préférable d'utiliser de l'ip fixe...
* Sur les nouvelles version de redhat les fichiers de configuration du réseau sont stockés dans "/etc/NetworkManager/system-connections/"
  "ls /etc/NetworkManager/system-connections/"

# Comme déjà expliqué on désactive le swap
vi /etc/fstab
# On commente la ligne de swap

# On active le masquage transparent et on facilite le VLAN étendu (VxLAN) pour la communication entre les pods du cluster Kubernetes.
modprobe br_netfilter
# On s'arrure de le rendre actif au démarrage
vi /etc/modules-load.d/br_netfilter.conf
br_netfilter

# Comme le firewall est activité sur Redhat on va devoir activer le masquage transparent.
firewall-cmd --add-masquerade --permanent
firewall-cmd --reload

# On termine avec les mises à jour
dnf upgrade -y

* Si un nouveau noyau est proposé on redémarrera la machine avant de continuer...
reboot
dnf -y remove --oldinstallonly --setopt installonly_limit=2 kernel



dnf clean all && history -c && history -w
reboot


== Installation de la base logicielle pour tous les noeuds
========================================================================

1) J'ajoute le repos Kubernetes ici je mets directement le paquet pour le système, à adapter suivant l'architechture (On peut utiliser kubernetes-el7-$basearch mais ça reste une question de point du vue...)

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

2) Je mets à jour les repos et les paquets
dnf upgrade -y

* Lors des prochains updates il faudra penser au besoin à fixer les versions de kubelet kubeadm kubectl


# On vérifie avoir la bonne version de containerd qui peut être source de crash du cluster kubernetes
rpm -qa | grep containerd
# Sinon
dnf install -y https://download.docker.com/linux/centos/9/x86_64/stable/Packages/containerd.io-1.6.12-3.1.el9.x86_64.rpm 
# ...
dnf install -y https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.6.12-3.1.el8.x86_64.rpm
# ...
dnf install -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.6.12-3.1.el7.x86_64.rpm

* Si un nouveau noyau est proposé on redémarrera la machine avant de continuer...
* Les paquetages containerd sont ici suivant la version que l'on cherche https://download.docker.com/linux/centos/

3) J'installe Kubernetes (ici la version 1.20.0 à vous de faire les tests pour les versions plus récentes).

dnf install kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0 -y

3.1) On vérifie avec:
rpm -qa | grep kube
#On doit trouver 4 Packages:
kubernetes-cni
kubelet
kubectl
kubeadm

4) On configure le pare feu (pour tous les noeuds en cas de bascule de rôle) - à adapter suivant la plage

firewall-cmd --zone=public --permanent --add-port={2379,2380,6443,10248,10250,10251,10252,30000-32767,49726}/tcp
firewall-cmd --zone=public --permanent --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 accept'
firewall-cmd --zone=public --permanent --add-rich-rule 'rule family=ipv4 source address=172.17.0.0/16 accept'
firewall-cmd --zone=public --permanent --add-rich-rule 'rule family=ipv4 source address=127.0.0.0/8 accept'
# Et on le recharge pour prendre en compte les paramètres
firewall-cmd --reload
# On peut vérifier avec
firewall-cmd --list-all


5) On démarre et active les services Kubernetes avec
systemctl enable kubelet --now

* A ce stade il y a peu de chances que "kubelet" soit actif (il y a souvent des soucis de fichiers de conf inexistants ou de containerd qui ne fonctionne pas comme il faut. Mais on va corriger ça avec kubeadm)


== On configure Kubernetes Seulement sur le master
===============================================================================================================================

1) On configure kubeadm.

# On supprime le fichier de configuration de containerd pour l'erreur "container runtime is not running"
rm -f /etc/containerd/config.toml
# Certains préfèrent placer la config par défaut dans le fichier
containerd config default | tee /etc/containerd/config.toml
# On redémarre containerd
systemctl restart containerd

# On initialise kubernetes (on pourra au besoin charger les images avant... suivant le besoin) toujours pour la version 1.20
kubeadm init --kubernetes-version=v1.20.0
# ou ... si on a défini les plages IP de travail pour les workers / pods
kubeadm init --pod-network-cidr 192.168.0.0/16 --kubernetes-version=v1.20.0

1.1) Si vous avez des erreurs iptables bridge-nf-call-iptables ou net-ipv4-ip_forward pensez à (indiqué dans les prérequis):
modprobe br_netfilter
firewall-cmd --add-masquerade --permanent
firewall-cmd --reload


1.2) Si les erreurs persistent - On vérifie avec (les erreurs de démarrage sont fréquentes en cas de soucis avec kubeadm):
systemctl status kubelet

1.3) En cas de soucis on peut
journalctl -xeu kubelet
systemctl status containerd
systemctl restart kubelet

2) On récupère les infos pour joindre les nouveaux workers, on peut noter au besoin la commande pour joindre (elle est à la fin de la commande "kubeadm init" - Les infos devraient ressembler à cette ligne (avec un token et ca différent!)

kubeadm join 192.168.1.50:6443 --token diqsen.1eqt9ywb2te7nxp8 \
    --discovery-token-ca-cert-hash sha256:a3b464bd59c101a9351c21417c741b6d5e59bbbcfefd7b14644e908c16e03641

* Si on oublie je donne un moyen de retrouver ça plus loin

3) Pour permettre a kubectl de bien contacter le master en fonction de la config (c'est indiqué lors du "kubeadm init")

# Si on n'est pas connecté en root
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# Sinon, en root (j'ai un peu changé la commande pour ne pas devoir la taper à chaque fois)
echo export KUBECONFIG=/etc/kubernetes/admin.conf >> /etc/bashrc
# Et on relance pour que ça soit en compte immédiatement
export KUBECONFIG=/etc/kubernetes/admin.conf
# Ou
bash


4) Pour le réseau - on installe CNI (container network interface) plugin for Kubernetes. Ici on utilise Calico:
* Toute la doc est ici au sujet de calicot https://docs.projectcalico.org/getting-started/kubernetes/quickstart#overview

# Qu'on installe avec cette commande (on peut avoir une erreur de connexion alors on attend quelques minutes et on relance la commande):
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# On pourra ignorer l'erreur "PodDisruptionBudget" qui est une option dépléciée suivant la version installée.

# On peut aussi installer Flannel qui est un système simple qui permet de configurer un réseau de couche 3 (layer 3) pour Kubernetes (la version n'est pas toujours très stable et n'est qu'en version 0.20.2 à l'heure actuelle)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml


5) Tester/vérifier que le Master est bien démarré et fonctionnel (ready) - il faut souvent attendre quelques minutes que tout soit démarré.

kubectl get nodes

# On peut vérifier que le cluster "fonctionne" et ou il fonctionne
kubectl cluster-info

# Quelques infos à propos du master kubernetes
* Si la configuration est bonne on devrait voir le noeud en status "ready" - si ce n'et pas le cas, il faut parfois attendre un moment avant de répéter la commande.
* Suivant le système et sa complexité, on peut attendre jusqu'a 15 minutes! - 8min est assez courant la première fois
* Pendant le démarrage il est normal de trouver "The connection to the server <host>:6443 was refused"
* Si le souci persiste et vous obtenez un message indiquant que l'hote ne peut pas être joint, voir le fichier "/etc/hosts" et l'accès au fichier de config (export KUBECONFIG / cp /etc/kubernetes/admin.conf)
* La ligne "bridge ipv6" peut également perturber la liaison si vous n'utiliser qu'exclusivement l'ipv4 ("vi /etc/sysctl.d/k8s.conf" et commenter la ligne)

* En cas d'instabilité du réseau (cas de vms par exemple) Eventuellement redémarrer les services
systemctl restart containerd
systemctl restart kubelet
kubectl get nodes


6) Autres tests et vérifications - on peut vérifier si les pods ont été redémarrés ou ont crashé
(on pourra voir au passage le module calicot qui a été installé)

kubectl get pods --all-namespaces

kubectl get events | grep node

7) Les infos pour joindre une machine au cluster devraient ressembler à cette ligne (avec un token et ca différent!)

kubeadm join 192.168.1.50:6443 --token diqsen.1eqt9ywb2te7nxp8 \
    --discovery-token-ca-cert-hash sha256:a3b464bd59c101a9351c21417c741b6d5e59bbbcfefd7b14644e908c16e03641

# Mais on peut générer autant de tokens que l'on veut pour 10min comme pour 24h (par exemple) - Le token change mais pas le ca:
kubeadm token create --print-join-command --ttl 24h

# Et si on veut la liste des tokens (qu'il suffira d'adapter pour la commande join)
kubeadm token list

# Pour retrouver le hash du certificat on pourra utiliser cette commande:
openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -pubkey | openssl rsa -pubin -outform DER 2>/dev/null | sha256sum | cut -d' ' -f1

* Ces commandes sont disponibles si le server "master" est joignable ("kubectl get nodes" à ready)


== On configure ensuite les Workers (à faire seulement pour les Workers)
===============================================================================================================================

On peut continuer si a la commande "kubectl get nodes" le master répond comme étant démarré et prêt.

sysctl net/netfilter/nf_conntrack_max=524288
sysctl --system


1) Si l'erreur se produit sur le master il est fort a croire que ça sera pareil sur le worker alors

rm -f /etc/containerd/config.toml
# Certains préfèrent placer la config par défaut dans le fichier
containerd config default | sudo tee /etc/containerd/config.toml

systemctl restart containerd

2) On joint le cluster avec la commande noté avant (la version sera récupérée directement par la jonction du serveur au master).

# Ceci n'est qu'un exemple, il en fonctionnera pas pour vous. Chaque token est différent et a une durée de vie limitée
kubeadm join 192.168.1.50:6443 --token diqsen.1eqt9ywb2te7nxp8 \
    --discovery-token-ca-cert-hash sha256:a3b464bd59c101a9351c21417c741b6d5e59bbbcfefd7b14644e908c16e03641

(Pour reset: kubeadm token create --print-join-command)

4) On vérifie si le noeud à joint le master avec cette commande
(à taper sur le master sinon copier le fichier de confifugration...)

kubectl get nodes


5) On ajoute le role Worker --overwrite n'est pas obligatoire (mais fonctionne très bien avec)

kubectl label node kubeworker node-role.kubernetes.io/worker=worker

# On vérifie avec
kubectl get nodes


=== Comment faire des changements dans kube-apiserver
=====================================================

* Le pod kube-apiserver est le pod principal de kubernetes, c'est lui qui donne accès au système
  Ca peut être intéresant de le modifier quand on a des soucis ou pour apporter différents réglages dans le système.

# Pour voir en temps réel le fonctionnement des pods (Watch permet de lancer la commande voulue en boucle)...
watch -n 1 crictl ps
# Par défaut c'est 2s
watch crictl ps

# Pour voir la ligne de commande pour le pod et ses paramètres lancés
ps aux | grep kube-apiserver

# Le fichier de paramètres du pod:
vi /etc/kubernetes/manifests/kube-apiserver.yaml
# On commence par changer les privilèges: Si kubelet détecte une erreur, un changement, il le redémarre si à true et ne fait rien si à false (si on met à false le pod ne sera pas redémarré par kubectl a chaque détection de changement)


# Après les modifications on peut:
systemctl restart docker && systemctl restart containerd && systemctl restart kubelet


# Pour les logs on les trouvera dans ces fichiers:
/var/log/pods
/var/log/containers


== Fonctions pratiques
=====================================================

# Lister les images chargées
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" | tr -s '[[:space:]]' '\n' | sort | uniq -c


# Lister les évènements non "Normaux"
kubectl get events -A  | grep -v Normal

# Lister les évènements sur les noeuds
kubectl get events | grep node


# Aide-mémoire kubectl avec la liste des commandes kubectl les plus couramment utilisés.
https://kubernetes.io/docs/reference/kubectl/cheatsheet/


Ce n'est que le début d'une grande aventure, les conteneurs sont l'avenir, ça existe depuis 2013, tout comme certains ne croyaient pas en Linux, il suffit de voir ou on en est...


Time code:
01:29 Les bases de la création d'un Kubernetes
05:20 Le fichier d'installation
06:50 Installation de la base logicielle pour tous les noeuds
10:30 Installation de Kubernetes
14:20 Configuration de Kubernetes sur le master
17:58 Récupérer le token et la ligne pour joindre les clients
18:57 Terminer la configuration du master
21:07 Ajouter un module, le module réseau
25:07 Les infos de jonction
27:43 Configurer les Workers
31:26 Mettre en place le rôle de Worker
32:36 Faire des changements dans kube-apiserver
36:39 Ce n'est qu'un début
Membre de l'APRIL (www.april.org) / Membre du bureau Association "Debian Facile"  (https://debian-facile.org)