教你如何用Keepalived和HAproxy配置高可用 Kubernetes 叢集

华为云开发者联盟發表於2024-02-28

本文分享自華為雲社群《使用 Keepalived 和 HAproxy 建立高可用 Kubernetes 叢集》,作者:江晚正愁餘。

高可用 Kubernetes 叢集能夠確保應用程式在執行時不會出現服務中斷,這也是生產的需求之一。為此,有很多方法可供選擇以實現高可用。

本教程演示瞭如何配置 Keepalived 和 HAproxy 使負載均衡、實現高可用。步驟如下:

  1. 準備主機。
  2. 配置 Keepalived 和 HAproxy。
  3. 使用 KubeKey 建立 Kubernetes 叢集,並安裝 KubeSphere。

叢集架構

示例叢集有三個主節點,三個工作節點,兩個用於負載均衡的節點,以及一個虛擬 IP 地址。本示例中的虛擬 IP 地址也可稱為“浮動 IP 地址”。這意味著在節點故障的情況下,該 IP 地址可在節點之間漂移,從而實現高可用。

cke_130.png

請注意,在本示例中,Keepalived 和 HAproxy 沒有安裝在任何主節點上。但您也可以這樣做,並同時實現高可用。然而,配置兩個用於負載均衡的特定節點(您可以按需增加更多此類節點)會更加安全。這兩個節點上只安裝 Keepalived 和 HAproxy,以避免與任何 Kubernetes 元件和服務的潛在衝突。

準備主機

IP 地址

主機名

角色

172.16.0.2

lb1

Keepalived & HAproxy

172.16.0.3

lb2

Keepalived & HAproxy

172.16.0.4

master1

master, etcd

172.16.0.5

master2

master, etcd

172.16.0.6

master3

master, etcd

172.16.0.7

worker1

worker

172.16.0.8

worker2

worker

172.16.0.9

worker3

worker

172.16.0.10

虛擬 IP 地址

有關更多節點、網路、依賴項等要求的資訊,請參見多節點安裝。

配置負載均衡

Keepalived 提供 VRRP 實現,並允許您配置 Linux 機器使負載均衡,預防單點故障。HAProxy 提供可靠、高效能的負載均衡,能與 Keepalived 完美配合。

由於 lb1 和 lb2 上安裝了 Keepalived 和 HAproxy,如果其中一個節點故障,虛擬 IP 地址(即浮動 IP 地址)將自動與另一個節點關聯,使叢集仍然可以正常執行,從而實現高可用。若有需要,也可以此為目的,新增更多安裝 Keepalived 和 HAproxy 的節點。

先執行以下命令安裝 Keepalived 和 HAproxy。

yum install keepalived haproxy psmisc -y

HAproxy

1.在兩臺用於負載均衡的機器上執行以下命令以配置 Proxy(兩臺機器的 Proxy 配置相同):

vi /etc/haproxy/haproxy.cfg

2.以下是示例配置,供您參考(請注意 server 欄位。請記住 6443 是 apiserver 埠):

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 tcplog

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 172.16.0.4:6443 check # Replace the IP address with your own.

server kube-apiserver-2 172.16.0.5:6443 check # Replace the IP address with your own.

server kube-apiserver-3 172.16.0.6:6443 check # Replace the IP address with your own.

3.儲存檔案並執行以下命令以重啟 HAproxy。

systemctl restart haproxy

4.使 HAproxy 在開機後自動執行:

systemctl enable haproxy

5.確保您在另一臺機器 (lb2) 上也配置了 HAproxy。

Keepalived

兩臺機器上必須都安裝 Keepalived,但在配置上略有不同。

1.執行以下命令以配置 Keepalived。

vi /etc/keepalived/keepalived.conf

2.以下是示例配置 (lb1),供您參考:

global_defs {

notification_email {

}

router_id LVS_DEVEL

vrrp_skip_check_adv_addr

vrrp_garp_interval 0

vrrp_gna_interval 0

}



vrrp_script chk_haproxy {

script "killall -0 haproxy"

interval 2

weight 2

}



vrrp_instance haproxy-vip {

state BACKUP

priority 100

interface eth0 # Network card

virtual_router_id 60

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

unicast_src_ip 172.16.0.2 # The IP address of this machine

unicast_peer {

172.16.0.3 # The IP address of peer machines

}



virtual_ipaddress {

172.16.0.10/24 # The VIP address

}



track_script {

chk_haproxy

}

}

備註

  • 對於 interface 欄位,您必須提供自己的網路卡資訊。您可以在機器上執行 ifconfig 以獲取該值。
  • 為 unicast_src_ip 提供的 IP 地址是您當前機器的 IP 地址。對於也安裝了 HAproxy 和 Keepalived 進行負載均衡的其他機器,必須在欄位 unicast_peer 中輸入其 IP 地址。

3.儲存檔案並執行以下命令以重啟 Keepalived。

systemctl restart keepalived

4.使 Keepalived 在開機後自動執行:

systemctl enable keepalived

5.確保您在另一臺機器 (lb2) 上也配置了 Keepalived。

驗證高可用

在開始建立 Kubernetes 叢集之前,請確保已經測試了高可用。

1.在機器 lb1 上,執行以下命令:

[[email protected] ~]# ip a s

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000

link/ether 52:54:9e:27:38:c8 brd ff:ff:ff:ff:ff:ff

inet 172.16.0.2/24 brd 172.16.0.255 scope global noprefixroute dynamic eth0

valid_lft 73334sec preferred_lft 73334sec

inet 172.16.0.10/24 scope global secondary eth0 # The VIP address

valid_lft forever preferred_lft forever

