Keepalived-VIP
Kubernetes 使用 keepalived 來產生虛擬 IP address
我們將探討如何利用 IPVS - The Linux Virtual Server Project" 來爲 kubernetes 配置 VIP
前言
kubernetes v1.6 版提供了三種方式去暴露 Service:
L4 的 LoadBalacncer : 只能在 cloud providers 上被使用 像是 GCE 或 AWS
NodePort : NodePort 允許在每個節點上開啓一個 port 口, 藉由這個 port 口會再將請求導向到隨機的 pod 上
L7 Ingress :Ingress 爲一個 LoadBalancer(例: nginx, HAProxy, traefik, vulcand) 會將 HTTP/HTTPS 的各個請求導向到相對應的 service endpoint
有了這些方式, 爲何我們還需要 keepalived ?
___________________
| |
|-----| Host IP: 10.4.0.3 |
| |___________________|
|
| ___________________
| | |
Public ----(example.com = 10.4.0.3/4/5)----|-----| Host IP: 10.4.0.4 |
| |___________________|
|
| ___________________
| | |
|-----| Host IP: 10.4.0.5 |
|___________________|我們假設 Ingress 運行在 3 個 kubernetes 節點上, 並對外暴露 10.4.0.x 的 IP 去做 loadbalance
DNS Round Robin (RR) 將對應到 example.com 的請求輪循給這 3 個節點, 如果 10.4.0.3 掛了, 仍有三分之一的流量會導向 10.4.0.3, 這樣就會有一段 downtime, 直到 DNS 發現 10.4.0.3 掛了並修正導向
嚴格來說, 這並沒有真正的做到 High Availability (HA)
這邊 IPVS 可以幫助我們解決這件事, 這個想法是虛擬 IP(VIP) 對應到每個 service 上, 並將 VIP 暴露到 kubernetes 群集之外
與 service-loadbalancer 或 ingress-nginx 的區別
我們看到以下的圖
我們可以看到只有一個 node 被選爲 Master(透過 VRRP 選擇的), 而我們的 VIP 是 10.4.0.50, 如果 10.4.0.3 掛掉了, 那會從剩餘的節點中選一個成爲 Master 並接手 VIP, 這樣我們就可以確保落實真正的 HA
環境需求
只需要確認要運行 keepalived-vip 的 kubernetes 群集 DaemonSets 功能是正常的就行了
RBAC
由於 kubernetes 在 1.6 後引進了 RBAC 的概念, 所以我們要先去設定 rule, 至於有關 RBAC 的詳情請至 說明。
vip-rbac.yaml
clusterrolebinding.yaml
示例
先建立一個簡單的 service
nginx-deployment.yaml
主要功能就是 pod 去監聽聽 80 port, 再開啓 service NodePort 監聽 30320
接下來我們要做的是 config map
注意, 這邊的 10.87.2.50 必須換成你自己同網段下無使用的 IP e.g. 10.87.2.X 後面 nginx 爲 service 的 name, 這邊可以自行更換
接着確認一下
再來就是設置 keepalived-vip
建立 daemonset
檢查一下配置狀態
可以隨機挑一個 pod, 去看裏面的配置
最後我們去測試這功能
10.87.2.50:80(我們假設的 VIP, 實際上其實沒有 node 是用這 IP) 即可幫我們導向這個 service
以上的程式代碼都在 github 上可以找到。
參考文檔
Last updated