帶 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
。
注意
如果你使用 minikube 或類似工具,你可能需要採取額外步驟來確保你有 DNS。啟動具有 Pod-to-Pod 通訊的 Job
要在 Job 中啟用使用 Pod 主機名的 Pod-to-Pod 通訊,你必須執行以下操作:
設定一個無頭服務,併為 Job 建立的 Pod 配置有效的標籤選擇器。無頭服務必須與 Job 在同一名稱空間中。一種簡單的方法是使用
job-name: <your-job-name>
選擇器,因為job-name
標籤將由 Kubernetes 自動新增。此配置將觸發 DNS 系統為執行 Job 的 Pod 主機名建立記錄。透過在 Job 模板規範中包含以下值,將無頭服務配置為 Job Pod 的子域服務:
subdomain: <headless-svc-name>
示例
以下是一個透過 Pod 主機名啟用 Pod-to-Pod 通訊的 Job 的工作示例。該 Job 僅在所有 Pod 都成功地使用主機名相互 ping 通後才會完成。
注意
在以下示例中,每個 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 策略。