GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So richten Sie Kubernetes (k8s)-Cluster in HA mit Kubeadm ein

Wenn wir Kubernetes (k8s) einrichten Cluster vor Ort für die Produktionsumgebung, dann wird empfohlen, ihn mit hoher Verfügbarkeit bereitzustellen. Hochverfügbarkeit bedeutet hier, Kubernetes Master oder Control Plane in HA zu installieren. In diesem Artikel werde ich demonstrieren, wie man Kubernetes(k8s)-Cluster in HA (High Availability) mit dem Dienstprogramm kubeadm einrichtet.

Für die Demonstration habe ich fünf CentOS 7-Systeme mit folgenden Details verwendet:

  • k8s-master-1 – Minimal CentOS 7 – 192.168.1.40 – 2 GB RAM, 2 vCPU, 40 GB Festplatte
  • k8s-master-2 – Minimales CentOS 7 – 192.168.1.41 – 2 GB RAM, 2 vCPU, 40 GB Festplatte
  • k8s-master-3 – Minimal CentOS 7 – 192.168.1.42 – 2 GB RAM, 2 vCPU, 40 GB Festplatte
  • k8s-worker-1 – Minimal CentOS 7 – 192.168.1.43 – 2 GB RAM, 2 vCPU, 40 GB Festplatte
  • k8s-worker-2 – Minimal CentOS 7 – 192.168.1.44 – 2 GB RAM, 2 vCPU, 40 GB Festplatte

Hinweis:etcd-Cluster können auch außerhalb von Master-Knoten gebildet werden, aber dafür benötigen wir zusätzliche Hardware, also installiere ich etcd in meinen Master-Knoten.

Mindestanforderungen für die Einrichtung des Highly K8s-Clusters

  • Installieren Sie Kubeadm , kubelet und kubectl auf allen Master- und Worker-Knoten
  • Netzwerkkonnektivität zwischen Master- und Worker-Knoten
  • Internetverbindung auf allen Knoten
  • Root-Anmeldeinformationen oder Benutzer mit Sudo-Berechtigungen auf allen Knoten

Lassen Sie uns zu den Installations- und Konfigurationsschritten springen

Schritt 1) ​​Legen Sie den Hostnamen fest und fügen Sie Einträge in der Datei /etc/hosts hinzu

Führen Sie den Befehl hostnamectl aus, um den Hostnamen auf jedem Knoten festzulegen. Das Beispiel wird für den Knoten k8s-master-1 gezeigt,

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

Führen Sie in ähnlicher Weise den obigen Befehl auf den verbleibenden Knoten aus und legen Sie deren jeweiligen Hostnamen fest. Sobald der Hostname auf allen Master- und Worker-Knoten festgelegt ist, fügen Sie die folgenden Einträge in /etc/hosts hinzu Datei auf allen Knoten.

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   

Ich habe einen zusätzlichen Eintrag „192.168.1.45   vip-k8s-master“ in der Hostdatei verwendet, da ich diese IP und diesen Hostnamen verwenden werde, während ich den Haproxy konfiguriere und auf allen Master-Knoten am Leben halte. Diese IP wird als kube-apiserver verwendet Load-Balancer-IP. Alle kube-apiserver-Anforderungen kommen an diese IP und dann wird die Anforderung auf die eigentlichen kube-apiserver des Backends verteilt.

Schritt 2) Installieren und konfigurieren Sie Keepalive und HAProxy auf allen Knoten der Master-/Steuerungsebene

Installieren Sie keepalived und haproxy auf jedem Master-Knoten mit dem folgenden yum-Befehl,

$ sudo yum install haproxy keepalived -y

Konfigurieren Sie zuerst Keepalived auf k8s-master-1, erstellen Sie das Skript check_apiserver.sh mit folgendem Inhalt,

