具有 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
。注意
如果您使用 MiniKube 或類似工具,您可能需要採取額外步驟以確保您擁有 DNS。使用 Pod 到 Pod 通訊啟動 Job
若要啟用在 Job 中使用 Pod 主機名稱的 Pod 到 Pod 通訊,您必須執行以下操作
設定一個無頭服務(Headless Service),並為您的 Job 建立的 Pod 設定有效的標籤選擇器。無頭服務必須與 Job 在相同的命名空間中。一個簡單的方法是使用
job-name: <your-job-name>
選擇器,因為job-name
標籤將由 Kubernetes 自動新增。此設定將觸發 DNS 系統為執行您 Job 的 Pod 的主機名稱建立記錄。透過在您的 Job 範本規格中包含以下值,將無頭服務設定為 Job Pod 的子網域服務
subdomain: <headless-svc-name>
範例
以下是一個透過啟用 Pod 主機名稱進行 Pod 到 Pod 通訊的 Job 工作範例。只有在所有 Pod 使用主機名稱成功互相 ping 通後,Job 才會完成。
注意
在以下範例中,於每個 Pod 上執行的 Bash 腳本中,如果需要從命名空間外部訪問 Pod,Pod 主機名稱也可以加上命名空間作為前綴。
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
注意
請記住,本範例中使用的<pod-hostname>.<headless-service-name>
名稱格式不適用於 DNS 策略設定為 None
或 Default
的情況。您可以在此處了解更多關於 Pod DNS 策略的資訊。