Pod需要一種尋找其他pod的方式來使用其他pod所提供的服務,不像在沒有k8s的世界,系統管理員要在用戶端的設定檔明確指定服務的精確IP或者hostname來設定每一個客戶端的程式,但同樣的方式在k8s中並不適用,因為

介紹Service

k8s Service是一種為一組功能相同的pod提供一個單一不變進入點的資源。當服務存在時,它的ip跟port不會改變。客戶端透過ip和port建立連線,這些連線會被路由到提供該服務的任意一個pod上。

假如有一個系統有前端web跟後端資料庫的例子。有很多pod提供前端web,而只有一個pod提供後端資料庫。須要解決兩個問題才能讓系統正常運作。

透過為前端web建立Service資源,並將Service設定成可以在叢集外部訪問,可以暴露一個單一不變的ip讓外部的客戶端連接pod。同理,可以為後端資料庫pod建立Service資源,並為其分配一個固定的IP。儘管pod的IP會改變,但是服務的IP固定不變。另外,透過建立Service資源,能夠讓前端的pod透過環境變數或者DNS找到服務名稱來訪問後端服務。

圖5.1 內部和外部客戶端通常透過服務連接到pod

圖5.1 內部和外部客戶端通常透過服務連接到pod

建立Service資源

服務的背後可以有不只一個pod。服務的連接對所有的後端pod是負載平衡(load-balanced)的。 記得ReplicationController和其它的pod控制器中使用標籤選擇器來指定哪些pod屬於同一組。服務使用相同的機制。

圖5.2 標籤選擇器決定哪些pod屬於服務

圖5.2 標籤選擇器決定哪些pod屬於服務

先透過前一章方式,建立一個3個pod的ReplicationController,並且觀察pod有沒有啟動,等等就要為這些pod建立一個Service。

apiVersion: v1
kind: ReplicationController
metadata:
  name: kubia
spec:
  replicas: 3
  selector:
    app: kubia
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - name: kubia
        image: luksa/kubia
        ports:
        - containerPort: 8080
[root@cp200 ch5]# kubectl create -f kubia-rc.yaml
replicationcontroller/kubia created
[root@cp200 ch5]# kubectl get po,rc
NAME              READY   STATUS    RESTARTS   AGE
pod/kubia-fpcmk   1/1     Running   0          16s
pod/kubia-qcrjv   1/1     Running   0          16s
pod/kubia-vbsv4   1/1     Running   0          16s

NAME                          DESIRED   CURRENT   READY   AGE
replicationcontroller/kubia   3         3         3       16s
[root@cp200 ch5]#

透過 kubectl expose 建立Service

建立Service最簡單方式就是透過 kubectl expose 指令。 利用 kubectl expose 指令使用pod選擇器(就像建立ReplicationController時使用相同的pod選擇器)來建立Service資源,從而透過簡單的IP跟Port來訪問所有的pod。

透過 YAML檔 來建立Service