GNU/Linux >> Tutoriels Linux >  >> Linux

Comment configurer le cluster Kubernetes (k8s) en HA avec Kubeadm

Lorsque nous configurons Kubernetes (k8s) cluster sur site pour l'environnement de production, il est recommandé de le déployer en haute disponibilité. Ici, la haute disponibilité signifie l'installation d'un maître ou d'un plan de contrôle Kubernetes dans HA. Dans cet article, je vais montrer comment configurer le cluster Kubernetes (k8s) en haute disponibilité (haute disponibilité) avec l'utilitaire kubeadm.

Pour la démonstration, j'ai utilisé cinq systèmes CentOS 7 avec les détails suivants :

  • k8s-master-1 – CentOS 7 minimal – 192.168.1.40 – 2 Go de RAM, 2vCPU, disque de 40 Go
  • k8s-master-2 – CentOS 7 minimal – 192.168.1.41 – 2 Go de RAM, 2vCPU, disque de 40 Go
  • k8s-master-3 – CentOS 7 minimal – 192.168.1.42 – 2 Go de RAM, 2vCPU, disque de 40 Go
  • k8s-worker-1 – CentOS 7 minimal – 192.168.1.43 – 2 Go de RAM, 2vCPU, disque de 40 Go
  • k8s-worker-2 – CentOS 7 minimal – 192.168.1.44 – 2 Go de RAM, 2vCPU, disque de 40 Go

Remarque :le cluster etcd peut également être formé en dehors des nœuds maîtres, mais pour cela, nous avons besoin de matériel supplémentaire. J'installe donc etcd dans mes nœuds maîtres.

Configuration minimale requise pour configurer le cluster Highly K8s

  • Installer Kubeadm , kubelet et kubectl sur tous les nœuds maîtres et ouvriers
  • Connectivité réseau entre les nœuds maîtres et nœuds de calcul
  • Connectivité Internet sur tous les nœuds
  • Identifiants root ou utilisateur de privilèges sudo sur tous les nœuds

Passons aux étapes d'installation et de configuration

Étape 1) Définissez le nom d'hôte et ajoutez des entrées dans le fichier /etc/hosts

Exécutez la commande hostnamectl pour définir le nom d'hôte sur chaque nœud, l'exemple est montré pour le nœud k8s-master-1,

$ hostnamectl set-hostname "k8s-master-1"$ exec bash

De même, exécutez la commande ci-dessus sur les nœuds restants et définissez leur nom d'hôte respectif. Une fois le nom d'hôte défini sur tous les nœuds maître et travailleur, ajoutez les entrées suivantes dans /etc/hosts fichier sur tous les nœuds.

192.168.1.40   k8s-master-1192.168.1.41   k8s-master-2192.168.1.42   k8s-master-3192.168.1.43   k8s-worker-1192.168.1.44   k8s-worker-2192.168.1.45 s  vipprek> 

J'ai utilisé une entrée supplémentaire "192.168.1.45   vip-k8s-master" dans le fichier hôte car j'utiliserai cette adresse IP et ce nom d'hôte lors de la configuration de l'haproxy et du keepalive sur tous les nœuds maîtres. Cette IP sera utilisée comme kube-apiserver IP de l'équilibreur de charge. Toute la requête kube-apiserver viendra à cette adresse IP, puis la requête sera distribuée parmi les véritables kube-apiservers backend.

Étape 2) Installez et configurez Keepalive et HAProxy sur tous les nœuds maîtres/plan de contrôle

Installez keepalived et haproxy sur chaque nœud maître à l'aide de la commande yum suivante,

$ sudo yum install haproxy keepalived -y

Configurez d'abord Keepalived sur k8s-master-1, créez le script check_apiserver.sh avec le contenu suivant,

[[email protected] ~]$ sudo vi /etc/keepalived/check_apiserver.sh#!/bin/shAPISERVER_VIP=192.168.1.45APISERVER_DEST_PORT=6443errorExit() {    echo "*** $*" 1>&2    exit 1 }curl --silent --max-time 2 --insecure https://localhost:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Erreur GET https://localhost:${APISERVER_DEST_PORT}/"si adresse IP | grep -q ${APISERVER_VIP} ; puis    curl --silent --max-time 2 --insecure https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Erreur GET https://${APISERVER_VIP} :${APISERVER_DEST_PORT}/"fi

