[zh-cn]sync job-with-pod-to-pod-communication
Signed-off-by: xin.li <xin.li@daocloud.io>
This commit is contained in:
parent
4790769ff7
commit
c97f93ff41
|
|
@ -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 地址进行通信。
|
||||||
|
|
@ -30,11 +32,10 @@ to learn the IPs of the other Pods, but it's much simpler to rely on Kubernetes'
|
||||||
Jobs in Indexed completion mode automatically set the pods' hostname to be in the format of
|
Jobs in Indexed completion mode automatically set the pods' hostname to be in the format of
|
||||||
`${jobName}-${completionIndex}`. You can use this format to deterministically build
|
`${jobName}-${completionIndex}`. You can use this format to deterministically build
|
||||||
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
|
||||||
|
|
@ -51,20 +52,20 @@ You should already be familiar with the basic use of [Job](/docs/concepts/worklo
|
||||||
|
|
||||||
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
|
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
|
||||||
|
|
||||||
{{<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.
|
||||||
-->
|
-->
|
||||||
|
|
@ -103,15 +113,62 @@ The Job is completed only after all pods successfully ping each other using host
|
||||||
以下是启用通过 Pod 主机名来完成 Pod 间通信的 Job 示例。
|
以下是启用通过 Pod 主机名来完成 Pod 间通信的 Job 示例。
|
||||||
只有在使用主机名成功 ping 通所有 Pod 之后,此 Job 才会结束。
|
只有在使用主机名成功 ping 通所有 Pod 之后,此 Job 才会结束。
|
||||||
|
|
||||||
{{<note>}}
|
{{< note >}}
|
||||||
<!--
|
<!--
|
||||||
In the Bash script executed on each pod in the example below, the pod hostnames can be prefixed
|
In the Bash script executed on each pod in the example below, the pod hostnames can be prefixed
|
||||||
by the namespace as well if the pod needs to be reached from outside the namespace.
|
by the namespace as well if the pod needs to be reached from outside the namespace.
|
||||||
-->
|
-->
|
||||||
在以下示例中的每个 Pod 中执行的 Bash 脚本中,如果需要从名字空间外到达 Pod,
|
在以下示例中的每个 Pod 中执行的 Bash 脚本中,如果需要从名字空间外到达 Pod,
|
||||||
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
|
||||||
|
|
@ -176,13 +233,12 @@ Successfully pinged pod: example-job-1.headless-svc
|
||||||
Successfully pinged pod: example-job-2.headless-svc
|
Successfully pinged pod: example-job-2.headless-svc
|
||||||
```
|
```
|
||||||
|
|
||||||
{{<note>}}
|
{{< note >}}
|
||||||
<!--
|
<!--
|
||||||
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>}}
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue