本文基於kubernetes 1.5.2版本編寫
配置方式
kubernetes版本大於或者等於1.2時,外部網絡(即非K8S集羣內的網絡)訪問cluster IP的辦法是:
修改master的/etc/kubernetes/proxy,把KUBE_PROXY_ARGS=”“改爲KUBE_PROXY_ARGS=”–proxy-mode=userspace”
重啓kube-proxy服務
在覈心路由設備或者源主機上添加一條路由,訪問cluster IP段的路由指向到master上。
kubernetes版本小於1.2時,直接添加路由
kube-proxy轉發的兩種模式
一個簡單的網絡代理和負載均衡器,負責service的實現,每個Service都會在所有的Kube-proxy節點上體現。具體來說,就是實現了內部從pod到service和外部的從node port向service的訪問。
kube-proxy在轉發時主要有兩種模式Userspace和Iptables。
kuer-proxy目前有userspace和iptables兩種實現方式。
userspace(如下圖)是在用戶空間,通過kuber-proxy實現LB的代理服務。在K8S1.2版本之前,是kube-proxy默認方式,所有的轉發都是通過kube-proxy實現的。這個是kube-proxy的最初的版本,較爲穩定,但是效率也自然不太高。
另外一種方式是iptables方式(如下圖)。是純採用iptables來實現LB。在K8S1.2版本之後,kube-proxy默認方式。所有轉發都是通過Iptables內核模塊實現,而kube-proxy只負責生成相應的Iptables規則。
使用Userspace模式(k8s版本爲1.2之前默認模式),外部網絡可以直接訪問cluster IP。
使用Iptables模式(k8s版本爲1.2之後默認模式),外部網絡不能直接訪問cluster IP。
轉發K8S後端服務的四種方式
ClusterIP
此類型會提供一個集羣內部的虛擬IP(與Pod不在同一網段),以供集羣內部的pod之間通信使用。ClusterIP也是Kubernetes service的默認類型。
爲了實現圖上的功能主要需要以下幾個組件的協同工作:
apiserver:在創建service時,apiserver接收到請求以後將數據存儲到etcd中。
kube-proxy:k8s的每個節點中都有該進程,負責實現service功能,這個進程負責感知service,pod的變化,並將變化的信息寫入本地的iptables中。
iptables:使用NAT等技術將virtualIP的流量轉至endpoint中。
NodePort
NodePort模式除了使用cluster ip外,也將service的port映射到每個node的一個指定內部port上,映射的每個node的內部port都一樣。
爲每個節點暴露一個端口,通過nodeip + nodeport可以訪問這個服務,同時服務依然會有cluster類型的ip+port。內部通過clusterip方式訪問,外部通過nodeport方式訪問。
loadbalance
LoadBalancer在NodePort基礎上,K8S可以請求底層雲平臺創建一個負載均衡器,將每個Node作爲後端,進行服務分發。該模式需要底層雲平臺(例如GCE)支持。
Ingress
Ingress,是一種HTTP方式的路由轉發機制,由Ingress Controller和HTTP代理服務器組合而成。Ingress Controller實時監控Kubernetes API,實時更新HTTP代理服務器的轉發規則。HTTP代理服務器有GCE Load-Balancer、HaProxy、Nginx等開源方案。
詳細說明請見http://blog.csdn.net/liyingke112/article/details/77066814
service的三種端口
port
service暴露在cluster ip上的端口,:port 是提供給集羣內部客戶訪問service的入口。
nodePort
nodePort是k8s提供給集羣外部客戶訪問service入口的一種方式,:nodePort 是提供給集羣外部客戶訪問service的入口。
targetPort
targetPort是pod上的端口,從port和nodePort上到來的數據最終經過kube-proxy流入到後端pod的targetPort上進入容器。
port、nodePort總結
總的來說,port和nodePort都是service的端口,前者暴露給集羣內客戶訪問服務,後者暴露給集羣外客戶訪問服務。從這兩個端口到來的數據都需要經過反向代理kube-proxy流入後端pod的targetPod,從而到達pod上的容器內。