1. 程式人生 > >部署k8s ssl集群實踐6:配置高可用kube-apiserver組件ha+keepalived

部署k8s ssl集群實踐6:配置高可用kube-apiserver組件ha+keepalived

ops oba alived service 文章 system 兩個 ace 什麽

參考文檔:
https://github.com/opsnull/follow-me-install-kubernetes-cluster
感謝作者的無私分享。
集群環境已搭建成功跑起來。
文章是部署過程中遇到的錯誤和詳細操作步驟記錄。如有需要對比參考,請按照順序閱讀和測試。

kubernetes master 節點運行如下組件:
kube-apiserver
kube-scheduler
kube-controller-manager
kube-scheduler 和 kube-controller-manager 可以以集群模式運行,通過 leader 選舉產
生一個工作進程,其它進程處於阻塞模式。
對於 kube-apiserver,可以運行多個實例(本文檔是 3 實例),但對其它組件需要提供統一的訪問地址,該地址需要高可用。本文檔使用 keepalived 和 haproxy 實現 kubeapiserver

VIP 高可用和負載均衡。

集群模式和ha+keepalived的主要區別是什麽呢?
ha+keepalived配置vip,實現了api唯一的訪問地址和負載均衡。
集群模式沒有配置vip。

6.1
配置高可用組件

keepalived 提供 kube-apiserver 對外服務的 VIP;
haproxy 監聽 VIP,後端連接所有 kube-apiserver 實例,提供健康檢查和負載均衡
功能;
運行 keepalived 和 haproxy 的節點稱為 LB 節點。由於 keepalived 是一主多備運行模
式,故至少兩個 LB 節點。
本文檔復用 master 節點的三臺機器,haproxy 監聽的端口(8443) 需要與 kube-apiserver

的端口 6443 不同,避免沖突。
keepalived 在運行過程中周期檢查本機的 haproxy 進程狀態,如果檢測到 haproxy 進程
異常,則觸發重新選主的過程,VIP 將飄移到新選出來的主節點,從而實現 VIP 的高可
用。
所有組件(如 kubeclt、apiserver、controller-manager、scheduler 等)都通過 VIP 和
haproxy 監聽的 8443 端口訪問 kube-apiserver 服務。

安裝軟件包(三節點都安裝)
yum -y install keepalived haproxy

配置haproxy.cfg

[root@k8s-master haproxy]# cat haproxy.cfg |grep -v ^#
global
? ? log? ? ? ?? 127.0.0.1 local2
? ? chroot? ? ? /var/lib/haproxy
? ? pidfile? ?? /var/run/haproxy.pid
? ? maxconn? ?? 4000
? ? user? ? ? ? haproxy
? ? group? ? ?? haproxy
? ? daemon
? ? stats socket /var/lib/haproxy/stats
defaults
? ? mode? ? ? ? ? ? ? ? ?? tcp
? ? log? ? ? ? ? ? ? ? ? ?? global
? ? timeout connect? ? ? ?? 10s
? ? timeout client? ? ? ? ? 1m
? ? timeout server? ? ? ? ? 1m
? ? timeout check? ? ? ? ?? 10s
? ? maxconn? ? ? ? ? ? ? ?? 3000
frontend? ? ? ?? kube-api
bind? ? ? ? ? ? ? ? ? 0.0.0.0:8443
mode? ? ? ? ? ? ? ? tcp
log? ? ? ? ? ? ? ? ? ? ? ?? global
default_backend? ? ? ?? kube-master

backend? ? ? ?? kube-master
? ? balance? ?? source
? ? server? k8s-master 192.168.1.92:6443 check inter 2000 fall 2
? ? server? k8s-node1? 192.168.1.93:6443 check inter 2000 fall 2
? ? server? k8s-node2? 192.168.1.95:6443 check inter 2000 fall 2
listen stats
mode http
bind 0.0.0.0:1080
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
[root@k8s-master haproxy]#

拷貝到其他節點

[root@k8s-master haproxy]# scp haproxy.cfg root@k8s-node1:/etc/haproxy/
haproxy.cfg? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 100% 1300? ?? 1.7MB/s?? 00:00? ?
[root@k8s-master haproxy]# scp haproxy.cfg root@k8s-node2:/etc/haproxy/
haproxy.cfg? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 100% 1300? ?? 1.7MB/s?? 00:00? ?
[root@k8s-master haproxy]#

