今天進入到 service ,大家可以回想一下,我們前幾篇所講到的 k8s 最小部署單位是 pod ,但是 pod 又有 replica , 那到底他要怎麼識別要把 request 導進去哪個 pod呢? 這就是services 所負責的工作。

Services

k8s services 也可以想成是 pod 的 loadbalance,下面來看一下架構圖

k8s-services

由上面圖可以看到,不管任何服務集群,要存取另一個服務,都要透過 service。假設有一個 client 需要透過 A 服務拿取資料,但是 A 服務又需要相依 B 服務的資料,這時,他並不是 A 服務的 POD 直連 B 服務的 POD ,而是需要透過 B 服務的 service 才能存取到 B 服務的 POD。所以有一點要注意,不管從外面進來的存取,或是內部服務互相存取,都要記得!都是透過 service 才能把流量導進來。

這邊補充一下,一群 POD ,實務上就是所有相同行為的 application,所以實務上不存在一個 service 往後導向兩個行為完全不同的 POD。

這邊開始,我們用前幾天的 nginx 幫他設定一個 service.yaml

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  # type 有四種 ClusterIP, NodePort, LoadBalancer, ExternalName
  # 預設是 ClusterIP
  type: ClusterIP
  # 選擇帶有 "app=nginx" 的 pod
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    # 此為 Pod 對外開放的 port number
    targetPort: 80

這樣就完成了一個 service 的設定

可以透過

# 這句是指 port-foward services , 另外如果要看單個 POD 的運行狀況 可以下 get pods 後 port-forward [podname],來做單 pod 運作。
$ kubectl --kubeconfig ~/.kube/k3s.yaml port-forward svc/nginx-service 8989:80`
Forwarding from 127.0.0.1:8989 -> 80
Forwarding from [::1]:8989 -> 80

然後用瀏覽器開啟 http://127.0.0.1:8989 就能看到 nginx 的畫面了。

service 是把流量導進,你實際撰寫服務的重要元件,所以一定要搞懂 service & pod 之間的關係,再次強調,任何東西要存取 POD 都是要透過 service 進來。