Když nastavíme Kubernetes (k8s) clusteru on-premises pro produkční prostředí, pak se doporučuje nasadit jej s vysokou dostupností. Zde vysoká dostupnost znamená instalaci řídicí nebo řídicí roviny Kubernetes v HA. V tomto článku ukážu, jak nastavit cluster Kubernetes(k8s) v HA (High Availability) pomocí nástroje kubeadm.
Pro demonstraci jsem použil pět systémů CentOS 7 s následujícími detaily:
- k8s-master-1 – Minimální CentOS 7 – 192.168.1.40 – 2 GB RAM, 2vCPU, 40 GB disk
- k8s-master-2 – Minimální CentOS 7 – 192.168.1.41 – 2 GB RAM, 2vCPU, 40 GB disk
- k8s-master-3 – Minimální CentOS 7 – 192.168.1.42 – 2 GB RAM, 2vCPU, 40 GB disk
- k8s-worker-1 – Minimální CentOS 7 – 192.168.1.43 – 2 GB RAM, 2vCPU, 40 GB disk
- k8s-worker-2 – Minimální CentOS 7 – 192.168.1.44 – 2 GB RAM, 2vCPU, 40 GB disk
Poznámka:cluster etcd lze vytvořit i mimo hlavní uzly, ale k tomu potřebujeme další hardware, takže instaluji etcd do svých hlavních uzlů.
Minimální požadavky pro nastavení clusteru Highly K8s
- Nainstalujte Kubeadm , kubelet a kubectl na všech hlavních a pracovních uzlech
- Síťová konektivita mezi hlavními a pracovními uzly
- Internetové připojení na všech uzlech
- Přihlašovací údaje uživatele nebo oprávnění sudo ve všech uzlech
Pojďme se vrhnout na kroky instalace a konfigurace
Krok 1) Nastavte název hostitele a přidejte položky do souboru /etc/hosts
Spusťte příkaz hostnamectl pro nastavení názvu hostitele na každém uzlu, příklad je uveden pro uzel k8s-master-1,
$ hostnamectl set-hostname "k8s-master-1"$ exec bash
Podobně spusťte výše uvedený příkaz na zbývajících uzlech a nastavte jejich příslušný název hostitele. Jakmile je název hostitele nastaven na všech hlavních a pracovních uzlech, přidejte následující položky do /etc/hosts soubor na všech uzlech.
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.128.165. k8s-188.5.Použil jsem jednu další položku „192.168.1.45 vip-k8s-master“ v hostitelském souboru, protože tuto IP adresu a název hostitele budu používat při konfiguraci haproxy a keepalved na všech hlavních uzlech. Tato IP adresa bude použita jako kube-apiserver load balancer ip. Veškerý požadavek kube-apiserer přijde na tuto IP a poté bude požadavek distribuován mezi skutečné backendové servery kube-apiser.
Krok 2) Nainstalujte a nakonfigurujte Keepalive a HAProxy na všech uzlech hlavní / řídicí roviny
Nainstalujte keepalived a haproxy na každý hlavní uzel pomocí následujícího příkazu yum,
$ sudo yum nainstalovat haproxy keepalived -yNejprve nakonfigurujte Keepalived na k8s-master-1, vytvořte skript check_apiserver.sh s následujícím obsahem,
[[email protected] ~]$ sudo vi /etc/keepalived/check_apiserver.sh#!/bin/shAPISERVER_VIP=192.168.1.45APISERVER_DEST_PORT=6443errorExit() { echo "*** $*" 1>2 }curl --silent --max-time 2 --insecure https://localhost:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Chyba GET https://localhost:${APISERVER_DEST_PORT}/"if ip addr | grep -q ${APISERVER_VIP}; potom curl --silent --max-time 2 --insecure https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Chyba GET https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/"fiuložte a ukončete soubor.
Nastavte oprávnění ke spustitelnému souboru
$ sudo chmod +x /etc/keepalived/check_apiserver.shVezměte zálohu souboru keepalived.conf a poté soubor zkraťte.
[[e-mail chráněný] ~]$ sudo cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-org[[e-mail chráněný] ~]$ sudo sh -c '> /etc/keepalived/ keepalived.conf'Nyní vložte následující obsah do souboru /etc/keepalived/keepalived.conf
[[e-mail chráněný] ~]$ sudo vi /etc/keepalived/keepalived.conf! /etc/keepalived/keepalived.conf! Konfigurační soubor pro KeePalidGlobal_defs {router_id lvs_devel} vrrp_script check_apiserver {skript "/etc/keepalived/check_apiserver.sh" Interval 3 Hmotnost pád 10 RISE 2} Vrrp_instance VI_1 {State Master Interface Enp0s3 chráněno ##D321! } virtual_ipaddress { 192.168.1.45/24 } track_script { check_apiserver }}Uložte a zavřete soubor.
Poznámka: Pro uzly master-2 &3 je třeba změnit pouze dva parametry tohoto souboru. Stát se stane SLAVE pro master 2 a 3 bude priorita 254 a 253.
Nakonfigurujte HAProxy na uzlu k8s-master-1, upravte jeho konfigurační soubor a přidejte následující obsah:
[[email protected] ~]$ sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-orgOdeberte všechny řádky za výchozí sekcí a přidejte následující řádky
[[email protected] ~]$ sudo vi /etc/haproxy/haproxy.cfg#---------------------------- -----------------------------------------# frontend apiserver, který proxy servery masters# -------------------------------------------------- -------------------frontend apiserver bind *:8443 režim tcp možnost tcplog default_backend apiserver#------------------ -------------------------------------------------- -# kruhové vyvažování pro apiserver#------------------------------------------ ----------------------------backend apiserer možnost httpchk GET /healthz http-check očekávaný stav 200 režim tcp možnost ssl-hello-chk zůstatek kruhová obsluha server k8s-master-1 192.168.1.40:6443 kontrola server k8s-master-2 192.168.1.41:6443 kontrola server k8s-master-3 192.168.1.42:6443 kontrolaUložte a ukončete soubor
Nyní zkopírujte tyto tři soubory (check_apiserver.sh, keepalived.conf a haproxy.cfg) z k8s-master-1 do k8s-master-2 &3
Spusťte následující smyčku for a scp tyto soubory na master 2 a 3
[[e-mail chráněný] ~]$ pro f v k8s-master-2 k8s-master-3; do scp /etc/keepalived/check_apiserver.sh /etc/keepalived/keepalived.conf [e-mail chráněný]$f:/etc/keepalived; scp /etc/haproxy/haproxy.cfg [e-mail chráněný]$f:/etc/haproxy; hotovoPoznámka: Nezapomeňte změnit dva parametry v souboru keepalived.conf, který jsme probrali výše pro k8s-master-2 &3
V případě, že firewall běží na hlavních uzlech, přidejte následující pravidla brány firewall na všechny tři hlavní uzly
$ sudo firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent$ sudo firewall-cmd --permanent --add-port=8443/tcp$ sudo firewall- cmd --reloadNyní Konečně spusťte a povolte službu keepalived a haproxy na všech třech hlavních uzlech pomocí následujících příkazů:
$ sudo systemctl povolit keepalived --now$ sudo systemctl povolit haproxy --nowJakmile jsou tyto služby úspěšně spuštěny, ověřte, zda je na uzlu k8s-master-1 povolena VIP (virtuální IP), protože jsme v konfiguračním souboru keepalived označili uzel k8s-master-1 jako MASTER.
Perfektní, výše uvedený výstup potvrzuje, že VIP bylo povoleno na k8s-master-1.
Krok 3) Zakažte Swap, nastavte SELinux jako permisivní a pravidla brány firewall pro hlavní a pracovní uzly
Zakažte Swap Space na všech uzlech včetně pracovních uzlů. Spusťte následující příkazy
$ sudo swapoff -a $ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstabNastavte SELinux jako Permisivní na všech hlavních a pracovních uzlech a spusťte následující příkazy
$ sudo setenforce 0$ sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/configPravidla brány firewall pro hlavní uzly:
V případě, že firewall běží na hlavních uzlech, povolte ve firewallu následující porty,
Spusťte následující příkaz firewall-cmd na všech hlavních uzlech
$ 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"Pravidla brány firewall pro pracovní uzly:
V případě, že firewall běží na pracovních uzlech, povolte následující porty ve bráně firewall na všech pracovních uzlech
Spusťte následující příkazy na všech pracovních uzlech,
$ sudo firewall-cmd --permanent --add-port=10250/tcp$ sudo firewall-cmd --permanent --add-port=30000-32767/tcp -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"Krok 4) Nainstalujte dokovací stanici Container Run Time (CRI) na hlavní a pracovní uzly
Nainstalujte Docker (Container Run Time) na všechny hlavní uzly a pracovní uzly, spusťte následující příkaz,
$ 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 -ySpusťte následující příkaz systemctl pro spuštění a povolení služby docker (Tento příkaz spusťte také na všech hlavních a pracovních uzlech)
$ sudo systemctl povolit docker --nowNyní v dalším kroku nainstalujme kubeadm , kubelet a kubectl
Krok 5) Nainstalujte Kubeadm, kubelet a kubectl
Nainstalujte kubeadm, kubelet a kubectl na všechny hlavní uzly i pracovní uzly. Před instalací těchto balíčků musíme nejprve nakonfigurovat úložiště Kubernetes, spustit následující příkaz na každém hlavním a pracovním uzlu,
kočka <Nyní spusťte níže příkaz yum a nainstalujte tyto balíčky,
$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetesSpusťte následující příkaz systemctl a povolte službu kubelet na všech uzlech (hlavní a pracovní uzly)
$ sudo systemctl povolit kubelet --nowKrok 6) Inicializujte Kubernetes Cluster z prvního hlavního uzlu
Nyní přejděte na první hlavní uzel / řídicí rovinu a zadejte následující příkaz
[[email protected] ~]$ sudo kubeadm init --control-plane-endpoint "vip-k8s-master:8443" --upload-certsVe výše uvedeném příkazu –control-plane-endpoint nastavte název dns a port pro nástroj pro vyrovnávání zatížení (kube-apiserver), v mém případě je název dns „vip-k8s-master“ a port je „8443“, kromě tohoto „–upload-certs ’ bude automaticky sdílet certifikáty mezi hlavními uzly,
Výstup příkazu kubeadm by byl něco jako níže:
Skvělé, výše uvedený výstup potvrzuje, že cluster Kubernetes byl úspěšně inicializován. Ve výstupu jsme také dostali příkazy pro ostatní hlavní a pracovní uzly, aby se připojily ke clusteru.
Poznámka: Doporučujeme zkopírovat tento výstup do textového souboru pro budoucí použití.
Spusťte následující příkazy, abyste umožnili místnímu uživateli používat příkaz kubectl k interakci s clusterem,
[[chráněno e-mailem] ~]$ mkdir -p $HOME/.kube[[chráněno e-mailem] ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config[[chráněno e-mailem ] ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config[[e-mail chráněný] ~]$Nyní nasadíme síť pod (CNI – Container Network Interface), v mém případě nasadím calico addon jako síť podů, spustíme následující příkaz kubectl
[[email protected] ~]$ kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yamlJakmile je síť pod úspěšně nasazena, přidejte zbývající dva hlavní uzly do clusteru. Stačí zkopírovat příkaz pro hlavní uzel pro připojení ke clusteru z výstupu a vložit jej na k8s-master-2 a k8s-master-3, příklad je uveden níže
[Pre> [Ochránce e-mailů] ~] $ sudo kubeadm se připojte k VIP-K8S-Master:8443-TOKEN TUN848.2HLZ8UO37JGY5ZQT-DISCOVERY-TOKEN-CA-CERT-CERT-HASH SHA256:D035F143D4BOLON klíč a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4 Výstup by byl:
Stejný příkaz spusťte také na k8s-master-3,
[Pre> [Ochránce e-mailů] ~] $ sudo kubeadm se připojte k VIP-K8S-Master:8443-TOKEN TUN848.2HLZ8UO37JGY5ZQT-DISCOVERY-TOKEN-CA-CERT-CERT-HASH SHA256:D035F143D4BOLON klíč a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4
Výstup by byl:
Výše uvedený výstup potvrzuje, že k8s-master-3 se také úspěšně připojil ke clusteru. Ověřte stav uzlů z příkazu kubectl, přejděte k uzlu master-1 a spusťte níže uvedený příkaz,
[[email protected] ~]$ kubectl get nodesNAME STAV ROLE VĚK VERSIONk8s-master-1 Připraveno master 31 m - v1.18.6k8s-master-2 4 1 m. 8 m. 8 16 m 3 1 1 8 m 3 [[email protected] ~]$
Perfektní, všechny naše tři uzly hlavní nebo řídicí roviny jsou připraveny a připojí se ke clusteru.
Krok 7) Připojte uzly Worker ke clusteru Kubernetes
Chcete-li připojit pracovní uzly ke clusteru, zkopírujte příkaz pro pracovní uzel z výstupu a vložte jej do obou pracovních uzlů, příklad je uveden níže:
Výstup by byl něco jako níže:
Nyní přejděte do uzlu k8s-master-1 a spusťte pod příkazem kubectl, abyste získali stavové pracovní uzly,
[[email protected] ~]$ kubectl get nodesNAME STAV ROLE VĚK VERSIONk8s-master-1 Připraveno master 43 m - v1.18,6 k8s-master-2 1 -. 1 2 m v 1 8 m 1 1 6 1 1 6 . k8s-worker-1 Připraveno6m11s v1.18.6k8s-worker-2 Připraveno 5m22s v1.18.6[[e-mail chráněno] ~]$
Výše uvedený výstup potvrzuje, že oba pracovníci se také připojili ke clusteru a jsou ve stavu připravenosti.
Spusťte níže uvedený příkaz a ověřte stav infra modulů, které jsou nasazeny ve jmenném prostoru systému kube.
[[email protected] ~]$ kubectl get pods -n kube-system
Krok 8) Otestujte vysoce dostupný cluster Kubernetes
Zkusme se připojit ke clusteru ze vzdáleného počítače (systém CentOS) pomocí názvu DNS a portu nástroje pro vyrovnávání zatížení. Na vzdáleném počítači musíme nejprve nainstalovat balíček kubectl. Spusťte příkaz níže a nastavte úložiště kubernetes.
kočka <Nyní přidejte následující záznam do souboru /etc/host,
192.168.1.45 vip-k8s-masterVytvořte adresář kube a zkopírujte soubor /etc/kubernetes/admin.conf z uzlu k8s-master-1 do $HOME/.kube/config,
$ mkdir -p $HOME/.kube$ scp [e-mail chráněný]:/etc/kubernetes/admin.conf $HOME/.kube/config$ sudo chown $(id -u):$(id -g) $HOME/.kube/configNyní spusťte příkaz „kubectl get nodes“,
[[email protected] ~]$ kubectl get nodesNAME STAV ROLE VĚK VERSIONk8s-master-1 Připraveno master 3h5m v1.18.6k8s-master-2 8 6. 15 m 1 16 15 m master k8s-worker-1 Připraveno148m v1.18.6k8s-worker-2 Připraveno 147m v1.18.6[[e-mail chráněno] ~]$ Pojďme vytvořit nasazení s názvem nginx-lab s obrázkem „nginx “ a poté toto nasazení vystavte jako službu typu „NodePort ”
[[chráněno e-mailem] ~]$ kubectl vytvořit nasazení nginx-lab --image=nginxdeployment.apps/nginx-lab vytvořeno[[chráněno e-mailem] ~]$[[chráněno e-mailem] ~]$ kubectl získat deployments.apps nginx-labName Ready-to-to-date dostupné agenginx-lab 1/1 1 1 59s [[e-mail chráněno] ~] $ kubectl Get Podsname Restarts agenginx-lab-5DF4577d49-rzv9q 1/1 spuštění 0 68Stest-844B6566C-PXPKH 1/1 Běh 3 154 m[[email protected] ~]$Zkusme změnit měřítko replik od 1 do 4, spusťte následující příkaz
[[chráněno e-mailem] ~]$ škálování nasazení kubectl nginx-lab --replicas=4deployment.apps/nginx-lab škálováno[[chráněno e-mailem] ~]$[[chráněno e-mailem] ~]$ kubectl získat deployments.apps nginx-labNAME PŘIPRAVENO AKTUÁLNÍ DOSTUPNÉ AGEnginx-lab 4/4 4 4 3 m10 s[[email chráněno] ~]$Nyní vystavte nasazení jako službu, spusťte
[[chráněno e-mailem] ~]$ kubectl vystavit nasazení nginx-lab --name=nginx-lab --type=NodePort --port=80 --target-port=80service/nginx-lab vystaveno[[e-mail chráněno ] ~]$Získejte podrobnosti o portu a pokuste se získat přístup k webovému serveru nginx pomocí curl,
[[email protected] ~]$ kubectl get svc nginx-labNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx-labPro přístup k webovému serveru nginx můžeme použít jakoukoli IP adresu hlavního nebo pracovního uzlu a port jako „31766“
[[e-mail chráněný] ~]$ curl http://192.168.1.44:31766Výstup by byl něco jako níže:
Perfektní, to potvrzuje, že jsme úspěšně nasadili vysoce dostupný cluster Kubernetes s kubeadm na serverech CentOS 7. Neváhejte se podělit o své cenné zpětné vazby a komentáře.
Přečtěte si také :Jak nastavit NGINX Ingress Controller v Kubernetes
Jak nakonfigurovat trvalý svazek založený na NFS v Kubernetes Jak nastavit Kubernetes Cluster na Google Cloud Platform (GCP)Linux