GNU/Linux >> Linux Esercitazione >  >> Linux

Come configurare il cluster Kubernetes(k8s) in HA con Kubeadm

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>
pre 

Ho 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 -y

Configura 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}/"fi

salva ed esci dal file.

Imposta le autorizzazioni eseguibili

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

Fai 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-org

Rimuovi 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 verifica

Salva 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; fatto

Nota: 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 --reload

Ora 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 --now

Una 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/fstab

Imposta 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/config

Regole 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 -y

Esegui 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 --now

Ora 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=kubernetes

Esegui il seguente comando systemctl per abilitare il servizio kubelet su tutti i nodi ( nodi master e di lavoro)

$ sudo systemctl enable kubelet --now

Passaggio 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-certs

Nel 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.yaml

Una 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 a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4

L'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 a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4

L'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:d035f143d4bea38d54a3d827729954ab4b1d9620631ee330b8f3fbc70324abc5

L'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   Pronto       6m11s   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-master

Crea 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/config

Ora 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   Pronto       148 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.29           80: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:31766

L'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


Linux
  1. Come configurare un cluster Kubernetes con Rancher

  2. Come installare il cluster Kubernetes (k8s) su RHEL 8

  3. Come installare Kubernetes(k8s) con Minikube su CentOS 8

  4. Imposta il cluster Kubernetes con Rancher

  5. Configura Kubernetes Cluster su Ubuntu 20.04 usando kubeadm

Come configurare il cluster Percona con HAproxy Loadbalancer su CentOS 7

Come configurare MariaDB Galera Cluster con HAproxy su CentOS 7

Come configurare il firewall con UFW su Linux

Come distribuire il cluster Kubernetes su AWS con Amazon EKS

Creazione di un singolo cluster Kubernetes del piano di controllo con kubeadm

Come distribuire CouchDB come cluster con Docker