Haute disponibilité de Kubernetes 1.16.2 avec plusieurs nœuds maîtres via kubeadm

Architecture du déploiement

Système d'exploitation : CentOS 7.6

Noyau : 3.10.0-1062.4.1.el7.x86_64

Kubernetes : v1.16.2

Docker CE : 19.03

Configuration matérielle recommandée : 2 cœurs, 4 Go de RAM

Le composant Keepalived assure une adresse IP virtuelle (VIP) haute disponibilité pour l'API Server.

HAProxy répartit la charge entre les instances de l'API Server.

Préparation des nœuds

1. Désactiver SELinux et le pare-feu

sed -ri 's#^SELINUX=.*#SELINUX=disabled#' /etc/selinux/config
setenforce 0
systemctl disable firewalld --now

2. Désactiver l'espace d'échange (swap)

swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

3. Configurer la résolution de noms locale sur chaque machine

cat >> /etc/hosts <<EOF
192.168.1.10 m1
192.168.1.11 m2
192.168.1.12 m3
192.168.1.21 w1
192.168.1.22 w2
EOF

4. Établir l'accès SSH sans mot de passe depuis le nœud de contrôle principal

# Sur le nœud m1
ssh-keygen -t rsa -N ""
for host in m2 m3 w1 w2; do ssh-copy-id $host; done

5. Appliquer les paramètres du noyau nécessaires

cat <<EOF | tee /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
sysctl --system

6. Charger les modules IPVS pour kube-proxy

cat > /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
EOF
systemctl restart systemd-modules-load.service

7. Configurer les dépôts logiciels (yum)

cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Déploiement de l'infrastructure de haute disponibilité

Installer Keepalived et HAProxy sur les nœuds prévus pour héberger le plan de contrôle (m1, m2).

yum install -y keepalived haproxy

Configuration de Keepalived (exemple pour le nœud m1, rôle MASTER) :

vrrp_script check_haproxy {
    script "/usr/bin/killall -0 haproxy"
    interval 2
    weight 20
}

vrrp_instance HA_K8S {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass K8sHA!
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    track_script {
        check_haproxy
    }
}

Configuration identique pour le nœud m2, avec state BACKUP et priority 90.

Configuration de HAProxy sur m1 et m2 :

listen k8s-api
    bind 192.168.1.100:7443
    mode tcp
    balance roundrobin
    timeout server 15m
    timeout connect 15s
    server m1 192.168.1.10:6443 check inter 5s fall 3 rise 2
    server m2 192.168.1.11:6443 check inter 5s fall 3 rise 2
    server m3 192.168.1.12:6443 check inter 5s fall 3 rise 2

Activer et démarrer les servicse :

systemctl enable --now keepalived haproxy

Installation de Kubernetes

Installer les composants requis sur tous les nœuds.

yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 ipvsadm ipset docker-ce-19.03.13
systemctl enable --now docker kubelet

Créer le fichier de configuration d'initialisation (cluster-config.yaml) sur le premier nœud maître (m1).

cat > cluster-config.yaml <<EOF
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.16.2
controlPlaneEndpoint: "192.168.1.100:7443"
networking:
  podSubnet: "10.244.0.0/16"
  serviceSubnet: "10.96.0.0/12"
imageRepository: registry.aliyuncs.com/google_containers
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: "192.168.1.10"
  bindPort: 6443
EOF

Télécharger les images requises et initialiser le cluster sur m1.

kubeadm config images pull --config cluster-config.yaml
kubeadm init --config cluster-config.yaml --upload-certs

Configurer l'accès kubectl pour l'utilisateur courant :

mkdir -p $HOME/.kube
cp -f /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

Ajout des nœuds maîtres supplémentaires

Copier les certificats et le fichier admin.conf depuis m1 vers m2 et m3.

USER=root
MASTERS="m2 m3"
for h in $MASTERS; do
    ssh $USER@$h "mkdir -p /etc/kubernetes/pki/etcd"
    scp /etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/ca.key $USER@$h:/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/sa.key /etc/kubernetes/pki/sa.pub $USER@$h:/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/front-proxy-ca.crt /etc/kubernetes/pki/front-proxy-ca.key $USER@$h:/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/etcd/ca.crt /etc/kubernetes/pki/etcd/ca.key $USER@$h:/etc/kubernetes/pki/etcd/
    scp /etc/kubernetes/admin.conf $USER@$h:/etc/kubernetes/
done

Rejoindre le cluster en tant que nœud maître sur m2 et m3 (les commandes exactes sont fournies par la sortie de kubeadm init).

kubeadm join 192.168.1.100:7443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH> --control-plane --certificate-key <CERT_KEY>

Ajout des nœuds de travail

Rejoindre le cluster sans l'option --control-plane sur w1 et w2.

kubeadm join 192.168.1.100:7443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>

Déploiement du réseau de pods

Installer le plugin réseau Flannel. L'état des nœuds passera à Ready une fois les pods du plugin en fonctionnement.

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Vérifier l'état final du cluster :

kubectl get nodes -o wide
kubectl get pods -A

Étiquettes: kubernetes kubeadm haute disponibilité CentOS HAProxy

Publié le 2 juin à 23h12