帶 Pod-to-Pod 通訊的作業

在此示例中,你將執行一個索引式完成模式的 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-to-Pod 通訊的 Job

要在 Job 中啟用使用 Pod 主機名的 Pod-to-Pod 通訊,你必須執行以下操作:

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

  2. 透過在 Job 模板規範中包含以下值,將無頭服務配置為 Job Pod 的子域服務:

    subdomain: <headless-svc-name>
    

示例

以下是一個透過 Pod 主機名啟用 Pod-to-Pod 通訊的 Job 的工作示例。該 Job 僅在所有 Pod 都成功地使用主機名相互 ping 通後才會完成。

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
最後修改於 2025 年 2 月 8 日下午 4:05 PST:調整 job-with-pod-to-pod-communication.md (2cbb8e33de)