kubernetes service 補充
service類型
用戶可以通過ServiceType來指定如何來發布服務,類型有以下幾種:
ClusterIP:提供一個集羣內部的虛擬IP以供Pod訪問(service默認類型)。
NodePort:在每個Node上打開一個端口以供外部訪問
LoadBalancer:通過外部的負載均衡器來訪問
服務發現
環境變量: 當創建一個Pod的時候,kubelet會在該Pod中注入集羣內所有Service的相關環境變量。需要注意的是,要想一個Pod中注入某個Service的環境變量,則必須Service要先比該Pod創建。這一點,幾乎使得這種方式進行服務發現不可用。
DNS:可以通過cluster add-on的方式輕鬆的創建KubeDNS來對集羣內的Service進行服務發現————這也是k8s官方強烈推薦的方式。爲了讓Pod中的容器可以使用kube-dns來解析域名,k8s會修改容器的/etc/resolv.conf配置。
kube-proxy iptables
kube-proxy監聽service和endpoint的變化,將需要新增的規則添加到iptables中。
kube-proxy只是作爲controller,而不是server,真正服務的是內核的netfilter,體現在用戶態則是iptables。
kube-proxy的iptables方式也支持RoundRobin(默認模式)和SessionAffinity負載分發策略。
kubernetes只操作了filter和nat表。
Filter:在該表中,一個基本原則是隻過濾數據包而不修改他們。filter table的優勢是小而快,可以hook到input,output和forward。這意味着針對任何給定的數據包,只有可能有一個地方可以過濾它。
NAT:此表的主要作用是在PREROUTING和POSTROUNTING的鉤子中,修改目標地址和原地址。與filter表稍有不同的是,該表中只有新連接的第一個包會被修改,修改的結果會自動apply到同一連接的後續包中。
kube-proxy對iptables的鏈進行了擴充,自定義了KUBE-SERVICES,KUBE-NODEPORTS,KUBE-POSTROUTING,KUBE-MARK-MASQ和KUBE-MARK-DROP五個鏈,並主要通過爲KUBE-SERVICES chain增加rule來配製traffic routing 規則。
KUBE-MARK-DROP - [0:0] /*對於未能匹配到跳轉規則的traffic set mark 0x8000,有此標記的數據包會在filter表drop掉*/
KUBE-MARK-MASQ - [0:0] /*對於符合條件的包 set mark 0x4000, 有此標記的數據包會在KUBE-POSTROUTING chain中統一做MASQUERADE*/
KUBE-NODEPORTS - [0:0] /*針對通過nodeport訪問的package做的操作*/
KUBE-POSTROUTING - [0:0] /*操作跳轉規則的主要chain*/
KUBE-SERVICES - [0:0] /*操作跳轉規則的主要chain*/