enregistrez et quittez le fichier.

Définir les autorisations exécutables

$ sudo chmod +x /etc/keepalived/check_apiserver.sh

Prenez la sauvegarde du fichier keepalived.conf puis tronquez le fichier.

[[email protected] ~]$ sudo cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-org[[email protected] ~]$ sudo sh -c '> /etc/keepalived/ keepalived.conf'

Collez maintenant le contenu suivant dans le fichier /etc/keepalived/keepalived.conf

[[email protected] ~]$ sudo vi /etc/keepalived/keepalived.conf ! /etc/keepalived/keepalived.conf ! Fichier de configuration pour keepalivedglobal_defs {router_id lvs_devel} vrrp_script check_apiserver {script "/etc/keepalived/check_apiserver.sh" intervalle 3 poids -2 chute 10 Rise 2} vrrp_instance VI_1 {État interface maître Enp0s3 Virtual_Rual protégé]##D321 ! }    virtual_ipaddress {        192.168.1.45/24    }    track_script {        check_apiserver    }}

Enregistrez et fermez le fichier.

Remarque : Seuls deux paramètres de ce fichier doivent être modifiés pour les nœuds master-2 et 3. État deviendra ESCLAVE pour les maîtres 2 et 3, la priorité sera respectivement 254 et 253.

Configurez HAProxy sur le nœud k8s-master-1, modifiez son fichier de configuration et ajoutez le contenu suivant :

[[email protected] ~]$ sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-org

Supprimer toutes les lignes après la section par défaut et ajouter les lignes suivantes

[[email protected] ~]$ sudo vi /etc/haproxy/haproxy.cfg#----------------------- -----------------------------------------# apiserver frontend qui proxys aux maîtres# -------------------------------------------------- -------------------apiserver frontend    bind *:8443    mode tcp    option tcplog    default_backend apiserver#------------------ -------------------------------------------------- -# équilibrage round robin pour apiserver#------------------------------------------------------- ---------------------------backend apiserver    option httpchk GET /healthz    http-check expect status 200    mode tcp    option ssl-hello-chk    balance     roundrobin serveur k8s-master-1 192.168.1.40:6443 vérifier        serveur k8s-master-2 192.168.1.41:6443 vérifier        serveur k8s-master-3 192.168.1.42:6443 vérifier

Enregistrez et quittez le fichier

Copiez maintenant ces trois fichiers (check_apiserver.sh , keepalived.conf et haproxy.cfg) de k8s-master-1 vers k8s-master-2 &3

Exécutez la boucle for suivante pour scp ces fichiers vers master 2 et 3

[[email protected] ~]$ pour f dans k8s-master-2 k8s-master-3 ; faites scp /etc/keepalived/check_apiserver.sh /etc/keepalived/keepalived.conf [email protected]$f:/etc/keepalived ; scp /etc/haproxy/haproxy.cfg [protégé par e-mail]$f:/etc/haproxy ; terminé

Remarque : N'oubliez pas de modifier deux paramètres dans le fichier keepalived.conf dont nous avons parlé ci-dessus pour k8s-master-2 &3

Si le pare-feu s'exécute sur les nœuds maîtres, ajoutez les règles de pare-feu suivantes sur les trois nœuds maîtres

$ sudo firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent$ sudo firewall-cmd --permanent --add-port=8443/tcp$ sudo firewall- cmd --reload

Maintenant, enfin, démarrez et activez le service keepalived et haproxy sur les trois nœuds maîtres à l'aide des commandes suivantes :

$ sudo systemctl enable keepalived --now$ sudo systemctl enable haproxy --now

Une fois ces services démarrés avec succès, vérifiez si VIP (adresse IP virtuelle) est activé sur le nœud k8s-master-1 car nous avons marqué k8s-master-1 comme nœud MASTER dans le fichier de configuration keepalived.

Parfait, la sortie ci-dessus confirme que VIP a été activé sur k8s-master-1.

Étape 3) Désactivez Swap, définissez SELinux comme règles permissives et de pare-feu pour les nœuds maître et travailleur

