部署k8s ssl集群實踐6:配置高可用kube-apiserver組件ha+keepalived
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
集群模式和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
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