# Завдання (Job) з комунікацією Pod-Pod

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

У цьому прикладі ви запустите Job в [Indexed completion mode](/blog/2021/04/19/introducing-indexed-jobs/), налаштований таким чином, щоб Podʼи, створені Job, могли комунікувати один з одним, використовуючи назви хостів Podʼів, а не IP-адреси Podʼів.

Podʼи в межах Job можуть потребувати комунікації між собою. Робоче навантаження користувача, що виконується в кожному Podʼі, може звертатися до сервера API Kubernetes для отримання IP-адрес інших Podʼів, але набагато простіше покладатися на вбудований DNS-резолвер Kubernetes.

Job в Indexed completion mode автоматично встановлюють назви хостів Podʼів у форматі
`${jobName}-${completionIndex}`. Ви можете використовувати цей формат для детермінованого створення назв хостів Podʼів та забезпечення комунікації між Podʼами *без* необхідності створювати клієнтське зʼєднання з панеллю управління Kubernetes для отримання назв хостів/IP-адрес Podʼів через API-запити.

Ця конфігурація корисна для випадків, коли необхідна мережева взаємодія Podʼів, але ви не хочете залежати від мережевого зʼєднання з сервером API Kubernetes.

## Перш ніж ви розпочнете

Ви повинні вже бути знайомі з основами використання [Job](/docs/concepts/workloads/controllers/job/).

<p>Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою <a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">minikube</a> або використовувати одну з цих пісочниць:</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>
 
 
 Версія вашого Kubernetes сервера має бути не старішою ніж v1.21.
  <p>Для перевірки версії введіть  <code>kubectl version</code>.</p>



<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Якщо ви використовуєте minikube або подібний інструмент, можливо, вам потрібно буде вжити
<a href="https://minikube.sigs.k8s.io/docs/handbook/addons/ingress-dns/">додаткових заходів</a>, щоб переконатись, що ви використовуєте DNS.</div>


<!-- steps -->

## Запуск роботи з комунікацією між Podʼами {#starting-a-job-with-pod-to-pod-communication}

Щоб увімкнути комунікацію між Podʼами з використанням назв хостів Podʼів у Job, ви повинні зробити наступне:

1. Налаштуйте [headless Service](/docs/concepts/services-networking/service/#headless-services)
з дійсним селектором міток для Podʼів, створених вашим Job. Headless Service має бути в тому ж просторі імен, що й Job. Один із простих способів зробити це — використати селектор `job-name: <your-job-name>`, оскільки мітка `job-name` буде додана Kubernetes автоматично. Ця конфігурація активує систему DNS для створення записів назв хостів Podʼів, що виконують ваш обʼєкт Job.

1. Налаштуйте headless Service як піддомен для Podʼів Job, включивши наступне значення у шаблон специфікації Job:

   ```yaml
   subdomain: <headless-svc-name>
   ```

### Приклад {#example}

Нижче наведено робочий приклад Job з увімкненою комунікацією між Podʼами через назви хостів Podʼів. Job завершується лише після того, як усі Podʼи успішно пінгують один одного за допомогою назв хостів.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>У Bash-скрипті, що виконується на кожному Podʼі у прикладі нижче, назви хостів Podʼів можуть мати префікс простору імен, якщо Pod повинен бути доступний ззовні простору імен.</div>


```yaml

apiVersion: v1
kind: Service
metadata:
  name: headless-svc
spec:
  clusterIP: None # clusterIP має бути None для створення headless service
  selector:
    job-name: example-job # має відповідати імені Job
---
apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  completions: 3
  parallelism: 3
  completionMode: Indexed
  template:
    spec:
      subdomain: headless-svc # має відповідати імені Service
      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ʼи зможуть звертатись один до одного в мережі, використовуючи: `<pod-hostname>.<headless-service-name>`. Ви повинні побачити вихідні дані, подібні до наступних:

```shell
kubectl logs example-job-0-qws42
```

```none
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
```


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Майте на увазі, що формат імені <code>&lt;pod-hostname&gt;.&lt;headless-service-name&gt;</code>, використаний у цьому прикладі, не працюватиме з політикою DNS, встановленою на <code>None</code> або <code>Default</code>. Ви можете дізнатися більше про <a href="/uk/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy">політику DNS для Podʼів</a>.</div>
