Keepalived-VIP

Kubernetes 使用 keepalived 來產生虛擬 IP address

我們將探討如何利用 IPVS - The Linux Virtual Server Project" 來爲 kubernetes 配置 VIP

前言

kubernetes v1.6 版提供了三種方式去暴露 Service:

  1. L4 的 LoadBalacncer : 只能在 cloud providers 上被使用 像是 GCE 或 AWS

  2. NodePort : NodePort 允許在每個節點上開啓一個 port 口, 藉由這個 port 口會再將請求導向到隨機的 pod 上

  3. 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 群集之外

我們看到以下的圖

我們可以看到只有一個 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