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.45Ich 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 -yKonfigurieren 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}/"fiSpeichern und beenden Sie die Datei.
Legen Sie die Ausführungsberechtigungen fest
$ sudo chmod +x /etc/keepalived/check_apiserver.shErstellen 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-orgEntfernen 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üfenSpeichern 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; fertigHinweis: 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 --reloadStarten 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/fstabSetzen 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/configFirewallregeln 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 -yFü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 --nowLassen 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=kubernetesFühren Sie den folgenden systemctl-Befehl aus, um den Kubelet-Dienst auf allen Knoten (Master- und Worker-Knoten) zu aktivieren
$ sudo systemctl enable kubelet --nowSchritt 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-certsIm 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.yamlSobald 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 a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4Ausgabe 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 a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4Ausgabe 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:d035f143d4bea38d54a3d827729954ab4b1d9620631ee330b8f3fbc70324abc5Die 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 Bereit6m11s 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-masterErstellen 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/configFü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 Bereit148m 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.2980: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:31766Die 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