Désactivez l'espace d'échange sur tous les nœuds, y compris les nœuds de travail, exécutez les commandes suivantes

$ sudo swapoff -a $ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

Définissez SELinux comme permissif sur tous les nœuds maîtres et travailleurs, exécutez les commandes suivantes,

$ sudo setenforce 0$ sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

Règles de pare-feu pour les nœuds maîtres :

Si le pare-feu s'exécute sur des nœuds maîtres, autorisez les ports suivants dans le pare-feu,

Exécutez la commande firewall-cmd suivante sur tous les nœuds maîtres,

$ sudo firewall-cmd --permanent --add-port=6443/tcp$ sudo firewall-cmd --permanent --add-port=2379-2380/tcp$ sudo firewall-cmd --permanent --add -port=10250/tcp$ sudo firewall-cmd --permanent --add-port=10251/tcp$ sudo firewall-cmd --permanent --add-port=10252/tcp$ sudo firewall-cmd --permanent -- add-port=179/tcp$ sudo firewall-cmd --permanent --add-port=4789/udp$ sudo firewall-cmd --reload$ sudo modprobe br_netfilter$ sudo sh -c "echo '1'> /proc/ sys/net/bridge/bridge-nf-call-iptables"$ sudo sh -c "echo '1'> /proc/sys/net/ipv4/ip_forward"

Règles de pare-feu pour les nœuds de travail :

Si le pare-feu s'exécute sur des nœuds de travail, autorisez les ports suivants dans le pare-feu sur tous les nœuds de travail

Exécutez les commandes suivantes sur tous les noeuds worker,

$ sudo firewall-cmd --permanent --add-port=10250/tcp$ sudo firewall-cmd --permanent --add-port=30000-32767/tcp                                                 $ sudo firewall-cmd --permanent --add -port=179/tcp$ sudo firewall-cmd --permanent --add-port=4789/udp$ sudo firewall-cmd --reload$ sudo modprobe br_netfilter$ sudo sh -c "echo '1'> /proc/sys /net/bridge/bridge-nf-call-iptables"$ sudo sh -c "echo '1'> /proc/sys/net/ipv4/ip_forward"

Étape 4) Installer Container Run Time (CRI) Docker sur les nœuds maître et de travail

Installez Docker (Container Run Time) sur tous les nœuds maîtres et nœuds de travail, exécutez la commande suivante,

$ sudo yum install -y yum-utils$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo$ sudo yum install docker-ce -y

Exécutez la commande systemctl suivante pour démarrer et activer le service Docker (exécutez également cette commande sur tous les nœuds maîtres et travailleurs)

$ sudo systemctl enable docker --now

Maintenant, installons kubeadm , kubelet et kubectl à l'étape suivante

Étape 5) Installez Kubeadm, kubelet et kubectl

Installez kubeadm, kubelet et kubectl sur tous les nœuds maîtres ainsi que sur les nœuds de travail. Avant d'installer d'abord ces packages, nous devons configurer le référentiel Kubernetes, exécuter la commande suivante sur chaque nœud maître et nœud de travail,

chat < 

Exécutez maintenant la commande ci-dessous yum pour installer ces packages,

$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

Exécutez la commande systemctl suivante pour activer le service kubelet sur tous les nœuds (nœuds maître et nœuds de travail)

$ sudo systemctl enable kubelet --now

Étape 6) Initialiser le cluster Kubernetes à partir du premier nœud maître

Passez maintenant au premier nœud maître / plan de contrôle et lancez la commande suivante,

[[email protected] ~]$ sudo kubeadm init --control-plane-endpoint "vip-k8s-master:8443" --upload-certs

Dans la commande ci-dessus, –control-plane-endpoint définir le nom DNS et le port pour l'équilibreur de charge (kube-apiserver), dans mon cas, le nom DNS est "vip-k8s-master" et le port est "8443", à part cela '–upload-certs ' partagera automatiquement les certificats entre les nœuds maîtres,

La sortie de la commande kubeadm ressemblerait à ceci :