haproxy 在 1080 端口輸出 status 信息;
haproxy 監聽所有接口的 8443 端口,該端口與環境變量 ${KUBE_APISERVER} 指
定的端口必須一致;
server 字段列出所有 kube-apiserver 監聽的 IP 和端口;

啟動haproxy

[root@k8s-master haproxy]# systemctl status haproxy -l
● haproxy.service - HAProxy Load Balancer
?? Loaded: loaded (/usr/lib/systemd/system/haproxy.service; disabled; vendor preset: disabled)
?? Active: active (running) since 二 2018-08-21 17:15:40 CST; 2min 19s ago
Main PID: 7709 (haproxy-systemd)
? ? Tasks: 3
?? Memory: 1.7M
?? CGroup: /system.slice/haproxy.service
? ? ? ? ?? ├─7709 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
? ? ? ? ?? ├─7710 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
? ? ? ? ?? └─7711 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds

8月 21 17:15:40 k8s-master systemd[1]: Started HAProxy Load Balancer.
8月 21 17:15:40 k8s-master systemd[1]: Starting HAProxy Load Balancer...
8月 21 17:15:40 k8s-master haproxy-systemd-wrapper[7709]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
[root@k8s-master haproxy]#

看看端口啟動了嗎

[root@k8s-master haproxy]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address? ? ? ? ?? Foreign Address? ? ? ?? State? ? ?? PID/Program name? ?
tcp? ? ? ? 0? ? ? 0 192.168.1.92:2379? ? ?? 0.0.0.0:*? ? ? ? ? ? ?? LISTEN? ? ? 2229/etcd? ? ? ? ??
tcp? ? ? ? 0? ? ? 0 127.0.0.1:2379? ? ? ? ? 0.0.0.0:*? ? ? ? ? ? ?? LISTEN? ? ? 2229/etcd? ? ? ? ??
tcp? ? ? ? 0? ? ? 0 192.168.1.92:2380? ? ?? 0.0.0.0:*? ? ? ? ? ? ?? LISTEN? ? ? 2229/etcd? ? ? ? ??
tcp? ? ? ? 0? ? ? 0 0.0.0.0:111? ? ? ? ? ?? 0.0.0.0:*? ? ? ? ? ? ?? LISTEN? ? ? 749/rpcbind? ? ? ??
tcp? ? ? ? 0? ? ? 0 0.0.0.0:22? ? ? ? ? ? ? 0.0.0.0:*? ? ? ? ? ? ?? LISTEN? ? ? 1034/sshd? ? ? ? ??
tcp? ? ? ? 0? ? ? 0 0.0.0.0:1080? ? ? ? ? ? 0.0.0.0:*? ? ? ? ? ? ?? LISTEN? ? ? 7711/haproxy? ? ? ?
tcp? ? ? ? 0? ? ? 0 127.0.0.1:25? ? ? ? ? ? 0.0.0.0:*? ? ? ? ? ? ?? LISTEN? ? ? 1238/master? ? ? ??
tcp? ? ? ? 0? ? ? 0 0.0.0.0:8443? ? ? ? ? ? 0.0.0.0:*? ? ? ? ? ? ?? LISTEN? ? ? 7711/haproxy? ? ? ?
tcp6? ? ?? 0? ? ? 0 :::111? ? ? ? ? ? ? ? ? :::*? ? ? ? ? ? ? ? ? ? LISTEN? ? ? 749/rpcbind? ? ? ??
tcp6? ? ?? 0? ? ? 0 :::22? ? ? ? ? ? ? ? ?? :::*? ? ? ? ? ? ? ? ? ? LISTEN? ? ? 1034/sshd? ? ? ? ??
tcp6? ? ?? 0? ? ? 0 ::1:25? ? ? ? ? ? ? ? ? :::*? ? ? ? ? ? ? ? ? ? LISTEN? ? ? 1238/master? ? ? ??
[root@k8s-master haproxy]#

6.2
配置keepalived