inet6 fe80::510e:f96:98b2:af40/64 scope link noprefixroute

valid_lft forever preferred_lft forever

2.如上圖所示,虛擬 IP 地址已經成功新增。模擬此節點上的故障:

systemctl stop haproxy

3.再次檢查浮動 IP 地址,您可以看到該地址在 lb1 上消失了。

[[email protected] ~]# ip a s

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000

link/ether 52:54:9e:27:38:c8 brd ff:ff:ff:ff:ff:ff

inet 172.16.0.2/24 brd 172.16.0.255 scope global noprefixroute dynamic eth0

valid_lft 72802sec preferred_lft 72802sec

inet6 fe80::510e:f96:98b2:af40/64 scope link noprefixroute

valid_lft forever preferred_lft forever

4.理論上講,若配置成功,該虛擬 IP 會漂移到另一臺機器 (lb2) 上。在 lb2 上執行以下命令,這是預期的輸出:

[[email protected] ~]# ip a s

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000

link/ether 52:54:9e:3f:51:ba brd ff:ff:ff:ff:ff:ff

inet 172.16.0.3/24 brd 172.16.0.255 scope global noprefixroute dynamic eth0

valid_lft 72690sec preferred_lft 72690sec

inet 172.16.0.10/24 scope global secondary eth0 # The VIP address

valid_lft forever preferred_lft forever

inet6 fe80::f67c:bd4f:d6d5:1d9b/64 scope link noprefixroute

valid_lft forever preferred_lft forever

5.如上所示,高可用已經配置成功。

使用 KubeKey 建立 Kubernetes 叢集

KubeKey 是一款用來建立 Kubernetes 叢集的工具,高效而便捷。請按照以下步驟下載 KubeKey。

GitHub Release Page 下載 KubeKey 或者直接使用以下命令。

curl -sfL https://get-kk.kubesphere.io | VERSION=v2.0.0 sh -

首先執行以下命令,以確保您從正確的區域下載 KubeKey。

export KKZONE=cn

執行以下命令來下載 KubeKey:

curl -sfL https://get-kk.kubesphere.io | VERSION=v2.0.0 sh -

備註

下載 KubeKey 之後,如果您將其轉移到訪問 Googleapis 受限的新機器上,請務必再次執行 export KKZONE=cn,然後繼續執行以下步驟。

備註

透過以上命令,可以下載 KubeKey 的最新版本 (v2.0.0)。您可以更改命令中的版本號來下載特定的版本。

使 kk 成為可執行檔案:

chmod +x kk

使用預設配置建立一個示例配置檔案。此處以 Kubernetes v1.21.5 作為示例。

./kk create config --with-kubesphere v3.2.1 --with-kubernetes v1.21.5

備註

  • 安裝 KubeSphere 3.2.1 的建議 Kubernetes 版本:v1.19.x、v1.20.x、v1.21.x 或 v1.22.x(實驗性支援)。如果不指定 Kubernetes 版本,KubeKey 將預設安裝 Kubernetes v1.21.5。有關受支援的 Kubernetes 版本的更多資訊,請參見支援矩陣。
  • 如果您沒有在本步驟的命令中新增標誌 --with-kubesphere,那麼除非您使用配置檔案中的 addons 欄位進行安裝,或者稍後使用 ./kk create cluster 時再新增該標誌,否則 KubeSphere 將不會被部署。
  • 如果您新增標誌 --with-kubesphere 時未指定 KubeSphere 版本,則會安裝最新版本的 KubeSphere。

部署 KubeSphere 和 Kubernetes

執行上述命令後,將建立配置檔案 config-sample.yaml。編輯檔案以新增機器資訊、配置負載均衡器等。

備註

如果自定義檔名,那麼檔名可能會有所不同。

config-sample.yaml 示例

...

spec:

hosts:

- {name: master1, address: 172.16.0.4, internalAddress: 172.16.0.4, user: root, password: Testing123}

- {name: master2, address: 172.16.0.5, internalAddress: 172.16.0.5, user: root, password: Testing123}

- {name: master3, address: 172.16.0.6, internalAddress: 172.16.0.6, user: root, password: Testing123}

- {name: worker1, address: 172.16.0.7, internalAddress: 172.16.0.7, user: root, password: Testing123}

- {name: worker2, address: 172.16.0.8, internalAddress: 172.16.0.8, user: root, password: Testing123}

- {name: worker3, address: 172.16.0.9, internalAddress: 172.16.0.9, user: root, password: Testing123}

roleGroups:

etcd:

- master1

- master2

- master3

master:

- master1

- master2

- master3

worker:

- worker1

- worker2

- worker3

controlPlaneEndpoint:

domain: lb.kubesphere.local

address: 172.16.0.10 # The VIP address

port: 6443

...

備註

  • 請使用您自己的 VIP 地址來替換 controlPlaneEndpoint.address 的值。
  • 有關更多本配置檔案中不同引數的資訊,請參見多節點安裝。

開始安裝

完成配置之後,可以執行以下命令開始安裝:

./kk create cluster -f config-sample.yaml

驗證安裝

1.執行以下命令以檢查安裝日誌。

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

2.看到以下資訊時,表明高可用叢集已成功建立。

#####################################################

### Welcome to KubeSphere! ###

#####################################################



Console: http://172.16.0.4:30880

Account: admin

Password: [email protected]



NOTES:

1. After you log into the console, please check the

monitoring status of service components in

the "Cluster Management". If any service is not

ready, please wait patiently until all components

are up and running.

2. Please change the default password after login.



#####################################################

https://kubesphere.io 2020-xx-xx xx:xx:xx

#####################################################

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章