# Додавання записів до файлу /etc/hosts у Pod за допомогою HostAliases

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

---

<!-- overview -->

Додавання записів до файлу `/etc/hosts` у Pod надає можливість перевизначення розподілу імен на рівні Pod, коли DNS та інші параметри не застосовуються. Ви можете додавати ці власні записи за допомогою поля HostAliases у PodSpec.

Проєкт Kubernetes рекомендує змінювати конфігурацію DNS за допомогою поля `hostAliases` (частина файлу `.spec` для Podʼа), а не за допомогою контейнера init або інших засобів для редагування безпосередньо `/etc/hosts`. Зміни, внесені в інший спосіб, можуть бути перезаписані kubelet під час створення або перезапуску Pod.

<!-- steps -->

## Типовий вміст файлу hosts {#default-hosts-file-content}

Запустіть Pod з Nginx, який має призначену IP-адресу Podʼа:

```shell
kubectl run nginx --image nginx
```

```none
pod/nginx created
```

Перевірте IP-адресу Podʼа:

```shell
kubectl get pods --output=wide
```

```none
NAME     READY     STATUS    RESTARTS   AGE    IP           NODE
nginx    1/1       Running   0          13s    10.200.0.4   worker0
```

Вміст файлу hosts буде виглядати так:

```shell
kubectl exec nginx -- cat /etc/hosts
```

```none
# Kubernetes-managed hosts file.
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
fe00::0	ip6-mcastprefix
fe00::1	ip6-allnodes
fe00::2	ip6-allrouters
10.200.0.4	nginx
```

Типово файл `hosts` містить тільки шаблони IPv4 та IPv6, такі як `localhost` та власне імʼя хосту.

## Додавання додаткових записів за допомогою hostAliases {#adding-additional-entries-with-hostaliases}

Крім стандартних шаблонів, ви можете додати додаткові записи до файлу `hosts`. Наприклад: щоб перевести `foo.local`, `bar.local` в `127.0.0.1` та `foo.remote`, `bar.remote` в `10.1.2.3`, ви можете налаштувати HostAliases для Pod в підполі `.spec.hostAliases`:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/service/networking/hostaliases-pod.yaml" download="service/networking/hostaliases-pod.yaml"><code>service/networking/hostaliases-pod.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('service-networking-hostaliases-pod-yaml')" title="Копіювати service/networking/hostaliases-pod.yaml до буферу обміну"></img></div>
    <div class="includecode" id="service-networking-hostaliases-pod-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">hostaliases-pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">restartPolicy</span><span class="p">:</span><span class="w"> </span><span class="l">Never</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hostAliases</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">ip</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;127.0.0.1&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">hostnames</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="s2">&#34;foo.local&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="s2">&#34;bar.local&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">ip</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;10.1.2.3&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">hostnames</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="s2">&#34;foo.remote&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="s2">&#34;bar.remote&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">cat-hosts</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">busybox:1.28</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">command</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">cat</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="s2">&#34;/etc/hosts&#34;</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

Ви можете запустити Pod з такою конфігурацією, виконавши:

```shell
kubectl apply -f https://k8s.io/examples/service/networking/hostaliases-pod.yaml
```

```none
pod/hostaliases-pod created
```

Перевірте деталі Pod, щоб побачити його IPv4-адресу та статус:

```shell
kubectl get pod --output=wide
```

```none
NAME                           READY     STATUS      RESTARTS   AGE       IP              NODE
hostaliases-pod                0/1       Completed   0          6s        10.200.0.5      worker0
```

Вміст файлу `hosts` виглядає так:

```shell
kubectl logs hostaliases-pod
```

```none
# Kubernetes-managed hosts file.
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
fe00::0	ip6-mcastprefix
fe00::1	ip6-allnodes
fe00::2	ip6-allrouters
10.200.0.5	hostaliases-pod

# Entries added by HostAliases.
127.0.0.1	foo.local	bar.local
10.1.2.3	foo.remote	bar.remote
```

з додатковими записами, вказаними внизу.

## Чому kubelet керує файлом hosts? {#why-does-kubelet-manage-the-hosts-file}

kubelet керує файлом `hosts` для кожного контейнера Podʼа, щоб запобігти модифікації файлу контейнерним середовищем після того, як контейнери вже були запущені. Історично Kubernetes завжди використовував Docker Engine як своє контейнерне середовище, і Docker Engine модифікував файл `/etc/hosts` після запуску кожного контейнера.

Поточна версія Kubernetes може використовувати різні контейнерні середовища; проте, kubelet керує файлом hosts у кожному контейнері, щоб результат був таким, як очікувалося, незалежно від використаного контейнерного середовища.

<div class="alert alert-caution" role="note"><h4 class="alert-heading">Увага:</h4><p>Уникайте внесення ручних змін до файлу hosts всередині контейнера.</p>
<p>Якщо ви вносите ручні зміни до файлу hosts, ці зміни будуть втрачені при виході з контейнера.</p>
</div>
