# Маршрутизація з урахуванням топології

> _Маршрутизацію з урахуванням топології_ надає механізм для збереження мережевого трафіку в межах зони, з якої він походить. Віддача переваги трафіку в межах однієї зони між Podʼами в вашому кластері може допомогти з надійністю, продуктивністю (мережевою затримкою та пропускною здатністю) або вартістю.

---

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

---

<!-- overview -->








  <div class="feature-state-notice feature-beta">
      <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span>
      <code>Kubernetes v1.23 [beta]</code>
    </div>
  




<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>До Kubernetes 1.27 ця функція відома як <em>Topology Aware Hints</em>.</div>


_Маршрутизація з урахуванням топології_ налаштовує поведінку маршрутизації для того, щоб надавати перевагу зберіганню трафіку в межах тієї зони, з якої він походить. У деяких випадках це може допомогти зменшити витрати або покращити мережеву продуктивність.

<!-- body -->

## Мотивація {#motivation}

Кластери Kubernetes все частіше розгортаються в багатозональних середовищах. _Маршрутизацію з урахуванням топології_ забезпечує механізм для збереження трафіку в межах зони, з якої він походить. При розрахунку точок доступу для <a class='glossary-tooltip' title='Спосіб відкрити доступ до застосунку, що запущений на декількох Podʼах у вигляді мережевої служби.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/services-networking/service/' target='_blank' aria-label='Service'>Service</a>, контролер EndpointSlice враховує топологію (регіон і зону) кожної точки доступу та заповнює поле підказок для виділення її в зону. Компоненти кластера, такі як <a class='glossary-tooltip' title='kube-proxy — це мережевий проксі, що запущений на кожному вузлі кластера.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/reference/command-line-tools-reference/kube-proxy/' target='_blank' aria-label='kube-proxy'>kube-proxy</a>, можуть використовувати ці підказки для впливу на маршрутизацію трафіку (надання переваги точкам доступу, які знаходяться в топологічно ближчих зонах).

## Увімкнення маршрутизації з урахуванням топології {#enabling-topology-aware-routing}


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>До Kubernetes 1.27 така поведінка контролювалася за допомогою анотації <code>service.kubernetes.io/topology-aware-hints</code>.</div>


Ви можете увімкнути маршрутизацію з урахуванням топології, для Service, встановивши анотацію `service.kubernetes.io/topology-mode` в значення `Auto`. Коли є достатня кількість точок доступу у кожній зоні, в EndpointSlice будуть заповнені підказки щодо топології для виділення окремих точок доступу конкретним зонам, що призводить до того, що трафік буде маршрутизуватися ближче до місця, звідки він походить.

## Найкращий випадок застосування {#when-it-works-best}

Ця функція працює найкраще, коли:

### 1. Вхідний трафік рівномірно розподілений {#1-incoming-traffic-is-evenly-distributed}

Якщо значна частина трафіку походить з однієї зони, цей трафік може перенавантажити підмножину точок доступу, які були виділені для цієї зони. Не рекомендується використовувати цю функцію, коли очікується, що вхідний трафік буде походити з однієї зони.

### 2. У Service є 3 чи більше точок доступу на зону {#three-or-more-endpoints-per-zone}

У кластері з трьома зонами це означає 9 чи більше точок доступу. Якщо кількість точок доступу менше ніж 3 на зону, існує висока (≈50%) ймовірність, що контролер EndpointSlice не зможе рівномірно розподілити точки доступу та повернеться до застосування типового підходу до маршрутизації на рівні кластера.

## Як це працює {#how-it-works}

Характеристика "Auto" намагається пропорційно виділити кількість точок доступу кожній зоні. Зверніть увагу, що цей підхід працює найкраще для сервісів зі значною кількістю точок доступу.

### Контролер EndpointSlice {#implementation-control-plane}

Контролер EndpointSlice відповідає за встановлення підказок на EndpointSlice, коли цей евристичний підхід увімкнено. Контролер виділяє пропорційну кількість точок доступу кожній зоні. Ця пропорція ґрунтується на [виділеному обсязі](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable) ядер ЦП для вузлів, що працюють в цій зоні. Наприклад, якщо в одній зоні є 2 ядра ЦП, а в іншій зоні лише 1 ядро ЦП, контролер виділить подвійну кількість точок доступу для зони з 2 ядрами ЦП.

Нижче наведено приклад того, як виглядає EndpointSlice, коли підказки вже заповнено:

```yaml
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
  name: example-hints
  labels:
    kubernetes.io/service-name: example-svc
addressType: IPv4
ports:
  - name: http
    protocol: TCP
    port: 80
endpoints:
  - addresses:
      - "10.1.2.3"
    conditions:
      ready: true
    hostname: pod-1
    zone: zone-a
    hints:
      forZones:
        - name: "zone-a"
```

### kube-proxy {#implementation-kube-proxy}

Компонент kube-proxy фільтрує точки доступу, до яких він направляє трафік, на підставі підказок, встановлених контролером EndpointSlice. У більшості випадків це означає, що kube-proxy може направляти трафік до точок доступу в тій самій зоні. Іноді контролер вибирає точки доступу з іншої зони, щоб забезпечити більш рівномірний розподіл точок доступу між зонами. Це може призвести до того, що деякий трафік буде направлятися до інших зон.

