Kubernetes的Master節點高可用方案

Kubernetes的Master節點高可用方案

做者:mendickxiaolinux

通過部署Kubernetes集羣章節咱們已經能夠順利的部署一個集羣用於開發和測試,可是要應用到生產就就不得不考慮master節點的高可用問題,由於如今咱們的master節點上的幾個服務kube-apiserverkube-schedulerkube-controller-manager都是單點的並且都位於同一個節點上,一旦master節點宕機,雖然不該答當前正在運行的應用,將致使kubernetes集羣沒法變動。本文將引導你建立一個高可用的master節點。git

在大神gzmzj的ansible建立kubernetes集羣神做中有講到如何配置多個Master,可是在實踐過程當中仍是遇到很多坑。須要將坑填上才能工做。 神做連接地址:集羣規劃和基礎參數設定github

按照神做的描述,其實是經過keepalived + haproxy實現的,其中keepalived是提供一個VIP,經過VIP關聯全部的Master節點;而後haproxy提供端口轉發功能。因爲VIP仍是存在Master的機器上的,默認配置API Server的端口是6443,因此咱們須要將另一個端口關聯到這個VIP上,通常用8443。api

Master HA架構圖

圖片 - Master HA架構圖服務器

根據神做的實踐,我發現須要在Master手工安裝keepalived, haproxy。架構

yum install keepalived
yum install haproxy

須要將HAProxy默認的配置文件balance從source修改成roundrobin方式。haproxy的配置文件haproxy.cfg默認路徑是/etc/haproxy/haproxy.cfg。另外須要手工建立/run/haproxy的目錄,不然haproxy會啓動失敗。app

注意負載均衡

  • bind綁定的就是VIP對外的端口號,這裏是8443。
  • balance指定的負載均衡方式是roundrobin方式,默認是source方式。在個人測試中,source方式不工做。
  • server指定的就是實際的Master節點地址以及真正工做的端口號,這裏是6443。有多少臺Master就寫多少條記錄。
# haproxy.cfg sample
global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        *stats socket /run/haproxy/admin.sock mode 660 level admin
        stats timeout 30s
        user haproxy
        group haproxy
        daemon
        nbproc 1

defaults
        log     global
        timeout connect 5000
        timeout client  50000
        timeout server  50000

listen kube-master
        **bind 0.0.0.0:8443**
        mode tcp
        option tcplog
        **balance roundrobin**
        server s1 **Master 1的IP地址**:6443  check inter 10000 fall 2 rise 2 weight 1
        server s2 **Master 2的IP地址**:6443  check inter 10000 fall 2 rise 2 weight 1

修改keepalived的配置文件,配置正確的VIP。keepalived的配置文件keepalived.conf的默認路徑是/etc/keepalived/keepalived.confsocket

注意tcp

  • priority決定哪一個Master是主,哪一個Master是次。數字小的是主,數字大的是次。數字越小優先級越高。
  • virtual_router_id決定當前VIP的路由號,實際上VIP提供了一個虛擬的路由功能,該VIP在同一個子網內必須是惟一。
  • virtual_ipaddress提供的就是VIP的地址,該地址在子網內必須是空閒未必分配的。
# keepalived.cfg sample

global_defs {
    router_id lb-backup
}

vrrp_instance VI-kube-master {
    state BACKUP
    **priority 110**
    dont_track_primary
    interface eth0
    **virtual_router_id 51**
    advert_int 3
    virtual_ipaddress {
        **10.86.13.36**
    }
}

配置好後,那麼先啓動主Master的keepalived和haproxy。

systemctl enable keepalived
systemctl start keepalived
systemctl enable haproxy
systemctl start haproxy

而後使用ip a s命令查看是否有VIP地址分配。若是看到VIP地址已經成功分配在eth0網卡上,說明keepalived啓動成功。

[root@kube32 ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    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 qlen 1000
    link/ether 00:50:56:a9:d5:be brd ff:ff:ff:ff:ff:ff
    inet 10.86.13.32/23 brd 10.86.13.255 scope global eth0
       valid_lft forever preferred_lft forever
    **inet 10.86.13.36/32 scope global eth0**
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fea9:d5be/64 scope link
       valid_lft forever preferred_lft forever

更保險方法還能夠經過systemctl status keepalived -l看看keepalived的狀態

[root@kube32 ~]# systemctl status keepalived -l
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2018-02-01 10:24:51 CST; 1 months 16 days ago
 Main PID: 13448 (keepalived)
   Memory: 6.0M
   CGroup: /system.slice/keepalived.service
           ├─13448 /usr/sbin/keepalived -D
           ├─13449 /usr/sbin/keepalived -D
           └─13450 /usr/sbin/keepalived -D

Mar 20 04:51:15 kube32 Keepalived_vrrp[13450]: VRRP_Instance(VI-kube-master) Dropping received VRRP packet...
**Mar 20 04:51:18 kube32 Keepalived_vrrp[13450]: (VI-kube-master): ip address associated with VRID 51 not present in MASTER advert : 10.86.13.36
Mar 20 04:51:18 kube32 Keepalived_vrrp[13450]: bogus VRRP packet received on eth0 !!!**

而後經過systemctl status haproxy -l看haproxy的狀態

[root@kube32 ~]# systemctl status haproxy -l
● haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2018-02-01 10:33:22 CST; 1 months 16 days ago
 Main PID: 15116 (haproxy-systemd)
   Memory: 3.2M
   CGroup: /system.slice/haproxy.service
           ├─15116 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
           ├─15117 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
           └─15118 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds

這個時候經過kubectl version命令,能夠獲取到kubectl的服務器信息。

[root@kube32 ~]# kubectl version
**Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.1", GitCommit:"3a1c9449a956b6026f075fa3134ff92f7d55f812", GitTreeState:"clean", BuildDate:"2018-01-03T22:31:01Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.1", GitCommit:"3a1c9449a956b6026f075fa3134ff92f7d55f812", GitTreeState:"clean", BuildDate:"2018-01-03T22:18:41Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}**

這個時候說明你的keepalived和haproxy都是成功的。這個時候你能夠依次將你其餘Master節點的keepalived和haproxy啓動。 此時,你經過ip a s命令去查看其中一臺Master(非主Master)的時候,你看不到VIP,這個是正常的,由於VIP永遠只在主Master節點上,只有當主Master節點掛掉後,纔會切換到其餘Master節點上。

[root@kube31 ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    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 qlen 1000
    link/ether 00:50:56:a9:07:23 brd ff:ff:ff:ff:ff:ff
    inet 10.86.13.31/23 brd 10.86.13.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fea9:723/64 scope link
       valid_lft forever preferred_lft forever

在個人實踐過程當中,經過大神的腳本快速啓動多個Master節點,會致使主Master始終獲取不了VIP,當時的報錯很是奇怪。後來通過個人研究發現,主Master獲取VIP是須要時間的,若是多個Master同時啓動,會致使衝突。這個不知道是否算是Keepalived的Bug。可是最穩妥的方式仍是先啓動一臺主Master,等VIP肯定後再啓動其餘Master比較靠譜。

Kubernetes經過Keepalived + Haproxy實現多個Master的高可用部署,你實際上能夠採用其餘方式,如外部的負載均衡方式。實際上Kubernetes的多個Master是沒有主從的,均可以提供一致性服務。Keepalived + Haproxy實際上就是提供了一個簡單的負載均衡方式。

相關文章
相關標籤/搜索