1. 程式人生 > 實用技巧 >Kubernetes Service

Kubernetes Service

------------恢復內容開始------------

1.1.1 什麼是Service (服務)

Service是Kubernetes裡最核心的資源物件之一,Service定義了一個服務的訪問入口地址,前端的應用(Pod)通過這個入口地址訪問其背後的一組由Pod副本組成的叢集實力。 Service與其後端Pod副本叢集之間則是通過Label Selector來實現"無縫對接"。而RC的作用實際上是保證Service 的服務能力和服務質量處於預期的標準。

通過分析、識別並建模系統中所有服務為微服務---Kubernetes Service,最終我們的系統由多個提供不同業務能力而又彼此獨立的微服務單元組成,服務之間通過TCP/IP

進行通訊,從而擁有了強大的分散式能力、彈性擴充套件能力、容錯能力

既然每個Pod都會被分配一個單獨的IP地址,而且每個Pod都提供了一個獨立的Endpoint(Pod IP+ContainerPort)以被客戶端訪問,現在多個Pod副本組成了一個叢集來提供訪問。

Kubernetes 需要在每個Node上安裝kube-proxy,kube-proxy程序其實就是一個智慧的軟體負載均衡器,它負責把對Service的請求轉發到後端的某個Pod例項上,並在內部實現服務的負載均衡與會話保持機制。

Kubernetes發明了一個很巧明的設計,Service不是共用一個負載均衡器的IP地址,而是每個Service分配了一個全域性唯一的虛擬IP地址,這個虛擬IP被稱為Cluster IP

。這樣每個服務就變成了具備唯一IP地址的"通訊節點",服務呼叫就變成了最基礎的TCP網路通訊問題

Pod的Endpoint地址會隨著Pod的銷燬和重新建立而發生改變,因為新的Pod地址與之前的舊的Pod不同。而Service一旦被建立,Kubernetes就會自動為它分配一個可用的Cluster IP,而且在Service的整個宣告週期內,它的Cluster IP不會發生改變。所以只要將Service的name與Service的Cluster IP地址做一個DNS域名對映即可解決問題

1.1.2 建立一個Service

案例:手動建立一個Service

cat > abcdocker-server.yaml <<EOF 
kind: Service
apiVersion: v1
metadata:
  name: mallh5
-service namespace: abcdocker spec: selector: app: mallh5web type: NodePort ports: - protocol: TCP port: 3017 targetPort: 5003 nodePort: 31122 EOF

Http Get

說明

Port

port表示:service暴露在cluster ip(Seriver ip )上的埠,:port 是提供給叢集內部客戶訪問service的入口。

NodePordt

nodePort是kubernetes提供給叢集外部客戶訪問service入口的一種方式(另一種方式是LoadBalancer,:nodePort 是提供給叢集外部客戶訪問service的入口。

path

HTTP伺服器上的訪問路徑

httpHeaders

要在請求中設定的自定義標頭。HTTP允許重複標頭

targetPort

targetPort很好理解,targetPort是pod上的埠,從port和nodePort上到來的資料最終經過kube-proxy流入到後端pod的targetPort上進入容器。

建立
[root@master test]# kubectl create -f abcdocker-server.yaml
service/mallh5-service created
檢視server詳細資訊
[root@master test]# kubectl get service --namespace=abcdocker
NAME             TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
mallh5-service   NodePort   10.254.22.153   <none>        3017:31122/TCP   13m

[root@master test]# kubectl get service
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.254.0.1       <none>        443/TCP        35d
nginx-service   NodePort    10.254.200.178   <none>        80:31000/TCP   34d

通過kubectl get endpoints可以檢視到網路

1.1.3 外部系統訪問Service問題

我們需要掌握kubernetes中的三種IP

1.Node IP:Node節點IP地址 2.Pod IP:Pod的IP地址 3.Cluster IP:Service的IP地址

引數解釋:1.Node IP是Kubernetes叢集中每個節點的物理網絡卡的IP地址,這是一個真實存在的物理網路,所有屬於這個網路的伺服器之間都能通過這個網路直接通訊,不管他們中間是否含有不屬於Kubernetes叢集中的節點。想Kubernetes之外的節點訪問Kubernetes叢集內的節點或者TCP/IP服務時,必須通過Node IP

2.Pod IP是每個Pod的IP地址,它是Docker Engine根據docker0網橋的IP地址段進行分配的,通常是一個虛擬的二層網路,Kubernetes要求位於不同Node上的Pod能夠彼此直接通訊,所以Kubernetes裡一個Pod裡的容器訪問另外一個Pod裡的容器,就是通過Pod IP所在的虛擬二層網路進行通訊,而真實的TCP/IP流量則是通過Node IP所在的物理網絡卡流出

3.Cluster IP,它是一個虛擬IP,但更像是一個偽造的IP網路

(1)Cluster IP僅僅作用於Kubernetes Service物件,並由Kubernetes管理和分配IP地址(來源於Cluster IP地址池) (2)Cluster IP無法被Ping,因為沒有一個"實體網路物件"來響應 (3)在Kubernetes叢集內,Node IP、Pod IP、Cluster IP之間的通訊,採用的是Kubernetes自己設計的特殊路由規則

1.1.4 簡述NodePort實現方式

NodePort的實現方式是在Kubernetes叢集裡的每個Node上為需要外部訪問的Service開啟一個對應的TCP請求,外部系統只要用任意Node的IP地址+具體的NodePort埠即可訪問服務,在任意node上執行netstat服務,我們可以看到NodePort埠被監聽

但NodePort還沒有完全解決外部訪問Service的所有問題,比如負載均衡的問題,假如說我們叢集中有10個Node,則此時最好有一個負載均衡,外部的請求只需要訪問此負載均衡器的IP地址,由負載均衡負責轉發流量到後面某個NodePort上

上圖中Load balancer元件獨立於Kubernetes叢集之外,通常是一個硬體的負載均衡器,或者是以軟體方式實現的,例如Haproxy或者Nginx。對於每個Service,我們通常配置一個對應的Load balancer例項來轉發流量到後端的Node