Quando impostiamo Kubernetes (k8s) cluster in locale per l'ambiente di produzione, quindi si consiglia di distribuirlo in alta disponibilità. Qui alta disponibilità significa installare il master o il control plane Kubernetes in HA. In questo articolo mostrerò come configurare il cluster Kubernetes(k8s) in HA (High Availability) con l'utilità kubeadm.
Per la dimostrazione, ho utilizzato cinque sistemi CentOS 7 con i seguenti dettagli:
- k8s-master-1 – CentOS 7 minimo – 192.168.1.40 – 2 GB di RAM, 2vCPU, disco da 40 GB
- k8s-master-2 – CentOS 7 minimo – 192.168.1.41 – 2 GB di RAM, 2vCPU, disco da 40 GB
- k8s-master-3 – CentOS 7 minimo – 192.168.1.42 – 2 GB di RAM, 2vCPU, disco da 40 GB
- k8s-worker-1 – CentOS 7 minimo – 192.168.1.43 – 2 GB di RAM, 2vCPU, disco da 40 GB
- k8s-worker-2 – CentOS 7 minimo – 192.168.1.44 – 2 GB di RAM, 2vCPU, disco da 40 GB
Nota:il cluster etcd può essere formato anche al di fuori dei nodi master, ma per questo abbiamo bisogno di hardware aggiuntivo, quindi sto installando etcd all'interno dei miei nodi master.
Requisiti minimi per la configurazione del cluster Highly K8s
- Installa Kubeadm , kubelet e kubectl su tutti i nodi master e worker
- Connettività di rete tra nodi master e nodi di lavoro
- Connettività Internet su tutti i nodi
- Credenziali di root o privilegi sudo utente su tutti i nodi
Passiamo ai passaggi di installazione e configurazione
Fase 1) Imposta il nome host e aggiungi le voci nel file /etc/hosts
Esegui il comando hostnamectl per impostare il nome host su ciascun nodo, viene mostrato un esempio per il nodo k8s-master-1,
$ hostnamectl set-hostname "k8s-master-1"$ exec bash
Allo stesso modo, esegui il comando sopra sui nodi rimanenti e imposta il rispettivo nome host. Una volta impostato il nome host su tutti i nodi master e di lavoro, aggiungi le seguenti voci in /etc/hosts file su tutti i nodi.
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-k8 vip> preHo utilizzato una voce aggiuntiva "192.168.1.45 vip-k8s-master" nel file host perché utilizzerò questo IP e questo nome host durante la configurazione dell'haproxy e il mantenimento in vita su tutti i nodi master. Questo IP verrà utilizzato come kube-apiserver bilanciatore di carico ip. Tutte le richieste di kube-apiserver arriveranno a questo IP e quindi la richiesta verrà distribuita tra i kube-apiserver effettivi di back-end.
Fase 2) Installa e configura Keepalive e HAProxy su tutti i nodi del piano di controllo/master
Installa keepalived e haproxy su ogni nodo master usando il seguente comando yum,
$ sudo yum install haproxy keepalived -yConfigura prima Keepalived su k8s-master-1, crea lo script check_apiserver.sh con i seguenti contenuti,
[[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 "Errore GET https://localhost:${APISERVER_DEST_PORT}/"if ip addr | grep -q ${APISERVER_VIP}; quindi curl --silent --max-time 2 --insecure https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Errore GET https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/"fisalva ed esci dal file.
Imposta le autorizzazioni eseguibili
$ sudo chmod +x /etc/keepalived/check_apiserver.shFai il backup del file keepalived.conf e poi tronca il file.
[[email protetta] ~]$ sudo cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-org[[email protetta] ~]$ sudo sh -c '> /etc/keepalived/ keepalived.conf'Ora incolla il seguente contenuto nel file /etc/keepalived/keepalived.conf
[[email protetta] ~]$ sudo vi /etc/keepalived/keepalived.conf! /etc/keepalived/keepalived.conf! File di configurazione per KeepLivedGlobal_Defs {router_id lvs_devel} vrrp_script check_apiserver {script "/etc/ekeepalived/check_apiserver.sh" Interval 151 peso -2 autunno 10 Rise 2} vrrp_instance VI_1 AUTYPE {email ematica ematica ematica ematica ematica ematica ematica ematica {email AUTYPE AUTHATY AUTHATHEMATHE AUTHATY AUTHATY AUTHATHATH AUTHATHATH AUTHATHATH AUTHATHATH protetto]##D321! } virtual_ipaddress { 192.168.1.45/24 } track_script { check_apiserver }}Salva e chiudi il file.
Nota: Solo due parametri di questo file devono essere modificati per i nodi master-2 e 3. Stato diventerà SLAVE per i master 2 e 3 la priorità sarà rispettivamente 254 e 253.
Configura HAProxy sul nodo k8s-master-1, modifica il suo file di configurazione e aggiungi i seguenti contenuti:
[[email protetta] ~]$ sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-orgRimuovi tutte le righe dopo la sezione predefinita e aggiungi le righe seguenti
[[email protetta] ~]$ sudo vi /etc/haproxy/haproxy.cfg#------------------------------------------ -----------------------------------------# frontend apiserver che fa proxy ai master# -------------------------------------------------- ------------------- frontend apiserver bind *:8443 modalità tcp opzione tcplog default_backend apiserver#------------------ -------------------------------------------------- -# bilanciamento round robin per apiserver#----------------------------------------- ---------------------------backend apiserver opzione httpchk GET /healthz http-check Expect status 200 modalità tcp opzione ssl-hello-chk balance roundrobin server k8s-master-1 192.168.1.40:6443 verifica server k8s-master-2 192.168.1.41:6443 verifica server k8s-master-3 192.168.1.42:6443 verificaSalva ed esci dal file
Ora copia questi tre file (check_apiserver.sh , keepalived.conf e haproxy.cfg) da k8s-master-1 a k8s-master-2 e 3
Esegui il seguente ciclo for per scp questi file su master 2 e 3
[[email protetta] ~]$ per f in k8s-master-2 k8s-master-3; do scp /etc/keepalived/check_apiserver.sh /etc/keepalived/keepalived.conf [email protetta]$f:/etc/keepalived; scp /etc/haproxy/haproxy.cfg [email protetta]$f:/etc/haproxy; fattoNota: Non dimenticare di modificare due parametri nel file keepalived.conf di cui abbiamo discusso sopra per k8s-master-2 e 3
Nel caso in cui il firewall sia in esecuzione su nodi master, aggiungi le seguenti regole firewall su tutti e tre i nodi master
$ sudo firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent$ sudo firewall-cmd --permanent --add-port=8443/tcp$ sudo firewall- cmd --reloadOra finalmente avvia e abilita il servizio keepalived e haproxy su tutti e tre i nodi master usando i seguenti comandi:
$ sudo systemctl abilita keepalived --now$ sudo systemctl abilita haproxy --nowUna volta che questi servizi sono stati avviati correttamente, verifica se VIP (IP virtuale) è abilitato sul nodo k8s-master-1 perché abbiamo contrassegnato k8s-master-1 come nodo MASTER nel file di configurazione keepalive.
Perfetto, l'output sopra conferma che VIP è stato abilitato su k8s-master-1.
Passaggio 3) Disabilita Swap, imposta SELinux come regole permissive e firewall per i nodi Master e di lavoro
Disabilita lo spazio di scambio su tutti i nodi inclusi i nodi di lavoro, esegui i seguenti comandi
$ sudo swapoff -a $ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstabImposta SELinux come Permissive su tutti i nodi master e worker, esegui i seguenti comandi,
$ sudo setenforce 0$ sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissivo/' /etc/selinux/configRegole firewall per i nodi principali:
Nel caso in cui il firewall sia in esecuzione su nodi master, consenti le seguenti porte nel firewall,
Esegui il seguente comando firewall-cmd su tutti i nodi master,
$ 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"Regole firewall per nodi di lavoro:
Nel caso in cui il firewall sia in esecuzione sui nodi di lavoro, consenti le seguenti porte nel firewall su tutti i nodi di lavoro
Esegui i seguenti comandi su tutti i nodi di lavoro,
$ 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"Passaggio 4) Installa la finestra mobile Container Run Time (CRI) sui nodi Master e Worker
Installa Docker (Container Run Time) su tutti i nodi master e nodi di lavoro, esegui il comando seguente,
$ 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 -yEsegui il seguente comando systemctl per avviare e abilitare il servizio docker (esegui anche questo comando su tutti i nodi master e di lavoro)
$ sudo systemctl enable docker --nowOra installiamo kubeadm , kubelet e kubectl nel passaggio successivo
Passaggio 5) Installa Kubeadm, kubelet e kubectl
Installa kubeadm, kubelet e kubectl su tutti i nodi master e nodi di lavoro. Prima di installare questi pacchetti, dobbiamo configurare il repository Kubernetes, eseguire il comando seguente su ogni nodo master e nodo di lavoro,
gatto <Ora esegui sotto il comando yum per installare questi pacchetti,
$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetesEsegui il seguente comando systemctl per abilitare il servizio kubelet su tutti i nodi ( nodi master e di lavoro)
$ sudo systemctl enable kubelet --nowPassaggio 6) Inizializza il cluster Kubernetes dal primo nodo master
Passare ora al primo nodo master/piano di controllo ed emettere il seguente comando,
[[email protected] ~]$ sudo kubeadm init --control-plane-endpoint "vip-k8s-master:8443" --upload-certsNel comando precedente, –control-plane-endpoint imposta il nome e la porta del DNS per il bilanciamento del carico (kube-apiserver), nel mio caso il nome del DNS è "vip-k8s-master" e la porta è "8443", a parte questo "–upload-certs ' l'opzione condividerà automaticamente i certificati tra i nodi master,
L'output del comando kubeadm sarebbe simile al seguente:
Ottimo, l'output sopra conferma che il cluster Kubernetes è stato inizializzato correttamente. In output abbiamo anche ottenuto i comandi per altri nodi master e di lavoro per unirsi al cluster.
Nota: Si consiglia di copiare questo output in un file di testo per riferimenti futuri.
Esegui i seguenti comandi per consentire all'utente locale di utilizzare il comando kubectl per interagire con il cluster
[[email protetta] ~]$ mkdir -p $HOME/.kube[[email protetta] ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config[[email protetta ] ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config[[email protected] ~]$Ora, distribuiamo la rete pod (CNI - Container Network Interface), nel mio caso distribuirò l'addon calico come rete pod, eseguirò seguendo il comando kubectl
[[email protected] ~]$ kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yamlUna volta che la rete pod è stata distribuita correttamente, aggiungi i restanti due nodi master al cluster. Basta copiare il comando per il nodo master per unirsi al cluster dall'output e incollarlo su k8s-master-2 e k8s-master-3, l'esempio è mostrato di seguito
[[email protected] ~]$ sudo kubeadm join vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d96206313f-certificate30b82abcificaf5- --certifica30b820631---------------------------------------------------------------------------------------------------------") chiave a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4L'output sarebbe:
Esegui lo stesso comando anche su k8s-master-3,
[[email protected] ~]$ sudo kubeadm join vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d96206313f-certificate30b82abcificaf5- --certifica30b820631---------------------------------------------------------------------------------------------------------") chiave a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4L'output sarebbe:
L'output sopra conferma che anche k8s-master-3 è entrato a far parte del cluster con successo. Verifichiamo lo stato dei nodi dal comando kubectl, andiamo al nodo master-1 ed eseguiamo il comando seguente,
[[email protected] ~]$ kubectl get nodesNAME STATUS ROLES AGE VERSIONk8s-master-1 Pronto master 31m v1.18.6k8s-master-2 Pronto master 10 m v1.18.6k8s-1 3 m3 1 Pronto [[email protetta] ~]$Perfetto, tutti e tre i nostri nodi master o control plane sono pronti e si uniscono al cluster.
Passaggio 7) Unisci i nodi di lavoro al cluster Kubernetes
Per unire i nodi di lavoro al cluster, copia il comando per il nodo di lavoro dall'output e incollalo su entrambi i nodi di lavoro, l'esempio è mostrato di seguito:
[[email protected] ~] $ sudo kubeadm parte dei VIP-K8S-master:8443 --token tun848.2hlz8uo37jgy5zqt --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d9620631ee330b8f3fbc70324abc5 [[email protected] ~] $ sudo kubeadm join vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d9620631ee330b8f3fbc70324abc5L'output sarebbe simile al seguente:
Ora vai al nodo k8s-master-1 ed esegui sotto il comando kubectl per ottenere i nodi di stato di lavoro,
[[email protected] ~]$ kubectl get nodesNAME STATUS ROLES AGE VERSIONk8s-master-1 Pronto master 43m v1.18.6k8s-master-2 Pronto master 21 m v1.18.6k8s-1 3 1 Pronto 1 1 . 3 1 k8s-worker-1 Pronto6m11s v1.18.6k8s-worker-2 Pronto 5m22s v1.18.6[[email protected] ~]$ L'output di cui sopra conferma che anche entrambi i lavoratori sono entrati a far parte del cluster e sono in stato di pronto.
Esegui il comando seguente per verificare lo stato degli infra pod che sono distribuiti nello spazio dei nomi kube-system.
[[email protetta] ~]$ kubectl get pods -n kube-system
Passaggio 8) Prova il cluster Kubernetes ad alta disponibilità
Proviamo a connetterci al cluster da macchina remota (sistema CentOS) utilizzando il nome DNS e la porta del bilanciamento del carico. Prima sul computer remoto, dobbiamo installare il pacchetto kubectl. Esegui il comando seguente per impostare i repository kubernetes.
gatto <Ora aggiungi la seguente voce nel file /etc/host,
192.168.1.45 vip-k8s-masterCrea la directory kube e copia il file /etc/kubernetes/admin.conf dal nodo k8s-master-1 a $HOME/.kube/config ,
$ mkdir -p $HOME/.kube$ scp [email protetta]:/etc/kubernetes/admin.conf $HOME/.kube/config$ sudo chown $(id -u):$(id -g) $HOME/.kube/configOra esegui il comando "kubectl get nodes",
[[email protected] ~]$ kubectl get nodesNAME STATUS ROLES AGE VERSIONk8s-master-1 Pronto master 3h5m v1.18.6k8s-master-2 Pronto master 163m v1.18.6k8s-master-3 8. k8s-worker-1 Pronto148 milioni v1.18.6k8s-worker-2 Pronto 147 milioni v1.18.6[[email protected] ~]$ Creiamo una distribuzione con il nome nginx-lab con l'immagine 'nginx ' e quindi esporre questa distribuzione come servizio di tipo "NodePort ”
[[email protected] ~]$ kubectl create deployment nginx-lab --image=nginxdeployment.apps/nginx-lab create[[email protected] ~]$[[email protected] ~]$ kubectl get deployments.apps nginx-labname pronto per la date disponibile AGENGINX-LAB 1/1 1 59S [[Email Protected] ~] $ Kubectl Ottieni PodsName Ready Status Riavvia Agenginx-LAB-5DF4577D49-RZV9Q 1/1 in esecuzione 0 68Stest-844B6566CC-PXPKH 1/1 In esecuzione 3 154m[[email protected] ~]$Proviamo a ridimensionare le repliche da 1 a 4, esegui il comando seguente,
[[email protected] ~]$ kubectl scale deployment nginx-lab --replicas=4deployment.apps/nginx-lab scaled[[email protected] ~]$[[email protected] ~]$ kubectl get deployments.apps nginx-labNAME PRONTO AGGIORNATO DISPONIBILE AGEnginx-lab 4/4 4 4 3m10s[[email protected] ~]$Ora esponi la distribuzione come servizio, esegui
[[email protected] ~]$ kubectl esporre la distribuzione nginx-lab --name=nginx-lab --type=NodePort --port=80 --target-port=80service/nginx-lab esposto[[email protected ] ~]$Ottieni i dettagli della porta e prova ad accedere al server web nginx usando curl,
[[email protected] ~]$ kubectl get svc nginx-labNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx-lab NodePort 10.102.32.2980:31766/TCP[s] ]$ Per accedere al server web nginx possiamo utilizzare qualsiasi indirizzo IP e porta del nodo master o di lavoro come "31766"
[[email protetta] ~]$ curl http://192.168.1.44:31766L'output sarebbe simile al seguente:
Perfetto, questa è la conferma che abbiamo distribuito con successo il cluster Kubernetes ad alta disponibilità con kubeadm sui server CentOS 7. Non esitare a condividere i tuoi preziosi feedback e commenti.
Leggi anche :Come configurare il controller di ingresso NGINX in Kubernetes