[[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 "Fehler GET https://localhost:${APISERVER_DEST_PORT}/"wenn IP-Adresse | grep -q ${APISERVER_VIP}; dann    curl --silent --max-time 2 --insecure https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Fehler beim Abrufen von https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/"fi

Speichern und beenden Sie die Datei.

Legen Sie die Ausführungsberechtigungen fest

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

Erstellen Sie eine Sicherungskopie der Datei keepalived.conf und kürzen Sie die Datei.

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

Fügen Sie nun den folgenden Inhalt in die Datei /etc/keepalived/keepalived.conf ein

[[email protected] ~]$ sudo vi /etc/keepalived/keepalived.conf! /etc/keepalived/keepalived.conf! Konfigurationsdatei für keeptalivedglobal_defs {router_id lvs_devel} vrrp_script check_apiserver {script "/etc/halle/check_apiserver.sh" Intervall 3 Gewicht -2 Fall 10 Anstieg 2} vrrp_instance vi_1 {staatliche Master-Schnittstelle ENP0S3 virtual_router_id 151 Priority 255 Authentifizierung {auth_type pass auth_pass [E-Mail geschützt]##D321! }    virtual_ipaddress {        192.168.1.45/24    }    track_script {        check_apiserver    }}

Speichern und schließen Sie die Datei.

Hinweis: Für Master-2- und Master-3-Knoten müssen nur zwei Parameter dieser Datei geändert werden. Staat wird SKLAVE für Master 2 und 3 ist die Priorität 254 bzw. 253.

Konfigurieren Sie HAProxy auf dem Knoten k8s-master-1, bearbeiten Sie seine Konfigurationsdatei und fügen Sie den folgenden Inhalt hinzu:

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

Entfernen Sie alle Zeilen nach dem Standardabschnitt und fügen Sie die folgenden Zeilen hinzu

[[email protected] ~]$ sudo vi /etc/haproxy/haproxy.cfg##----------------------- -----------------------------------------# API-Server-Frontend, das an die Master weiterleitet# -------------------------------------------------- -------------------frontend apiserver    bind *:8443    mode tcp    option tcplog    default_backend apiserver#------------------ -------------------------------------------------- -# Round-Robin-Balancing für apiserver#------------------------------------------------------- ----------------------Backend-Apiserver    Option httpchk GET /healthz    http-check erwartet Status 200    Modus TCP    Option ssl-hello-chk    Balance     Roundrobin server k8s-master-1 192.168.1.40:6443 prüfen        server k8s-master-2 192.168.1.41:6443 prüfen        server k8s-master-3 192.168.1.42:6443 prüfen

Speichern und beenden Sie die Datei

Kopieren Sie nun diese drei Dateien (check_apiserver.sh , keepalived.conf und haproxy.cfg) von k8s-master-1 nach k8s-master-2 &3

Führen Sie die folgende for-Schleife aus, um diese Dateien per scp an Master 2 und 3 zu senden

[[email protected] ~]$ für f in k8s-master-2 k8s-master-3; do scp /etc/keepalived/check_apiserver.sh /etc/keepalived/keepalived.conf [E-Mail-geschützt]$f:/etc/keepalived; scp /etc/haproxy/haproxy.cfg [E-Mail-geschützt]$f:/etc/haproxy; fertig

Hinweis: Vergessen Sie nicht, zwei Parameter in der Datei keepalived.conf zu ändern, die wir oben für k8s-master-2 &3 besprochen haben

Falls die Firewall auf Master-Knoten ausgeführt wird, fügen Sie die folgenden Firewall-Regeln auf allen drei Master-Knoten hinzu

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

Starten und aktivieren Sie nun endlich den Keepalived- und Haproxy-Dienst auf allen drei Master-Knoten mit den folgenden Befehlen:

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

Überprüfen Sie nach dem erfolgreichen Start dieser Dienste, ob VIP (virtuelle IP) auf dem k8s-master-1-Knoten aktiviert ist, da wir k8s-master-1 als MASTER-Knoten in der Keepalive-Konfigurationsdatei markiert haben.

Perfekt, die obige Ausgabe bestätigt, dass VIP auf k8s-master-1 aktiviert wurde.

Schritt 3) Deaktivieren Sie Swap, legen Sie SELinux als zulässig fest und Firewall-Regeln für Master- und Worker-Knoten

Deaktivieren Sie Swap Space auf allen Knoten, einschließlich Worker-Knoten. Führen Sie die folgenden Befehle aus

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

Setzen Sie SELinux auf allen Master- und Worker-Knoten auf Permissive, führen Sie die folgenden Befehle aus,

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

Firewallregeln für Masterknoten:

Falls die Firewall auf Master-Knoten ausgeführt wird, lassen Sie die folgenden Ports in der Firewall zu,

Führen Sie den folgenden Firewall-cmd-Befehl auf allen Master-Knoten aus,

$ 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"

Firewall-Regeln für Worker-Knoten:

Falls die Firewall auf Worker-Knoten ausgeführt wird, lassen Sie die folgenden Ports in der Firewall auf allen Worker-Knoten zu

Führen Sie die folgenden Befehle auf allen Worker-Knoten aus,

$ sudo firewall-cmd --permanent --add-port=10250/tcp$ sudo firewall-cmd --permanent --add-port=30000-32767/tcp                                                                           $ sudo firewall-cmd --permanent --perman -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"

Schritt 4) Container Run Time (CRI) Docker auf Master- und Worker-Knoten installieren

Installieren Sie Docker (Container Run Time) auf allen Master-Knoten und Worker-Knoten und führen Sie den folgenden Befehl aus:

$ 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

Führen Sie den folgenden systemctl-Befehl aus, um den Docker-Dienst zu starten und zu aktivieren (führen Sie diesen Befehl auch auf allen Master- und Worker-Knoten aus)

$ sudo systemctl enable docker --now

Lassen Sie uns nun im nächsten Schritt kubeadm , kubelet und kubectl installieren

Schritt 5) Kubeadm, kubelet und kubectl installieren

Installieren Sie kubeadm, kubelet und kubectl auf allen Master-Knoten sowie Worker-Knoten. Bevor wir diese Pakete zuerst installieren, müssen wir das Kubernetes-Repository konfigurieren und den folgenden Befehl auf jedem Master- und Worker-Knoten ausführen,

Katze < 

Führen Sie nun den folgenden yum-Befehl aus, um diese Pakete zu installieren,

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

Führen Sie den folgenden systemctl-Befehl aus, um den Kubelet-Dienst auf allen Knoten (Master- und Worker-Knoten) zu aktivieren

$ sudo systemctl enable kubelet --now

Schritt 6) Kubernetes-Cluster vom ersten Master-Knoten initialisieren

