每種類型的Service適合怎樣的場景以及kube-proxy是如何實現Service負載均衡是本文的重點
Kube-Proxy運行機制詳解
在Kubernetes集群中的每個Node上都會運行一個Kube-proxy服務進程,每個kube-proxy都充當一個負載均衡器,這是一個分布式的負載均衡器,我們可以把這個進程看作是透明代理兼負載均衡器,核心功能就是將訪問到某個Service的請求轉發到該Service對應的真實后端Pod上.
Service的ClusterIP和NodePort的實現方式都是kube-proxy服務通過iptables的NAT轉換實現的
比如從Node1主機上訪問Service和Node1上的Pod訪問Service
1.每個Node上的kube-proxy都會綁定集群內所有Service的IP到本機的kube-ipvs0的網卡上,如下圖
這個作用就是:讓數據包經過本機的INPUT鏈
2.通過socket調用,創建IPVS的virtual server和real server,分別對應Kubernetes的Service和EndPoints
3.發起請求后,通過kube-proxy請求先到本機,因為kube-proxy為本機綁定了對應的ServiceIP
4.然后通過kube-proxy創建的規則,把請求直接轉發到對應的Pod 進行處理
內部Node1節點上通過ClusterIP訪問Service和Node1節點上的Pod通過ClusterIP訪問Service:
由於Node1本機綁定了所有的ServiceIP,所以請求到達Node1本機的Kube-proxy,然后Node1本機的kube-Proxy創建的規則將請求轉發到對應的后端真實Pod
內部Node2節點上通過ClusterIP訪問Service和Node2節點上的Pod通過ClusterIP訪問Service:
由於Node2本機綁定了所有的ServiceIP,所以請求到達Node2本機的Kube-proxy,然后Node2本機的kube-Proxy創建的規則將請求轉發到對應的后端真實Pod
外部通過NodePort訪問:
就是請求先到Node的端口,然后通過kube-proxy轉發到對應的pod直接處理
Service和Kube-Proxy在Kubernetes集群中的工作原理
Kube-proxy在集群中的作用
1.運行在每個Node節點的Kube-Proxy會實時的watch Service和Endpoints對象
當用戶在kubernetes集群中創建了含有label的Service之后,同時會在集群中創建出一個同名的Endpoints對象,用於存儲該service下的Pod IP
2.每個運行在Node節點的Kube-Proxy感知到Service和Endpoints的變化之后,會在各自的Node節點設置相關的iptables或IPVS轉發規則,用於之后用戶通過Service的ClusterIP去訪問該Service下的服務
3.當Kube-Proxy把需要的規則設置完成后,用戶就可以在集群內的Node或客戶端Pod上通過ClusterIP經過該節點下的Iptales或IPVS設置的規則進行路由和轉發后 直接將請求發送到真實的后端Pod
Service類型
ClusterIP
ClusterIP 類型的 Service 是 Kubernetes 集群默認的 Service, 它只能用於集群內部通信(比如通過集群內Node節點訪問Service或者Pod里訪問Service);不能用於外部通信
NodePort
如果你想要在集群外訪問集群內部的服務,你可以使用這種類型的 Service。NodePort 類型的 Service 會在集群內部的所有 Node 節點打開一個指定的端口。之后所有的流量直接發送到這個端口之后,就會轉發的 Service 去對真實的服務進行訪問