[zh-cn]sync job-with-pod-to-pod-communication

Signed-off-by: xin.li <xin.li@daocloud.io>
This commit is contained in:
xin.li 2025-02-09 19:39:21 +08:00
parent 4790769ff7
commit c97f93ff41
1 changed files with 82 additions and 26 deletions

View File

@ -14,11 +14,13 @@ weight: 30
<!-- overview --> <!-- overview -->
<!-- <!--
In this example, you will run a Job in [Indexed completion mode](/blog/2021/04/19/introducing-indexed-jobs/) configured such that In this example, you will run a Job in [Indexed completion mode](/blog/2021/04/19/introducing-indexed-jobs/)
the pods created by the Job can communicate with each other using pod hostnames rather than pod IP addresses. configured such that the pods created by the Job can communicate with each other using pod hostnames rather
than pod IP addresses.
Pods within a Job might need to communicate among themselves. The user workload running in each pod could query the Kubernetes API server Pods within a Job might need to communicate among themselves. The user workload running in each pod
to learn the IPs of the other Pods, but it's much simpler to rely on Kubernetes' built-in DNS resolution. could query the Kubernetes API server to learn the IPs of the other Pods, but it's much simpler to
rely on Kubernetes' built-in DNS resolution.
--> -->
在此例中,你将以[索引完成模式](/blog/2021/04/19/introducing-indexed-jobs/)运行一个 Job 在此例中,你将以[索引完成模式](/blog/2021/04/19/introducing-indexed-jobs/)运行一个 Job
并通过配置使得该 Job 所创建的各 Pod 之间可以使用 Pod 主机名而不是 Pod IP 地址进行通信。 并通过配置使得该 Job 所创建的各 Pod 之间可以使用 Pod 主机名而不是 Pod IP 地址进行通信。
@ -32,9 +34,8 @@ Jobs in Indexed completion mode automatically set the pods' hostname to be in th
pod hostnames and enable pod communication *without* needing to create a client connection to pod hostnames and enable pod communication *without* needing to create a client connection to
the Kubernetes control plane to obtain pod hostnames/IPs via API requests. the Kubernetes control plane to obtain pod hostnames/IPs via API requests.
This configuration is useful This configuration is useful for use cases where pod networking is required but you don't want
for use cases where pod networking is required but you don't want to depend on a network to depend on a network connection with the Kubernetes API server.
connection with the Kubernetes API server.
--> -->
索引完成模式下的 Job 自动将 Pod 的主机名设置为 `${jobName}-${completionIndex}` 的格式。 索引完成模式下的 Job 自动将 Pod 的主机名设置为 `${jobName}-${completionIndex}` 的格式。
你可以使用此格式确定性地构建 Pod 主机名并启用 Pod 通信,无需创建到 Kubernetes 你可以使用此格式确定性地构建 Pod 主机名并启用 Pod 通信,无需创建到 Kubernetes
@ -53,18 +54,18 @@ You should already be familiar with the basic use of [Job](/docs/concepts/worklo
{{< note >}} {{< note >}}
<!-- <!--
If you are using MiniKube or a similar tool, you may need to take If you are using minikube or a similar tool, you may need to take
[extra steps](https://minikube.sigs.k8s.io/docs/handbook/addons/ingress-dns/) [extra steps](https://minikube.sigs.k8s.io/docs/handbook/addons/ingress-dns/)
to ensure you have DNS. to ensure you have DNS.
--> -->
如果你正在使用 MiniKube 或类似的工具, 如果你正在使用 minikube 或类似的工具,
你可能需要采取[额外的步骤](https://minikube.sigs.k8s.io/docs/handbook/addons/ingress-dns/)来确保你拥有 DNS。 你可能需要采取[额外的步骤](https://minikube.sigs.k8s.io/docs/handbook/addons/ingress-dns/)来确保你拥有 DNS。
{{< /note >}} {{< /note >}}
<!-- steps --> <!-- steps -->
<!-- <!--
## Starting a Job with Pod-to-Pod Communication ## Starting a Job with Pod-to-Pod communication
To enable pod-to-pod communication using pod hostnames in a Job, you must do the following: To enable pod-to-pod communication using pod hostnames in a Job, you must do the following:
--> -->
@ -74,11 +75,14 @@ To enable pod-to-pod communication using pod hostnames in a Job, you must do the
<!-- <!--
1. Set up a [headless Service](/docs/concepts/services-networking/service/#headless-services) 1. Set up a [headless Service](/docs/concepts/services-networking/service/#headless-services)
with a valid label selector for the pods created by your Job. The headless service must be in the same namespace as with a valid label selector for the pods created by your Job. The headless service must be
the Job. One easy way to do this is to use the `job-name: <your-job-name>` selector, since the `job-name` label will be automatically added by Kubernetes. This configuration will trigger the DNS system to create records of the hostnames of in the same namespace as the Job. One easy way to do this is to use the
the pods running your Job. `job-name: <your-job-name>` selector, since the `job-name` label will be automatically added
by Kubernetes. This configuration will trigger the DNS system to create records of the hostnames
of the pods running your Job.
2. Configure the headless service as subdomain service for the Job pods by including the following value in your Job template spec: 2. Configure the headless service as subdomain service for the Job pods by including the following
value in your Job template spec:
--> -->
1. 对于 Job 所创建的那些 Pod 1. 对于 Job 所创建的那些 Pod
使用一个有效的标签选择算符创建[无头服务](/zh-cn/docs/concepts/services-networking/service/#headless-services)。 使用一个有效的标签选择算符创建[无头服务](/zh-cn/docs/concepts/services-networking/service/#headless-services)。
@ -89,12 +93,18 @@ the pods running your Job.
2. 通过将以下值包括到你的 Job 模板规约中,针对该 Job 的 Pod将无头服务配置为其子域服务 2. 通过将以下值包括到你的 Job 模板规约中,针对该 Job 的 Pod将无头服务配置为其子域服务
<!--
```yaml
subdomain: <headless-svc-name>
```
-->
```yaml ```yaml
subdomain: <无头服务的名称> subdomain: <无头服务的名称>
``` ```
<!-- <!--
### Example ### Example
Below is a working example of a Job with pod-to-pod communication via pod hostnames enabled. Below is a working example of a Job with pod-to-pod communication via pod hostnames enabled.
The Job is completed only after all pods successfully ping each other using hostnames. The Job is completed only after all pods successfully ping each other using hostnames.
--> -->
@ -112,6 +122,53 @@ by the namespace as well if the pod needs to be reached from outside the namesp
Pod 主机名也可以带有该名字空间作为前缀。 Pod 主机名也可以带有该名字空间作为前缀。
{{< /note >}} {{< /note >}}
<!--
```yaml
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
```
-->
```yaml ```yaml
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
@ -180,9 +237,8 @@ Successfully pinged pod: example-job-2.headless-svc
<!-- <!--
Keep in mind that the `<pod-hostname>.<headless-service-name>` name format used Keep in mind that the `<pod-hostname>.<headless-service-name>` name format used
in this example would not work with DNS policy set to `None` or `Default`. in this example would not work with DNS policy set to `None` or `Default`.
You can learn more about pod DNS policies [here](/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy). Refer to [Pod's DNS Policy](/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy).
--> -->
谨记此例中使用的 `<Pod 主机名>.<无头服务名称>` 名称格式不适用于设置为 `None``Default` 的 DNS 策略。 谨记此例中使用的 `<Pod 主机名>.<无头服务名称>` 名称格式不适用于设置为 `None``Default` 的 DNS 策略。
你可以在[此处](/zh-cn/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy)了解有关 请参阅 [Pod 的 DNS 策略](/zh-cn/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy)。
Pod DNS 策略的更多信息。
{{< /note >}} {{< /note >}}