service是一個抽象概念,定義了一個服務的多個pod邏輯合集和訪問pod的策略,通常把service稱爲微服務node
舉個例子一個a服務運行3個pod,b服務怎麼訪問a服務的pod,pod的ip都不是持久化的重啓以後就會有變化。
這時候b服務能夠訪問跟a服務綁定的service,service信息是固定的提早告訴b就好了,service經過Label Selector跟a服務的pod綁定,不管a的pod如何變化對b來講都是透明的後端
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
targetPort 端口是service對外暴露的端口,任何人訪問9376端口都會被service代理到後端pod的80端口api
k8s羣集中的每一個節點都運行一個kube-proxy的組件,kube-proxy實際上是一個代理層負責實現serviceapp
kube-proxy代理模式有兩種:負載均衡
客戶端訪問ServiceIP(clusterIP)請求會先從用戶空間到內核中的iptables,而後回到用戶空間kube-proxy,kube-proxy負責代理工做。微服務
具體細節:性能
每一個service都會由kube-proxy在node節點上起一個隨機的代理端口,iptables會捕捉clusterIP上的端口(targetPort)流量重定向代理端口,訪問代理端口的任何鏈接都會被代理到service後端的某一個pod,默認狀況下對後端pod的選擇是輪詢阿里雲
客戶端訪問ServiceIP(clusterIP)請求會由iptables直接重定向到後端spa
具體細節:插件
每一個service都會由kube-proxy生成一組iptables規則,iptables會捕捉clusterIP上的端口(targetPort)流量重定向後端某一個pod,默認對pod的選擇是隨機的
Kubernetes v1.2以前默認是userspace以後是iptables模式,iptables模式性能和可靠性更好,可是iptables模式依賴健康檢查,在沒有健康檢查的狀況下若是一個pod不響應,iptables模式不會切換另外一個pod上
Kubernetes v1.9版本會支持lvs的ipvs模式目前仍是beta版