Excellent, la sortie ci-dessus confirme que le cluster Kubernetes a été initialisé avec succès. En sortie, nous avons également obtenu les commandes pour que d'autres nœuds maîtres et nœuds de travail rejoignent le cluster.

Remarque : Il est recommandé de copier cette sortie dans un fichier texte pour référence future.

Exécutez les commandes suivantes pour permettre à l'utilisateur local d'utiliser la commande kubectl pour interagir avec le cluster,

[[email protected] ~]$ mkdir -p $HOME/.kube[[email protected] ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config[[email protected] ] ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config[[email protected] ~]$

Maintenant, déployons le réseau de pods (CNI - Container Network Interface), dans mon cas, je vais déployer l'addon calico en tant que réseau de pods, exécutez la commande kubectl suivante

[[email protected] ~]$ kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml

Une fois le réseau de pods déployé avec succès, ajoutez les deux nœuds maîtres restants au cluster. Copiez simplement la commande pour que le nœud maître rejoigne le cluster à partir de la sortie et collez-la sur k8s-master-2 et k8s-master-3, l'exemple est illustré ci-dessous

 [[Email Protected] ~] $ sudo kubeadm rejoindre VIP-K8S-Master:8443 --Token Tun848.2hlz8uo37jgy5zqt --Discovery-Token-CA-CERT-HASH SHA256:D035F143D4BEA38D54A3D827729954AB4B1D9631 clé a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4

La sortie serait :

Exécutez également la même commande sur k8s-master-3,

 [[Email Protected] ~] $ sudo kubeadm rejoindre VIP-K8S-Master:8443 --Token Tun848.2hlz8uo37jgy5zqt --Discovery-Token-CA-CERT-HASH SHA256:D035F143D4BEA38D54A3D827729954AB4B1D9631 clé a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4

La sortie serait :

La sortie ci-dessus confirme que k8s-master-3 a également rejoint le cluster avec succès. Vérifions l'état des nœuds à partir de la commande kubectl, allons au nœud master-1 et exécutons la commande ci-dessous,

[[email protected] ~]$ kubectl get nodesNAME           STATUT   ROLES    AGE     VERSIONk8s-master-1   Ready    master   31m     v1.18.6k8s-master-2   Ready    master   10m     v1.18.6k8s-master-3     3 m master [[email protected] ~]$

Parfait, nos trois nœuds maîtres ou de plan de contrôle sont prêts et rejoignent le cluster.

Étape 7) Joindre les nœuds de travail au cluster Kubernetes

Pour joindre des nœuds de travail au cluster, copiez la commande pour le nœud de travail à partir de la sortie et collez-la sur les deux nœuds de travail, l'exemple est illustré ci-dessous :

 [[e-mail protégé] ~] $ sudo kubeadm rejoindre VIP-K8S-Master:8443 --Token Tun848.2hlz8uo37jgy5zqt --Discovery-Token-CA-CERT-HASH SHA256:D035F143D4BEA38D54A3D827729954AB4B1D9631 kubeadm join vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d9620631ee330b8f3fbc70324abc5

La sortie serait quelque chose comme ci-dessous :

Maintenant, dirigez-vous vers le nœud k8s-master-1 et exécutez la commande ci-dessous kubectl pour obtenir les nœuds de travail de statut,

[[email protected] ~]$ kubectl get nodesNAME           STATUT   ROLES    AGE     VERSIONk8s-master-1   Ready    master   43m     v1.18.6k8s-master-2   Ready    master   21m     v1.18.6k8s-master-3            master  k8s-worker-1   Prêt       6m11s   v1.18.6k8s-worker-2   Prêt       5m22s   v1.18.6[[email protected] ~]$

La sortie ci-dessus confirme que les deux nœuds de calcul ont également rejoint le cluster et sont à l'état prêt.

Exécutez la commande ci-dessous pour vérifier l'état des pods infra qui sont déployés dans l'espace de noms kube-system.

[[email protected] ~]$ kubectl get pods -n kube-system

Étape 8) Tester le cluster Kubernetes hautement disponible

Essayons de nous connecter au cluster à partir d'une machine distante (système CentOS) en utilisant le nom et le port DNS de l'équilibreur de charge. Sur la machine distante, nous devons d'abord installer le package kubectl. Exécutez la commande ci-dessous pour définir les référentiels Kubernetes.