keepalived 是一主(master)多備(backup)運行模式,故有兩種類型的配置文件。
master 配置文件只有一份,backup 配置文件視節點數目而定,對於本文檔而言,規劃
如下:

master: 192.168.1.92
backup:192.168.1.93,192.168.1.95

master 配置文件:

[root@k8s-master keepalived]# cat keepalived.conf
global_defs {?
? ? router_id NodeA?
}?

vrrp_script chk_haproxy {
? ? ? ? script "/etc/keepalived/check_haproxy.sh"
? ? ? ? interval 5
? ? ? ? weight 2
}

vrrp_instance VI_1 {?
? ? state MASTER? ? #設置為主服務器?
? ? interface ens192? #監測網絡接口?
? ? virtual_router_id 51? #主、備必須一樣?
? ? priority 100?? #(主、備機取不同的優先級,主機值較大,備份機值較小,值越大優先級越高)?
? ? advert_int 1?? #VRRP Multicast廣播周期秒數?
? ? authentication {?
? ? auth_type PASS? #VRRP認證方式,主備必須一致?
? ? auth_pass 1111?? #(密碼)?
}?
virtual_ipaddress {?
? ? 192.168.1.94/24? #VRRP HA虛擬地址?
}
? ? track_script { ? ? ? ? ? ? ? ? ? ? ? ? ? 
? ? ? chk_haproxy
}
}
[root@k8s-master keepalived]#

backup配置文件
[root@k8s-node1 keepalived]# cat keepalived.conf
global_defs {?
? ? router_id NodeA?
}?

vrrp_script chk_haproxy {
? ? ? ? script "/etc/keepalived/check_haproxy.sh"
? ? ? ? interval 5
? ? ? ? weight 2
}
vrrp_instance VI_1 {?
? ? state BACKUP? ? #設置為主服務器?
? ? interface ens192? #監測網絡接口?
? ? virtual_router_id 51? #主、備必須一樣?
? ? priority 90?? #(主、備機取不同的優先級,主機值較大,備份機值較小,值越大優先級越高)?
? ? advert_int 1?? #VRRP Multicast廣播周期秒數?
? ? authentication {?
? ? auth_type PASS? #VRRP認證方式,主備必須一致?
? ? auth_pass 1111?? #(密碼)?
}?
virtual_ipaddress {?
? ? 192.168.1.94/24? #VRRP HA虛擬地址?
}
? ??track_script {
? ? ? ? chk_haproxy
}
}
[root@k8s-node1 keepalived]#

[root@k8s-node2 keepalived]# cat keepalived.conf
global_defs {?
? ? router_id NodeA?
}?

vrrp_script chk_haproxy {
? ? ? ? script "/etc/keepalived/check_haproxy.sh"
? ? ? ? interval 5
? ? ? ? weight 2
}
vrrp_instance VI_1 {?
? ? state BACKUP? ? #設置為主服務器?
? ? interface ens192? #監測網絡接口?
? ? virtual_router_id 51? #主、備必須一樣?
? ? priority 80?? #(主、備機取不同的優先級,主機值較大,備份機值較小,值越大優先級越高)?
? ? advert_int 1?? #VRRP Multicast廣播周期秒數?
? ? authentication {?
? ? auth_type PASS? #VRRP認證方式,主備必須一致?
? ? auth_pass 1111?? #(密碼)?
}?
virtual_ipaddress {?
? ? 192.168.1.94/24? #VRRP HA虛擬地址?
}
? ??track_script {
? ? ? ? chk_haproxy
}
}
[root@k8s-node2 keepalived]#

腳本文件

[root@k8s-master keepalived]# pwd ? ? ? ? ? ? ? ? ? ? ? ? ? ?##註意腳本存放的路徑必須和keepalived配置的路徑相同
/etc/keepalived
[root@k8s-master keepalived]# cat check_haproxy.sh
#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ];then
systemctl start haproxy.service
fi
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
pkill keepalived
fi
[root@k8s-master keepalived]#

keepalived測試成功

6.3
遇到的問題:
腳本不執行。
原因:
?##千萬註意,track_script這組參數必須寫在vip後面,不然腳本不會執行

部署k8s ssl集群實踐6:配置高可用kube-apiserver組件ha+keepalived