揭秘高效部署:用KubeKey輕松搭建K8s v1.29.3高可用集群
高可用 Kubernetes 集群能夠確保應(yīng)用程序在運(yùn)行時(shí)不會(huì)出現(xiàn)服務(wù)中斷,這也是生產(chǎn)的需求之一。為此,有很多方法可供選擇以實(shí)現(xiàn)高可用。本教程演示了如何配置 Keepalived 和 HAproxy 使負(fù)載均衡、實(shí)現(xiàn)高可用。步驟如下:
- 準(zhǔn)備主機(jī)。
- 配置 Keepalived 和 HAproxy。
- 使用 KubeKey 創(chuàng)建 Kubernetes 集群。
集群架構(gòu)
示例集群有三個(gè)主節(jié)點(diǎn),三個(gè)工作節(jié)點(diǎn),兩個(gè)用于負(fù)載均衡的節(jié)點(diǎn),以及一個(gè)虛擬 IP 地址。本示例中的虛擬 IP 地址也可稱為“浮動(dòng) IP 地址”。這意味著在節(jié)點(diǎn)故障的情況下,該 IP 地址可在節(jié)點(diǎn)之間漂移,從而實(shí)現(xiàn)高可用。
集群架構(gòu)
請(qǐng)注意,在本示例中,Keepalived 和 HAproxy 沒(méi)有安裝在任何主節(jié)點(diǎn)上。但您也可以這樣做,并同時(shí)實(shí)現(xiàn)高可用。然而,配置兩個(gè)用于負(fù)載均衡的特定節(jié)點(diǎn)(您可以按需增加更多此類節(jié)點(diǎn))會(huì)更加安全。這兩個(gè)節(jié)點(diǎn)上只安裝 Keepalived 和 HAproxy,以避免與任何 Kubernetes 組件和服務(wù)的潛在沖突。
準(zhǔn)備主機(jī)
IP 地址 | 主機(jī)名 | 角色 |
192.168.1.241 | lb1 | Keepalived & HAproxy |
192.168.1.242 | lb2 | Keepalived & HAproxy |
192.168.1.243 | master1 | master, etcd,worker |
192.168.1.244 | master2 | master, etcd,worker |
192.168.1.245 | master3 | master, etcd,worker |
192.168.250 | 虛擬 IP 地址 |
操作系統(tǒng)基礎(chǔ)配置
(1) 配置主機(jī)名:
hostnamectl hostname master1
(2) 配置服務(wù)器時(shí)區(qū)
timedatectl set-timezone Asia/Shanghai
(3) 配置時(shí)間同步
安裝 chrony 作為時(shí)間同步軟件:
apt install chrony -y
編輯配置文件 /etc/chrony.conf,修改 ntp 服務(wù)器配置:
sed -i 's/pool.*/pool cn.pool.ntp.org iburst/g' /etc/chrony/chrony.conf
重啟并設(shè)置 chrony 服務(wù)開(kāi)機(jī)自啟動(dòng):
systemctl enable chronyd
(4) 安裝系統(tǒng)依賴
apt install curl socat conntrack ebtables ipset ipvsadm -y
配置負(fù)載均衡
Keepalived[1] 提供 VRRP 實(shí)現(xiàn),并允許您配置 Linux 機(jī)器使負(fù)載均衡,預(yù)防單點(diǎn)故障。HAProxy[2] 提供可靠、高性能的負(fù)載均衡,能與 Keepalived 完美配合。由于 lb1 和 lb2 上安裝了 Keepalived 和 HAproxy,如果其中一個(gè)節(jié)點(diǎn)故障,虛擬 IP 地址(即浮動(dòng) IP 地址)將自動(dòng)與另一個(gè)節(jié)點(diǎn)關(guān)聯(lián),使集群仍然可以正常運(yùn)行,從而實(shí)現(xiàn)高可用。若有需要,也可以此為目的,添加更多安裝 Keepalived 和 HAproxy 的節(jié)點(diǎn)。先運(yùn)行以下命令安裝 Keepalived 和 HAproxy。
apt install keepalived haproxy psmisc -y
1.HAproxy
(1) 在兩臺(tái)用于負(fù)載均衡的機(jī)器上運(yùn)行以下命令以配置 Proxy(兩臺(tái)機(jī)器的 Proxy 配置相同):
vi /etc/haproxy/haproxy.cfg
(2) 以下是示例配置,供您參考:
global
log /dev/log local0 warning
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
log global
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend kube-apiserver
bind *:6443
mode tcp
option tcplog
default_backend kube-apiserver
backend kube-apiserver
mode tcp
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
server kube-apiserver-1 192.168.1.243:6443 check # Replace the IP address with your own.
server kube-apiserver-2 192.168.1.244:6443 check # Replace the IP address with your own.
server kube-apiserver-3 192.168.1.245:6443 check # Replace the IP address with your own.
(3) 保存文件并運(yùn)行以下命令以重啟 HAproxy。
systemctl restart haproxy
(4) 使 HAproxy 在開(kāi)機(jī)后自動(dòng)運(yùn)行
systemctl enable haproxy
(5) 確保您在另一臺(tái)機(jī)器 (master2) 上也配置了 HAproxy。
2.Keepalived
兩臺(tái)機(jī)器上必須都安裝 Keepalived,但在配置上略有不同。
(1) 運(yùn)行以下命令以配置 Keepalived
vi /etc/keepalived/keepalived.conf
(2) 以下是示例配置,供您參考(請(qǐng)注意 server 字段。請(qǐng)記住 6443 是 apiserver 端口):
global_defs{
notification_email{
}
script_userroot
enable_script_security
router_idLVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval1
vrrp_gna_interval1
}
vrrp_scriptchk_haproxy{
script"/usr/bin/killall -0 haproxy"
weight-50
fall3
rise5
timeout2
}
vrrp_instancehaproxy-vip{
stateMASTER
priority100
interfaceeth0# Network card
virtual_router_id60
advert_int1
authentication{
auth_typePASS
auth_pass1111
}
unicast_src_ip192.168.1.243# The IP address of this machine
unicast_peer{
192.168.1.244# The IP address of peer machines
}
virtual_ipaddress{
192.168.1.210/24# The VIP address
}
track_script{
chk_haproxy# 這個(gè)對(duì)應(yīng)上面的vrrp_script
}
}
- 對(duì)于 interface 字段,您必須提供自己的網(wǎng)卡信息。您可以在機(jī)器上運(yùn)行 ifconfig 以獲取該值。
- 為 unicast_src_ip 提供的 IP 地址是您當(dāng)前機(jī)器的 IP 地址。對(duì)于也安裝了 HAproxy 和 Keepalived 進(jìn)行負(fù)載均衡的其他機(jī)器,必須在字段 unicast_peer 中輸入其 IP 地址。
(3) 保存文件并運(yùn)行以下命令以重啟 Keepalived。
systemctl restart keepalived
(4) 使 Keepalived 在開(kāi)機(jī)后自動(dòng)運(yùn)行:
systemctl enable keepalived
確保您在另一臺(tái)機(jī)器 (lb2) 上也配置了 Keepalived。
驗(yàn)證高可用
在開(kāi)始創(chuàng)建 Kubernetes 集群之前,請(qǐng)確保已經(jīng)測(cè)試了高可用。
(1) 在機(jī)器lb1上,運(yùn)行以下命令:
(2) 如上圖所示,虛擬 IP 地址已經(jīng)成功添加。模擬此節(jié)點(diǎn)上的故障:
systemctl stop haproxy
(3) 再次檢查浮動(dòng) IP 地址,您可以看到該地址在lb1上消失了。
(4) 理論上講,若配置成功,該虛擬 IP 會(huì)漂移到另一臺(tái)機(jī)器K8s-master2上。在K8s-master2 上運(yùn)行以下命令,這是預(yù)期的輸出:
(5) 如上所示,高可用已經(jīng)配置成功。
使用 KubeKey 創(chuàng)建 Kubernetes 集群
KubeKey[3] 是一款用來(lái)創(chuàng)建 Kubernetes 集群的工具,高效而便捷。請(qǐng)按照以下步驟下載 KubeKey。
(1) 首先運(yùn)行以下命令,以確保您從正確的區(qū)域下載 KubeKey。
export KKZONE=cn
(2) 運(yùn)行以下命令來(lái)下載 KubeKey:
curl -sfL https://get-kk.kubesphere.io | VERSION=v3.1.1 sh -
下載 KubeKey 之后,如果您將其轉(zhuǎn)移到訪問(wèn) Googleapis 受限的新機(jī)器上,請(qǐng)務(wù)必再次運(yùn)行 export KKZONE=cn,然后繼續(xù)執(zhí)行以下步驟:
(1) 執(zhí)行完上述命令后,輸出結(jié)果如下圖:
(2) 不清楚KK的具體用法可以使用幫助,執(zhí)行如下命令查看幫助:
(3) 使用默認(rèn)配置創(chuàng)建一個(gè)示例配置文件。此處以 Kubernetes v1.29.3 作為示例。
kk create config --with-kubernetes v1.29.3
可以通過(guò)kk version --show-supported-k8s查看支持安裝那些k8s版本,案例中kk采用的是最新的版本。所以,可以安裝k8s最新的版本。
運(yùn)行上述命令后,將在當(dāng)前目錄創(chuàng)建配置文件config-sample.yaml。根據(jù)自己的實(shí)際情況修改機(jī)器信息、配置負(fù)載均衡器等。
apiVersion:kubekey.kubesphere.io/v1alpha2
kind:Cluster
metadata:
name:sample
spec:
hosts:
-{name:master1,address:192.168.1.103,internalAddress:192.168.1.103,user:root,password:"123456"}
-{name:master2,address:192.168.1.104,internalAddress:192.168.1.104,user:root,password:"123456"}
-{name:master3,address:192.168.1.106,internalAddress:192.168.1.106,user:root,password:"123456"}
roleGroups:
etcd:
-master1
-master2
-master3
control-plane:
-master1
-master2
-master3
worker:
-master1
-master2
-master3
controlPlaneEndpoint:
## Internal loadbalancer for apiservers
# internalLoadbalancer: haproxy
domain:lb.kubesphere.local
address:"192.168.1.210"
port:9443
kubernetes:
version:v1.29.3
clusterName:cluster.local
autoRenewCerts:true
containerManager:containerd
etcd:
type:kubekey
network:
plugin:calico
kubePodsCIDR:10.233.64.0/18
kubeServiceCIDR:10.233.0.0/18
## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
multusCNI:
enabled:false
registry:
privateRegistry:""
namespaceOverride:""
registryMirrors:[]
insecureRegistries:[]
addons:[]
- hosts:指定節(jié)點(diǎn)的 IP、ssh 用戶、ssh 密碼、ssh 端口
- roleGroups:指定 3 個(gè) etcd、control-plane 節(jié)點(diǎn),復(fù)用相同的機(jī)器作為 3 個(gè) worker 節(jié)點(diǎn)
- internalLoadbalancer:?jiǎn)⒂脙?nèi)置的 HAProxy 負(fù)載均衡器
- domain:自定義域名,沒(méi)特殊需求可使用默認(rèn)值 lb.kubesphere.local
- clusterName:沒(méi)特殊需求可使用默認(rèn)值 cluster.local
- autoRenewCerts:該參數(shù)可以實(shí)現(xiàn)證書到期自動(dòng)續(xù)期,默認(rèn)為 true
- containerManager:使用 containerd
(4) 完成配置之后,可以執(zhí)行以下命令開(kāi)始安裝:
kk create cluster -f config-sample.yaml
上面的命令執(zhí)行后,首先 KubeKey 會(huì)檢查部署 K8s 的依賴及其他詳細(xì)要求。通過(guò)檢查后,系統(tǒng)將提示您確認(rèn)安裝。輸入 yes 并按 ENTER 繼續(xù)部署。
- nfs client、ceph client、glusterfs client 3 個(gè)與存儲(chǔ)有關(guān)的 client 顯示沒(méi)有安裝,這個(gè)我們后期會(huì)在對(duì)接存儲(chǔ)的實(shí)戰(zhàn)中單獨(dú)安裝。
- docker、containerd 會(huì)根據(jù)配置文件選擇的 containerManager 類型自動(dòng)安裝。
部署完成需要大約 10-20 分鐘左右,具體看網(wǎng)速和機(jī)器配置,本次部署完成耗時(shí) 25 分鐘。部署完成后,您應(yīng)該會(huì)在終端上看到類似于下面的輸出。
驗(yàn)證K8S集群
1.查看集群節(jié)點(diǎn)信息
在 master-1 節(jié)點(diǎn)運(yùn)行 kubectl 命令獲取 K8s 集群上的可用節(jié)點(diǎn)列表。
kubectl get nodes -o wide
在輸出結(jié)果中可以看到,當(dāng)前的 K8s 集群有三個(gè)可用節(jié)點(diǎn)、節(jié)點(diǎn)的內(nèi)部 IP、節(jié)點(diǎn)角色、節(jié)點(diǎn)的 K8s 版本號(hào)、容器運(yùn)行時(shí)及版本號(hào)、操作系統(tǒng)類型及內(nèi)核版本等信息。
2.查看 Pod 列表
輸入以下命令獲取在 K8s 集群上運(yùn)行的 Pod 列表。
kubectl get pods -o wide -A
在輸出結(jié)果中可以看到, 所有 pod 都在運(yùn)行。
部署測(cè)試資源
本示例使用命令行工具在 K8s 集群上部署一個(gè) Nginx Web 服務(wù)器。
1.創(chuàng)建 Nginx Deployment
運(yùn)行以下命令創(chuàng)建一個(gè)部署 Nginx Web 服務(wù)器的 Deployment。此示例中,我們將創(chuàng)建具有兩個(gè)副本基于 nginx:alpine 鏡像的 Pod。
root@master1:~# kubectl create deployment nginx --image nginx:alpine --replicas=2
deployment.apps/nginx created
2.創(chuàng)建 Nginx Service
創(chuàng)建一個(gè)新的 K8s 服務(wù),服務(wù)名稱 nginx,服務(wù)類型 Nodeport,對(duì)外的服務(wù)端口 80。
kubectl create service nodeport nginx --tcp=80:80
3.驗(yàn)證 Nginx Deployment 和 Pod
運(yùn)行以下命令查看創(chuàng)建的 Deployment 和 Pod 資源。
kubectl get deployment -o wide
kubectl get pods -o wide
查看結(jié)果如下:
4.驗(yàn)證 Nginx Service
運(yùn)行以下命令查看可用的服務(wù)列表,在列表中我們可以看到 nginx 服務(wù)類型 為 Nodeport,并在 Kubernetes 主機(jī)上開(kāi)放了 32373 端口。
kubectl get svc -o wide
查看結(jié)果如下:
5.驗(yàn)證服務(wù)
運(yùn)行以下命令訪問(wèn)部署的 Nginx 服務(wù),驗(yàn)證服務(wù)是否成功部署。
驗(yàn)證直接訪問(wèn) Pod:
問(wèn)題與解決方案
查看三個(gè)節(jié)點(diǎn)分別出現(xiàn)如下報(bào)錯(cuò)信息:
通過(guò)執(zhí)行如下名,加載下面兩個(gè)模塊
modprobe ip_vs
modprobe ip_vs_wrr
Reference:
- [1]Keepalived:https://www.keepalived.org/
- [2]HAProxy:http://www.haproxy.org/
- [3]KubeKey:https://github.com/kubesphere/kubekey