Wechseln Sie nun zum ersten Master-Knoten/Steuerebene und geben Sie den folgenden Befehl ein:

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

Im obigen Befehl –control-plane-endpoint DNS-Name und Port für Load Balancer (kube-apiserver) festlegen, in meinem Fall ist DNS-Name „vip-k8s-master“ und Port „8443“, abgesehen davon ‚–upload-certs ’-Option teilt die Zertifikate automatisch unter den Master-Knoten,

Die Ausgabe des kubeadm-Befehls würde in etwa so aussehen:

Großartig, die obige Ausgabe bestätigt, dass der Kubernetes-Cluster erfolgreich initialisiert wurde. In der Ausgabe haben wir auch die Befehle für andere Master- und Worker-Knoten erhalten, um dem Cluster beizutreten.

Hinweis: Es wird empfohlen, diese Ausgabe zum späteren Nachschlagen in eine Textdatei zu kopieren.

Führen Sie die folgenden Befehle aus, damit der lokale Benutzer den kubectl-Befehl verwenden kann, um mit dem Cluster zu interagieren,

[[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] ~]$

Lassen Sie uns nun das Pod-Netzwerk (CNI – Container Network Interface) bereitstellen. In meinem Fall werde ich das Calico-Addon als Pod-Netzwerk bereitstellen und den folgenden kubectl-Befehl ausführen

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

Sobald das Pod-Netzwerk erfolgreich bereitgestellt wurde, fügen Sie dem Cluster die verbleibenden zwei Master-Knoten hinzu. Kopieren Sie einfach den Befehl für den Master-Knoten, um dem Cluster beizutreten, aus der Ausgabe und fügen Sie ihn in k8s-master-2 und k8s-master-3 ein, das Beispiel ist unten gezeigt

 [[E-Mail geschützt] ~] $ sudo kubeadm Join VIP-K8S-MASTER:8443 - DOZE TUN848.2HLZ8UO37JGY5ZQT --discOvery-Token-CA-CERT-HASH SHA256:D035F143D4BEA38D54A3D96272954AB4B1D9620631330B8F3FBC70324ABC5 - Control-Flugzeug - Certificate- Schlüssel a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4