## Запобіжники {#safeguards}

Панель управління Kubernetes та kube-proxy на кожному вузлі застосовують деякі правила захисту перед використанням Topology Aware Hints. Якщо ці перевірки не пройдуть, kube-proxy вибирає точки доступу з будь-якої частини вашого кластера, незалежно від зони.

1. **Недостатня кількість точок доступу:** Якщо точок доступу менше, ніж зон в кластері, контролер не буде додавати жодних підказок.

2. **Неможливо досягнути збалансованого розподілу:** У деяких випадках може бути неможливо досягти збалансованого розподілу точок доступу між зонами. Наприклад, якщо zone-a удвічі більша, ніж zone-b, але є лише 2 точки доступу, точка доступу, призначена zone-a, може отримати вдвічі більше трафіку, ніж zone-b. Контролер не призначає підказок, якщо він не може знизити це значення "очікуваного перевантаження" нижче прийнятного порогу для кожної зони. Важливо, що це не ґрунтується на зворотньому звʼязку в режимі реального часу. Можливе перенавантаження окремих точок доступу.

3. **Один чи декілька вузлів має недостатню інформацію:** Якщо який-небудь вузол не має мітки `topology.kubernetes.io/zone` або не повідомляє значення виділеного ЦП, панель управління не встановлює жодних підказок точок доступу з відомостями про зони, і, отже, kube-proxy не фільтрує точки доступу за зоною.

4. **Одна чи декілька точок доступу не має підказки щодо зони:** Коли це трапляється, kube-proxy припускає, що відбувається перехід до або з Topology Aware Hints. Фільтрація точок доступу для Serviceʼу в цьому стані була б небезпечною, тому kube-proxy використовує всі точки доступу.

5. **Зона не представлена в підказках:** Якщо kube-proxy не може знайти принаймні одну точку доступу із підказкою для зони, в якій він працює, він переходить до використання точок доступу з усіх зон. Це ймовірніше станеться, коли ви додаєте нову зону до вашого наявного кластера.

## Обмеження {#constraints}

* Topology Aware Hints не використовуються, коли `internalTrafficPolicy` встановлено в `Local` для Service. Можливе використання обох функцій у тому ж кластері для різних Serviceʼів, просто не на одному і тому ж Service.

* Цей підхід не дуже підходить для Serviceʼів, від яких значна частина трафіку походить від підмножини зон. Замість цього передбачається, що вхідний трафік буде приблизно пропорційним місткості Вузлів у кожній зоні.

* Контролер EndpointSlice ігнорує непридатні вузли під час розрахунку пропорцій для кожної зони. Це може мати неочікувані наслідки, якщо велика частина вузлів непридатна.

* Контролер EndpointSlice ігнорує вузли з мітками `node-role.kubernetes.io/control-plane` або `node-role.kubernetes.io/master`. Це може бути проблематичним, якщо також на цих вузлах працюють робочі навантаження.

* Контролер EndpointSlice не враховує <a class='glossary-tooltip' title='Основний обʼєкт, що складається з трьох обовʼязкових властивостей: key, value, та effect. Toleration (дозвіл) дозволяє розміщення Podʼів на вузлах чи групах вузлів, які мають відповідні taint.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/scheduling-eviction/taint-and-toleration/' target='_blank' aria-label='tolerations'>tolerations</a> при розгортанні або розрахунку пропорцій для кожної зони. Якщо Podʼи, які підтримують Service, обмежені у підмножині вузлів у кластері, це не буде враховано.

* Це може не добре працювати з автомасштабуванням. Наприклад, якщо багато трафіку походить з однієї зони, тільки точки доступу, виділені для цієї зони, будуть обробляти цей трафік. Це може призвести до того, що <a class='glossary-tooltip' title='Обʼєкт, який автоматично масштабує кількість реплік Podʼа на основі вказаних параметрів використання цільових ресурсів або власних метрик.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/workloads/autoscaling/horizontal-pod-autoscale/' target='_blank' aria-label='Horizontal Pod Autoscaler'>Horizontal Pod Autoscaler</a> або не помічає такої події, або нові Podʼи стартують в іншій зоні.

## Власні евристики {#custom-heuristics}

Kubernetes може розгортатися різними способами, і для кожного випадку не існує єдиної евристики, яка працюватиме для виділення точок доступу в зони. Одна з ключових цілей цього функціоналу — надання можливості розробки власних евристик, якщо вбудована евристика не працює для вашого випадку використання. Перші кроки для увімкнення власних евристик були включені у випуск 1.27. Це обмежена реалізація, яка може ще не враховувати деякі актуальні та вірогідні ситуації.

## Що далі

* Скористайтесь довідником [Підключення застосунків за допомогою Service](/docs/tutorials/services/connect-applications-service/).
* Дізнайтесь про поле [trafficDistribution](/docs/concepts/services-networking/service/#traffic-distribution), що тісно повʼязане з анотацією `service.kubernetes.io/topology-mode` та надає гнучкість управління маршрутизацією трафіку в Kubernetes.
