k8s 中的 service 如何找到綁定的 Pod 以及如何實現 Pod 負載均衡

  • k8s 中的 service 如何找到綁定的 Pod 以及如何實現 Pod 負載均衡
    • 環境變量
    • DNS
    • userspace 模式
    • iptables
    • ipvs
    • kernelspace
    • 前言
    • endpoint
    • kube-proxy
    • 服務發現
    • 總結
    • 參考
k8s 中的 service 如何找到綁定的 Pod 以及如何實現 Pod 負載均衡前言Service 資源主要用于為 Pod 對象提供一個固定、統一的訪問接口及負載均衡的能力 。
service 是一組具有相同 label pod 集合的抽象,集群內外的各個服務可以通過 service 進行互相通信 。
當創建一個 service 對象時也會對應創建一個 endpoint 對象,endpoint 是用來做容器發現的,service 只是將多個 pod 進行關聯,實際的路由轉發都是由 kubernetes 中的 kube-proxy 組件來實現 , 因此 , service 必須結合 kube-proxy 使用,kube-proxy 組件可以運行在 kubernetes 集群中的每一個節點上也可以只運行在單獨的幾個節點上,其會根據 service 和 endpoints 的變動來改變節點上 iptables 或者 ipvs 中保存的路由規則 。
endpointendpoint 是 k8s 集群中的一個資源對象 , 存儲在 etcd 中,用來記錄一個 service 對應的所有 pod 的訪問地址 。
service 通過 selector 和 pod 建立關聯 。k8s 會根據 service 關聯到 pod 的 podIP 信息組合成一個 endpoint 。
如果 service 沒有 selector 字段,當一個 service 被創建的時候,endpoint controller 不會自動創建 endpoint 。
$ kubectl get svc -n study-k8sNAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGEgo-web-svc   ClusterIP   10.233.55.112   <none>        8000/TCP   9d$ kubectl get endpoints -n study-k8sNAME         ENDPOINTS                                                                AGEgo-web-svc   10.233.111.171:8000,10.233.111.172:8000,10.233.72.153:8000 + 2 more...   9d栗如
上面的 service go-web-svc,就有一個對應的 endpoint , ENDPOINTS 里面展示的就是 service 關聯的 pod 的 ip 地址和端口 。
其中 endpoint controller 負載維護 endpoint 對象,主要的功能有下面幾種
【k8s 中的 service 如何找到綁定的 Pod 以及如何實現 Pod 負載均衡】1、負責生成和維護所有endpoint對象的控制器;
2、負責監聽 service 和對應 pod 的變化;
3、監聽到 service 被刪除,則刪除和該 service 同名的 endpoint 對象;
4、監聽到新的 service 被創建,則根據新建 service 信息獲取相關 pod 列表,然后創建對應 endpoint 對象;
5、監聽到 service 被更新,則根據更新后的 service 信息獲取相關 pod 列表,然后更新對應 endpoint 對象;
6、監聽到 pod 事件,則更新對應的 service 的 endpoint 對象,將 podIp 記錄到 endpoint中;
kube-proxykube-proxy 是 Kubernetes 的核心組件,部署在每個 Node 節點上 , 它是實現 Kubernetes Service 的通信與負載均衡機制的重要組件; kube-proxy 負責為 Pod 創建代理服務,從 apiserver 獲取所有 server 信息 , 并根據 server 信息創建代理服務,實現server到Pod的請求路由和轉發,從而實現K8s層級的虛擬轉發網絡 。
在 k8s 中提供相同服務的一組 pod 可以抽象成一個 service,通過 service 提供統一的服務對外提供服務,kube-proxy 存在于各個 node 節點上,負責為 service 提供 cluster 內部的服務發現和負載均衡,負責 Pod 的網絡代理,它會定時從 etcd 中獲取 service 信息來做相應的策略,維護網絡規則和四層負載均衡工作 。k8s 中集群內部的負載均衡就是由 kube-proxy 實現的,它是 k8s 中內部的負載均衡器,也是一個分布式代理服務器,可以在每個節點中部署一個,部署的節點越多,提供負載均衡能力的 Kube-proxy 就越多,高可用節點就越多 。
簡單點講就是 k8s 內部的 pod 要訪問 service ,kube-proxy 會將請求轉發到 service 所代表的一個具體 pod , 也就是 service 關聯的 Pod 。

推薦閱讀