Ausgabe wäre:

Führen Sie denselben Befehl auch auf k8s-master-3 aus,

 [[E-Mail geschützt] ~] $ sudo kubeadm Join VIP-K8S-MASTER:8443 - DOZE TUN848.2HLZ8UO37JGY5ZQT --discOvery-Token-CA-CERT-HASH SHA256:D035F143D4BEA38D54A3D96272954AB4B1D9620631330B8F3FBC70324ABC5 - Control-Flugzeug - Certificate- Schlüssel a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4

Ausgabe wäre:

Die obige Ausgabe bestätigt, dass k8s-master-3 ebenfalls erfolgreich dem Cluster beigetreten ist. Lassen Sie uns den Knotenstatus vom kubectl-Befehl überprüfen, gehen Sie zum Master-1-Knoten und führen Sie den folgenden Befehl aus,

[[email protected] ~]$ kubectl get nodesNAME           STATUS   ROLLEN    AGE     VERSIONk8s-master-1   Bereit    master   31m     v1.18.6k8s-master-2   Bereit    master   10m     v1.  18.6k8s-master-3   Bereit      v1.  18.6k8s-master-3   Bereit    [[email protected] ~]$

Perfekt, alle unsere drei Master- oder Steuerungsebenenknoten sind bereit und treten dem Cluster bei.

Schritt 7) Verbinden Sie Worker-Knoten mit dem Kubernetes-Cluster

Um Worker-Knoten mit dem Cluster zu verbinden, kopieren Sie den Befehl für den Worker-Knoten aus der Ausgabe und fügen Sie ihn auf beiden Worker-Knoten ein, das Beispiel ist unten gezeigt:

 [[E-Mail geschützt] ~] $ sudo kubeadm Join VIP-K8S-MASTER:8443 --Diese Tun848.2HLZ8UO37JGY5ZQT --discous-Token-CA-CERT-HASH SHA256:D035F143D4BeA38D54A3D82772954AB4B1D9620631ABC5 [[E-Mail geschützt] ~] $ sudo kubeadm join vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d9620631ee330b8f3fbc70324abc5

Die Ausgabe würde in etwa so aussehen:

Gehen Sie nun zum k8s-master-1-Knoten und führen Sie den folgenden kubectl-Befehl aus, um Status-Worker-Knoten abzurufen,

[[email protected] ~]$ kubectl get nodesNAME           STATUS   ROLLEN    ALTER     VERSIONk8s-master-1   Bereit    master   43m     v1.18.6k8s-master-2   Bereit    master   21m     v1.  18.6k8s-master-3   Bereit     k8s-worker-1   Bereit       6m11s   v1.18.6k8s-worker-2   Bereit       5m22s   v1.18.6[[email protected] ~]$

Die obige Ausgabe bestätigt, dass beide Worker ebenfalls dem Cluster beigetreten sind und bereit sind.

Führen Sie den folgenden Befehl aus, um den Status der Infra-Pods zu überprüfen, die im kube-system-Namespace bereitgestellt werden.

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

Schritt 8) Hochverfügbaren Kubernetes-Cluster testen

Versuchen wir, eine Verbindung zum Cluster von einem Remote-Computer (CentOS-System) mithilfe des DNS-Namens und -Ports des Load Balancers herzustellen. Auf dem Remote-Computer müssen wir zuerst das kubectl-Paket installieren. Führen Sie den folgenden Befehl aus, um Kubernetes-Repositories festzulegen.

Katze < 

Fügen Sie nun den folgenden Eintrag in der /etc/host-Datei hinzu,

192.168.1.45   vip-k8s-master

Erstellen Sie das kube-Verzeichnis und kopieren Sie die Datei /etc/kubernetes/admin.conf vom k8s-master-1-Knoten nach $HOME/.kube/config ,

