使用kube-proxy讓外部網絡訪問K8S service的ClusterIP

本文基於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的默認類型。
ClusterIP
爲了實現圖上的功能主要需要以下幾個組件的協同工作:
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上的容器內。

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