kubernetes學習 Service (二)
二、Cluster IP 底層實現
延續 kubernetes學習 Service (一) 的內容。
我們知道Pod的IP是在容器中配置的,那麼 Service 的 CLUSTER IP 又是配置在哪裡?CLUESTER-IP 又是如何對映到 Pod IP 的?
答案是:iptable。
Cluster IP 是一個虛擬 IP,是由kubernetes 節點上的iptables規則管理的。
可以通過root許可權 iptables-save 命令打印出當前節點的 iptables 規則,擷取與httpd-svc Cluster IP
上面的規則包含兩條含義:
* 如果 CLUSTER 內的 Pod 要訪問 httpd-svc,則允許
* 其他原地址訪問 httpd-svc,跳轉到規則 KUBE-SVC-RL3JAE4GN7VOGDGP
(1) 1/3的概率 跳轉到規則 KUBE-SEP-J7KWCV7US6EDHKCC
(2) 1/3的概率 跳轉到規則 KUBE-SEP-2Y5J5AVRJG7LJDZ6
(3) 1/3的概率 跳轉到規則 KUBE-SEP-RBOZOACVG7XXV2VP
即,將請求分別轉發到後端的三個Pod。通過上面的分析,我們得到結論:iptables 將訪問 Service 的流量轉發到後端 Pod,而且使用類似輪詢的負載均衡策略。
另外,Cluster 的每一個節點都配置了相同的 iptables 規則,這樣就確保了整個 Cluster 都能通過 Service 的Cluster IP 訪問 Service。
三、DNS 訪問 Service
在 Cluster 中,除了可以通過 Cluster IP 訪問 Service,Kubernetess 還提供了更為方便的 DNS
kubeadm 部署時會預設安裝 kube-dns 元件
kube-dns 是一個 DNS 伺服器。每當有新的 Service 被建立,kube-dns 會新增該 Service 的 DNS 記錄。Cluster 中的 Pod 可以通過<SERVICE_NAME>.<NAMESPACE_NAME> 訪問 Service。
比如說我們可以用 httpd-svc.default 訪問 Service httpd-svc
如上所示,我們在臨時的 busybox Pod 中驗證了 DNS 的有效性。另外由於 Pod 與 httpd-svc 同屬於 default namespace, 因此可以省略 default 直接用 httpd-svc 訪問 Service。
用 nslookup 檢視 httpd-svc 的 DNS 資訊
未完,待續。。。