$ mkdir -p $HOME/.kube$ scp [E-Mail-geschützt]:/etc/kubernetes/admin.conf $HOME/.kube/config$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

Führen Sie nun den Befehl „kubectl get nodes“ aus,

[[email protected] ~]$ kubectl get nodesNAME           STATUS   ROLLEN    ALTER    VERSIONk8s-master-1   Bereit    master   3h5m   v1.18.6k8s-master-2   Bereit    master   163m   v1.18.6k8s-master-3   Bereit   m  8.1.1.1.1 k8s-worker-1   Bereit       148m   v1.18.6k8s-worker-2   Bereit       147m   v1.18.6[[email protected] ~]$

Lassen Sie uns eine Bereitstellung mit dem Namen nginx-lab erstellen mit dem Bild „nginx “ und stellen Sie diese Bereitstellung dann als Dienst des Typs „NodePort bereit ”

[[email protected] ~]$ kubectl create deploy nginx-lab --image=nginxdeployment.apps/nginx-lab created[[email protected] ~]$[[email protected] ~]$ kubectl get deploys.apps NginX-Labname Ready Up-tat-of-Date verfügbar Agenginx-Lab 1/1 1 1 59s [[E-Mail geschützt] ~] $ kubectl Erhalten Sie PodsName READY STATUS RESTARDS AGENGINX-LAB-5DF4577D49-RZV9Q 1/1 Laufen 0 68Stest-844B65666C-PXPKH 1/1     Läuft   3          154 m[[email protected] ~]$

Lassen Sie uns versuchen, Replikate von 1 auf 4 zu skalieren, führen Sie den folgenden Befehl aus,

[[email protected] ~]$ kubectl scale deploy nginx-lab --replicas=4deployment.apps/nginx-lab scaled[[email protected] ~]$[[email protected] ~]$ kubectl get deploys.apps nginx-labNAME        BEREIT   AKTUELL   VERFÜGBAR   AGEnginx-lab   4/4     4            4           3m10s[[email protected] ~]$

Stellen Sie nun die Bereitstellung als Dienst bereit, führen Sie

aus
[[E-Mail geschützt] ~]$ kubectl Expose Bereitstellung nginx-lab --name=nginx-lab --type=NodePort --port=80 --target-port=80service/nginx-lab ausgesetzt[[email protected ] ~]$

Rufen Sie die Portdetails ab und versuchen Sie, mit curl auf den Nginx-Webserver zuzugreifen,

[[email protected] ~]$ kubectl get svc nginx-labNAME        TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGenginx-lab   NodePort   10.102.32.29           80:31766/TCP [  protecte email] ]$

Um auf den Nginx-Webserver zuzugreifen, können wir die IP und den Port eines beliebigen Master- oder Worker-Knotens als „31766“ verwenden

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

Die Ausgabe würde in etwa so aussehen:

Perfekt, das bestätigt, dass wir hochverfügbare Kubernetes-Cluster mit kubeadm erfolgreich auf CentOS 7-Servern bereitgestellt haben. Bitte zögern Sie nicht, Ihr wertvolles Feedback und Ihre Kommentare zu teilen.

Auch lesen :So richten Sie den NGINX Ingress Controller in Kubernetes ein


Linux
  1. So richten Sie einen Kubernetes-Cluster mit Rancher ein

  2. So installieren Sie Kubernetes (k8s)-Cluster auf RHEL 8

  3. So installieren Sie Kubernetes (k8s) mit Minikube unter CentOS 8

  4. Kubernetes-Cluster mit Rancher einrichten

  5. Kubernetes-Cluster unter Ubuntu 20.04 mit kubeadm einrichten

So richten Sie Percona-Cluster mit HAproxy Loadbalancer unter CentOS 7 ein

So richten Sie MariaDB Galera Cluster mit HAproxy unter CentOS 7 ein

So richten Sie eine Firewall mit UFW unter Linux ein

So stellen Sie Kubernetes-Cluster auf AWS mit Amazon EKS bereit

Erstellen eines einzelnen Kubernetes-Clusters auf Steuerungsebene mit kubeadm

So stellen Sie CouchDB als Cluster mit Docker bereit