Configuration d'un cluster Kubernetes hautement disponible avec NGINX et Keepalived

Planification de l'environnement Kubernetes

La mise en place d'un cluster Kubernetes haute disponibilité nécessite une planification minutieuse des composants réseau et de l'infrastructure sous-jacente.

Déploiement de l'équilibreur de charge NGINX avec le module stream

Configuration de deux serveurs NGINX (10.192.27.111 et 10.192.27.112) pour la répartition de charge de niveau 4.

# Création du dépôt NGINX
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=NGINX Stable Repository
baseurl=https://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
EOF

# Installation de NGINX
yum install -y nginx

Configuration du fichier nginx.conf pour le load balancing des API servers Kubernetes :

user nginx;
worker_processes auto;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

stream {
    log_format k8s_log '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
    access_log /var/log/nginx/k8s-stream.log k8s_log;

    upstream k8s_api_servers {
        server 10.192.27.100:6443;  # Premier master
        server 10.192.27.114:6443;  # Second master
    }
    
    server {
        listen 6443;
        proxy_pass k8s_api_servers;
        proxy_timeout 3s;
    }
}

http {
    # Configuration HTTP standard
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    # ... configuration HTTP restante
}

Démarrage et activation du service NGINX :

systemctl enable --now nginx
netstat -tulpn | grep 6443

Copie de la configuration vers le second serveur NGINX :

# Sur NGINX01
echo "nginx-primary" > /usr/share/nginx/html/index.html
scp /etc/nginx/nginx.conf root@10.192.27.112:/etc/nginx/

# Sur NGINX02
systemctl enable --now nginx
echo "nginx-secondary" > /usr/share/nginx/html/index.html

Implémentation de Keepalived pour la haute disponibilité

Configuration du nœud principal (NGINX01)

yum install -y keepalived

Configuration de Keepalived :

vrrp_script verify_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight 20
}

vrrp_instance K8S_VIP {
    state MASTER
    interface eth0
    virtual_router_id 88
    priority 150
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass secure123
    }
    
    virtual_ipaddress {
        10.192.27.117/24
    }
    
    track_script {
        verify_nginx
    }
}

Script de vérification NGINX :

#!/bin/bash
nginx_processes=$(pgrep -c nginx)

if [ $nginx_processes -eq 0 ]; then
    systemctl stop keepalived
    exit 1
fi

exit 0

Configuration du nœud secondaire (NGINX02)

vrrp_instance K8S_VIP {
    state BACKUP
    interface eth0
    virtual_router_id 88
    priority 100
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass secure123
    }
    
    virtual_ipaddress {
        10.192.27.117/24
    }
    
    track_script {
        verify_nginx
    }
}

Tests de basculement

# Test d'arrêt de NGINX sur le nœud principal
pkill nginx

# Vérification du transfert de l'IP virtuelle
ip addr show eth0 | grep 10.192.27.117

# Redémarrage des services
systemctl restart nginx keepalived

Configuration des nœuds worker pour utiliser le VIP

Modification des fichiers de configuration kubeconfig pour pointer vers l'IP virtuelle :

# Modification des endpoints API
sed -i 's/10.192.27.100:6443/10.192.27.117:6443/g' /opt/kubernetes/cfg/*.kubeconfig

# Redémarrage des services
systemctl restart kubelet kube-proxy

Vérification du trafic dans les logs NGINX :

tail -f /var/log/nginx/k8s-stream.log

Étiquettes: kubernetes nginx Keepalived HauteDisponibilité LoadBalancing

Publié le 30 août à 20h17