具有 Pod 對 Pod 通訊功能的 Job

在此範例中,您將在索引完成模式中執行 Job,並設定為 Job 建立的 Pod 可以使用 Pod 主機名稱而非 Pod IP 位址彼此通訊。

Job 中的 Pod 可能需要在彼此之間通訊。在每個 Pod 中執行的使用者工作負載可以查詢 Kubernetes API 伺服器以了解其他 Pod 的 IP,但是依靠 Kubernetes 的內建 DNS 解析會更簡單。

索引完成模式中的 Job 會自動將 Pod 的主機名稱設定為 ${jobName}-${completionIndex} 格式。您可以使用此格式來確定性地建立 Pod 主機名稱,並啟用 Pod 通訊,而無需建立與 Kubernetes 控制平面的用戶端連線以透過 API 請求取得 Pod 主機名稱/IP。

此組態適用於需要 Pod 網路功能,但您不想依賴與 Kubernetes API 伺服器的網路連線的使用案例。

事前準備

您應該已經熟悉 Job 的基本用法。

您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且這些節點不作為控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用以下 Kubernetes 體驗環境

您的 Kubernetes 伺服器版本必須為 v1.21 或更新版本。若要檢查版本,請輸入 kubectl version

使用 Pod 到 Pod 通訊啟動 Job

若要啟用在 Job 中使用 Pod 主機名稱的 Pod 到 Pod 通訊,您必須執行以下操作

  1. 設定一個無頭服務(Headless Service),並為您的 Job 建立的 Pod 設定有效的標籤選擇器。無頭服務必須與 Job 在相同的命名空間中。一個簡單的方法是使用 job-name: <your-job-name> 選擇器,因為 job-name 標籤將由 Kubernetes 自動新增。此設定將觸發 DNS 系統為執行您 Job 的 Pod 的主機名稱建立記錄。

  2. 透過在您的 Job 範本規格中包含以下值,將無頭服務設定為 Job Pod 的子網域服務

    subdomain: <headless-svc-name>
    

範例

以下是一個透過啟用 Pod 主機名稱進行 Pod 到 Pod 通訊的 Job 工作範例。只有在所有 Pod 使用主機名稱成功互相 ping 通後,Job 才會完成。


apiVersion: v1
kind: Service
metadata:
  name: headless-svc
spec:
  clusterIP: None # clusterIP must be None to create a headless service
  selector:
    job-name: example-job # must match Job name
---
apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  completions: 3
  parallelism: 3
  completionMode: Indexed
  template:
    spec:
      subdomain: headless-svc # has to match Service name
      restartPolicy: Never
      containers:
      - name: example-workload
        image: bash:latest
        command:
        - bash
        - -c
        - |
          for i in 0 1 2
          do
            gotStatus="-1"
            wantStatus="0"             
            while [ $gotStatus -ne $wantStatus ]
            do                                       
              ping -c 1 example-job-${i}.headless-svc > /dev/null 2>&1
              gotStatus=$?                
              if [ $gotStatus -ne $wantStatus ]; then
                echo "Failed to ping pod example-job-${i}.headless-svc, retrying in 1 second..."
                sleep 1
              fi
            done                                                         
            echo "Successfully pinged pod: example-job-${i}.headless-svc"
          done          

套用以上範例後,使用以下方式透過網路互相連線:<pod-hostname>.<headless-service-name>。您應該會看到類似以下的輸出

kubectl logs example-job-0-qws42
Failed to ping pod example-job-0.headless-svc, retrying in 1 second...
Successfully pinged pod: example-job-0.headless-svc
Successfully pinged pod: example-job-1.headless-svc
Successfully pinged pod: example-job-2.headless-svc
上次修改時間:2023 年 8 月 23 日下午 2:05 PST:Update Job as suitable for scientific computing (f3dfd99576)