白話K8s-Service工作原理

PS: 以下都是博主的自學筆記 + 個人理解的概括,很抱歉沒有準備圖文形式描述,歡迎大家提問交流。

在上一章節的基本概念中,我們有提到Service基本概念。 我們知道Service是對Pod訪問的一種抽象。

本章節,我們來聊一下,Service的工作原理。 概括總結幾個常見疑惑。

一、負載均衡方式

Round Robin方式,對於這種方式我們成爲“Cluster IP” 模式的Service;

二、 Kubernetes Service 究竟是如何工作的呢?

實際上,Service是由 kube-proxy組件,加上 iptables來共同實現的。

  • kube-proxy 創建一條 iptables 規則。這條 iptables 規則的含義是:凡是目的地址是 clusterip(service vip如:10.0.1.17)、目的端口是 80 的 IP 包,都應該跳轉到另外一條名叫 KUBE-SVC-NWV5X2332I4OT4T3 的 iptables 鏈進行處理。
  • 而這個規則是一組隨機模式的 iptables鏈,隨機轉發地址是 xxx,xxx,xxx,如: (KUBE-SEP-WNBA2IHDGP2BOBGZ、KUBE-SEP-X3P2623AGDH6CDF3 和 KUBE-SEP-57KPRZ3JQVENLNBR)
  • 而者三條鏈(其實就是三條 DNAT規則)指向的最終目的地就是 service代理的三個pod
  • DNAT規則就是,就是在 PREROUTING 檢查點之前,也就是在路由之前,將流入 IP 包的目的地址和端口,改成–to-destination 所指定的新的目的地址和端口。可以看到,這個目的地址和端口,正是被代理 Pod 的 IP 地址和端口。

這樣,訪問 Service VIP 的 IP 包經過上述 iptables 處理之後,就已經變成了訪問具體某一個後端 Pod 的 IP 包了。不難理解,這些 Endpoints 對應的 iptables 規則,正是 kube-proxy 通過監聽 Pod 的變化事件,在宿主機上生成並維護的。

三、kube-proxy的ipvs模式又是啥?

kube-proxy iptables 模式需要一直刷新、監聽、更改,消耗CPU資源,限制了kubernetes 項目承載更多的Pod。 kube-proxy就是解決這個問題行之有效的方法;

  • 當我們創建了前面的 Service 之後,kube-proxy 首先會在宿主機上創建一個虛擬網卡(叫作:kube-ipvs0),併爲它分配 Service VIP 作爲 IP 地址;
  • kube-proxy 就會通過 Linux 的 IPVS 模塊,爲這個 IP 地址設置三個 IPVS 虛擬主機,並設置這三個虛擬主機之間使用輪詢模式 (rr) 來作爲負載均衡策略;
  • 這三個 IPVS 虛擬主機的 IP 地址和端口,對應的正是三個被代理的 Pod;

四、Service與DNS關係

在 Kubernetes 中,Service 和 Pod 都會被分配對應的 DNS A 記錄(從域名解析 IP 的記錄)

  • ClusterIp Service: {serviceName}.{namespace}.svc.cluster.local (可簡寫成 [svcname.namespace]),訪問這條A記錄的時候,解析到的是 service 的 vip

  • ClusterIp Service Pod 被分配的A記錄:

  • Headless Service: {serviceName}.{namespace}.svc.cluster.local

  • 訪問這條A記錄的時候,解析到的是 service 的 vip,解析到的時候 Pod ip 的集合

  • Headless Service Pods: ...svc.cluster.local

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章