雲端容器化技術與資源調度

認識 Kubernetes Service

當我們需要 外界 <-> Pod 或者 Pod <-> Pod 通訊時,就需要靠 K8S 的 服務探索機制 (Service Discovery) 來達成。所謂 Service Discovery 即是透過一些機制 (例如 DNS) 來找到路由至 Pod 的方法。 只要需要對 Pod 做通訊,就需要建立 Service 資源。

Pod 自己不是都有自己的 IP 嗎? 為什麼要多一個 Service?

  1. 雖然每一個個 Pod 本身都自帶一個 SDN 的 IP,但 Pod IP 本身是 K8S 叢集內的通訊用的虛擬內部 IP 網段,無法直接讓外界路由進來。
  2. Pod 的 IP 都是隨機浮動的,因此即使是 Pod <-> Pod 通訊,程式設計師也不應該直接使用 Pod IP。

先前有提到 K8S 提供非常彈性的軟硬體擴充介面,因此網路設備大廠以及雲端服務提供者都有提供 K8S SDN 整合,來達到讓 Pod IP 直接整合入組織的硬體 IP 網段,來進行更直接且一致性的網路控管。

透過 YAML 描述檔建立一個 Service

就像之前建立的 Deployment 資源一樣,K8S Service 資源亦可透過 YAML 來建立。因此這邊我們將會透過撰寫 YAML 的方式來建立一個 Service 資源,它可以幫助我們透過固定的方式來找到 Pod 並且與 Pod 進行通訊。

在 Cloud Shell 輸入以下指令

cd ~
vim hello-site.service.yml

在文字編輯器中,輸入以下內容後存檔:

apiVersion: "v1"
kind: "Service"
metadata:
  name: "hello-site-app-service"
  namespace: "default"
  labels:
    app: "hello-site-app"
spec:
  ports:
  - protocol: "TCP"
    port: 80
  selector:
    app: "hello-site-app"
  type: "LoadBalancer"

將 Service YAML 檔送入 K8S Master 中

$ kubectl create -f hello-site.service.yml

Load Balancer 類型服務探索歷程

k8s service lb

Service 的類型

那如果是 Pod <-> Pod 通訊呢?

答案是透過 DNS + ClusterIP:

  1. 設立 Service 時,將 Service 設為 ClusterIP 類型
  2. 這時,任何 Pod 只要透過 [service 名稱].[namespace 名稱].cluster.local 域名,即可解析出此 Service 的 VIP,進而與 Pod 通訊。

cluster ip