chat < 

Ajoutez maintenant l'entrée suivante dans le fichier /etc/host,

192.168.1.45   vip-k8s-master

Créez le répertoire kube et copiez le fichier /etc/kubernetes/admin.conf du nœud k8s-master-1 vers $HOME/.kube/config ,

$ mkdir -p $HOME/.kube$ scp [email protected] :/etc/kubernetes/admin.conf $HOME/.kube/config$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

Exécutez maintenant la commande "kubectl get nodes",

[[email protected] ~]$ kubectl get nodesNAME           STATUT   ROLES    AGE    VERSIONk8s-master-1   Ready    master   3h5m   v1.18.6k8s-master-2   Ready    master   163m   v1.18.6k8s-master-3   1     master  . k8s-worker-1   Prêt       148 m   v1.18.6k8s-worker-2   Prêt       147 m   v1.18.6[[email protected] ~]$

Créons un déploiement avec le nom nginx-lab avec l'image 'nginx ', puis exposez ce déploiement en tant que service de type "NodePort

[[email protected] ~]$ kubectl créer déploiement nginx-lab --image=nginxdeployment.apps/nginx-lab créé[[email protected] ~]$[[email protected] ~]$ kubectl get deployments.apps Nginx-Labname Ready à jour disponible Agenginx-Lab 1/1 1 1 59S [[Protégé par e-mail] ~] $ KUBECTL GET PODSNAME REPEAD STATARTS Agenginx-Lab-5DF4577D49-RZV9Q 1/1 Running 0 68st-844B65666C-PXPKH 1/1     En cours d'exécution   3          154 m[[email protected] ~]$

Essayons de mettre à l'échelle les répliques de 1 à 4, exécutez la commande suivante,

[[email protected] ~]$ kubectl scale deployment nginx-lab --replicas=4deployment.apps/nginx-lab scaled[[email protected] ~]$[[email protected] ~]$ kubectl get deployments.apps nginx-labNAME        PRÊT   À JOUR    DISPONIBLE   AGEnginx-lab   4/4     4            4           3m10s[[email protected] ~]$

Exposez maintenant le déploiement en tant que service, exécutez

[[email protected] ~]$ kubectl expose déploiement nginx-lab --name=nginx-lab --type=NodePort --port=80 --target-port=80service/nginx-lab exposé[[email protected ] ~]$

Obtenez les détails du port et essayez d'accéder au serveur Web nginx à l'aide de curl,

[[email protected] ~]$ kubectl get svc nginx-labNAME        TYPE       CLUSTER-IP     EXTERNAL-IP    PORT(S)        AEnginx-lab   NodePort   10.102.32.29           0 mail s protégés      ]$

Pour accéder au serveur Web nginx, nous pouvons utiliser n'importe quel IP et port de nœud maître ou de travail en tant que "31766"

[[email protected] ~]$ curl http://192.168.1.44:31766

La sortie serait quelque chose comme ci-dessous :

Parfait, cela confirme que nous avons déployé avec succès un cluster Kubernetes hautement disponible avec kubeadm sur les serveurs CentOS 7. N'hésitez pas à partager vos précieux commentaires et commentaires.

Lire aussi  :Comment configurer le contrôleur d'entrée NGINX dans Kubernetes


Linux
  1. Comment configurer un cluster Kubernetes avec Rancher

  2. Comment installer le cluster Kubernetes (k8s) sur RHEL 8

  3. Comment installer Kubernetes (k8s) avec Minikube sur CentOS 8

  4. Configurer le cluster Kubernetes avec Rancher

  5. Configurer le cluster Kubernetes sur Ubuntu 20.04 à l'aide de kubeadm

Comment configurer Percona Cluster avec HAproxy Loadbalancer sur CentOS 7

Comment configurer MariaDB Galera Cluster avec HAproxy sur CentOS 7

Comment configurer le pare-feu avec UFW sous Linux

Comment déployer un cluster Kubernetes sur AWS avec Amazon EKS

Créer un cluster Kubernetes à plan de contrôle unique avec kubeadm

Comment déployer CouchDB en tant que cluster avec Docker