什么是服務(Service)
直接訪問Pod的問題
Pod創(chuàng)建完成后,如何訪問Pod呢?直接訪問Pod會有如下幾個問題:
- Pod會隨時被Deployment這樣的控制器刪除重建,那訪問Pod的結果就會變得不可預知。
- Pod的IP地址是在Pod啟動后才被分配,在啟動前并不知道Pod的IP地址。
- 應用往往都是由多個運行相同鏡像的一組Pod組成,逐個訪問Pod也變得不現實。
舉個例子,假設有這樣一個應用程序,使用Deployment創(chuàng)建了前臺和后臺,前臺會調用后臺做一些計算處理。后臺運行了3個Pod,這些Pod是相互獨立且可被替換的,當Pod出現狀況被重建時,新建的Pod的IP地址是新IP,前臺的Pod無法直接感知。
使用Service解決Pod的訪問問題
Kubernetes中的Service對象就是用來解決上述Pod訪問問題的。Service有一個固定IP地址(在創(chuàng)建CCE集群時有一個服務網段的設置,這個網段專門用于給Service分配IP地址),Service將訪問它的流量轉發(fā)給Pod,具體轉發(fā)給哪些Pod通過Label來選擇,而且Service可以給這些Pod做負載均衡。
那么對于上面的例子,為后臺添加一個Service,通過Service來訪問Pod,這樣前臺Pod就無需感知后臺Pod的變化。

如何創(chuàng)建服務(Service)
集群內訪問(ClusterIP)
集群內訪問表示工作負載暴露給同一集群內其他工作負載訪問的方式,通過集群的內部 IP 暴露服務,選擇該值時服務只能夠在集群內部訪問。
通過集群內部域名訪問的格式為“<服務名稱>.<工作負載所在命名空間>.svc.cluster.local:<端口號>”,例如“nginx.default.svc.cluster.local:80”。

節(jié)點訪問(NodePort)
節(jié)點訪問 ( NodePort )是指在每個節(jié)點的IP上開放一個靜態(tài)端口,通過靜態(tài)端口對外暴露服務。節(jié)點訪問 ( NodePort )會路由到ClusterIP服務,這個ClusterIP服務會自動創(chuàng)建。通過請求 <NodeIP>:<NodePort>,可以從集群的外部訪問一個NodePort服務。

負載均衡(LoadBalancer)
負載均衡(LoadBalancer)類型的服務可以通過彈性負載均衡(ELB)從公網訪問到工作負載,與彈性IP方式相比提供了高可靠的保障。負載均衡訪問方式由公網彈性負載均衡服務地址以及設置的訪問端口組成,例如“10.117.117.117:80”。
在訪問負載均衡類型的服務時,從ELB過來的流量會先訪問到節(jié)點,然后通過Service轉發(fā)到Pod。

DNAT網關(DNAT)
“DNAT網關”可以為集群節(jié)點提供網絡地址轉換服務,使多個節(jié)點可以共享使用彈性IP。
NAT網關與彈性IP方式相比增強了可靠性,彈性IP無需與單個節(jié)點綁定,任何節(jié)點狀態(tài)的異常不影響其訪問。訪問方式由公網彈性IP地址以及設置的訪問端口組成,例如“10.117.117.117:80”。
