[Документация Yandex Cloud](../../../index.md) > [Yandex Managed Service for Kubernetes](../../index.md) > [Пошаговые инструкции](../index.md) > Настройка маскарадинга в кластерах с несколькими диапазонами IP-адресов подов

# Настройка маскарадинга в кластерах с несколькими диапазонами IP-адресов подов

Создайте кластер с несколькими диапазонами IP-адресов подов или расширьте адресное пространство существующего кластера, затем проверьте настройки маскарадинга.

Объект `ConfigMap` с именем `ip-masq-agent` в пространстве имен `kube-system` содержит настройки [маскарадинга IP-адресов подов](../../concepts/index.md#pod-ip-masquerade). В параметре `data.config.nonMasqueradeCIDRs` задаются диапазоны назначения, при обращении к которым IP-адрес пода не заменяется IP-адресом узла.

В [кластерах с несколькими диапазонами IP-адресов подов](../../concepts/cluster-multi-cidr.md) сохраняйте в этом списке все диапазоны подов кластера.

## Перед началом работы {#before-you-begin}

Диапазоны подов можно задать при [создании кластера](../kubernetes-cluster/kubernetes-cluster-create.md#kubernetes-cluster-create) или добавить позже при [изменении кластера](../kubernetes-cluster/kubernetes-cluster-update.md#update-cluster).

Перед добавлением диапазона в существующий кластер [посмотрите и сохраните настройки маскарадинга](#get-config). Если используете собственные диапазоны или другие настройки, [включите ручное управление](#manual-management), чтобы сохранить их.

## Синхронизируйте маскарадинг после добавления диапазона {#sync-cidr}

1. [Проверьте режим управления](#get-config) ConfigMap `ip-masq-agent`.
1. В зависимости от режима выполните следующие действия:
   * `enforced` — дождитесь следующего обновления конфигурации и убедитесь, что новый диапазон появился в `nonMasqueradeCIDRs`. Не редактируйте `data.config` вручную: сервис перезапишет изменения.
   * `disabled` — выполните `kubectl -n kube-system edit configmap ip-masq-agent` и добавьте новый диапазон в `data.config.nonMasqueradeCIDRs`. Сохраните прежние диапазоны и остальные настройки. Пример конфигурации приведен в разделе [ручного управления](#manual-management).
   * Аннотации нет — дождитесь автоматического выбора режима и прочитайте ConfigMap повторно. Если нужно сохранить пользовательские настройки, явно задайте `disabled` до их редактирования.
1. [Проверьте результат](#verify).

## Режимы управления {#management-modes}

Режим задается аннотацией `addon-cm-controller.mk8s.yc.io/mode`:

#|
|| Значение | Поведение ||
|| `enforced` | Сервис поддерживает весь `data.config` в соответствии с системным шаблоном. Новые диапазоны подов добавляются автоматически. Пользовательские значения перезаписываются. ||
|| `disabled` | Сервис не изменяет ConfigMap. Пользователь самостоятельно поддерживает системные и собственные диапазоны. ||
|| Аннотации нет | Сервис определяет режим по текущему содержимому и устанавливает `enforced` или `disabled`. ||
|| Другое значение | Сервис не изменяет ConfigMap и создает событие с причиной `InvalidMode`. ||
|#

Проверка конфигурации выполняется периодически, по умолчанию раз в 60 секунд. Изменение режима не требует перезапуска кластера или узлов.

## Посмотрите текущие настройки {#get-config}

Перед началом работы [установите kubectl](https://kubernetes.io/ru/docs/tasks/tools/install-kubectl/) и [настройте его на работу с созданным кластером Managed Service for Kubernetes](../connect/index.md#kubectl-connect).

Чтобы посмотреть режим и содержимое ConfigMap, выполните команду:

```bash
kubectl -n kube-system get configmap ip-masq-agent -o yaml
```

Перед изменением сохраните текущую конфигурацию:

```bash
kubectl -n kube-system get configmap ip-masq-agent -o yaml > ip-masq-agent-backup.yaml
```

## Включите автоматическое управление {#automatic-management}

Используйте режим `enforced`, если вам достаточно системных диапазонов подов и стандартных настроек `ip-masq-agent`.

{% note warning %}

При включении `enforced` сервис перезапишет весь `data.config`. Пользовательские диапазоны, значения `resyncInterval`, `masqLinkLocal` и другие настройки не сохранятся. Перед изменением сохраните конфигурацию.

{% endnote %}

Чтобы передать управление сервису, выполните команду:

```bash
kubectl -n kube-system annotate configmap ip-masq-agent \
  addon-cm-controller.mk8s.yc.io/mode=enforced --overwrite
```

При добавлении нового диапазона подов сервис автоматически добавит его в `nonMasqueradeCIDRs`.

## Включите ручное управление {#manual-management}

Если вы добавляете собственные диапазоны или меняете другие параметры `ip-masq-agent`:

1. Установите режим `disabled`:

   ```bash
   kubectl -n kube-system annotate configmap ip-masq-agent \
     addon-cm-controller.mk8s.yc.io/mode=disabled --overwrite
   ```

1. Откройте ConfigMap для редактирования:

   ```bash
   kubectl -n kube-system edit configmap ip-masq-agent
   ```

1. В `nonMasqueradeCIDRs` сохраните все диапазоны подов кластера и добавьте пользовательские диапазоны назначения, для которых маскарадинг не требуется. Например:

   ```yaml
   data:
     config: |+
       nonMasqueradeCIDRs:
         - 10.112.0.0/16
         - 10.113.0.0/16
         - 10.200.0.0/16
       masqLinkLocal: false
       resyncInterval: 60s
   ```

   В примере первые два диапазона относятся к подам, третий — к пользовательской сети. Замените их своими значениями. Сохраните остальные настройки, необходимые для вашей сети.

{% note warning %}

В режиме `disabled` после каждого добавления диапазона подов обновляйте `nonMasqueradeCIDRs` самостоятельно. Сервис не объединяет системные и пользовательские настройки.

{% endnote %}

## Автоматический выбор режима {#automatic-selection}

При первом запуске контроллер проверяет ConfigMap без аннотации. Если в ней перечислены только ожидаемые системные диапазоны, назначается режим `enforced`. Конфигурация с дополнительными, отсутствующими или измененными диапазонами получает режим `disabled` и сохраняется без изменений.

При сравнении учитывается порядок диапазонов. Системные диапазоны IPv4 в прежнем формате, занимавшем половину диапазона, могут быть распознаны и заменены полными. Смешанный список полных и половинных диапазонов классифицируется как пользовательская конфигурация.

{% note warning %}

Если вы изменяли только `resyncInterval`, `masqLinkLocal` или другие параметры, не меняя системный список CIDR, контроллер может выбрать `enforced` и перезаписать настройки. Чтобы сохранить их, заранее установите `disabled`.

{% endnote %}

Удаление аннотации запускает автоматический выбор повторно. Чтобы однозначно выбрать режим, задавайте `enforced` или `disabled` явно.

## Проверьте результат {#verify}

1. После создания новых узлов посмотрите назначенные им блоки адресов:

   ```bash
   kubectl get nodes -o custom-columns=NAME:.metadata.name,POD_CIDR:.spec.podCIDR,POD_CIDRS:.spec.podCIDRs
   ```

   Новый диапазон может не использоваться, пока в прежнем остаются свободные блоки. Адреса существующих узлов и подов при добавлении диапазона не меняются.

1. Дождитесь следующей проверки конфигурации и посмотрите настройки:

   ```bash
   kubectl -n kube-system get configmap ip-masq-agent -o yaml
   ```

1. Проверьте события ConfigMap:

   ```bash
   kubectl -n kube-system get events \
     --field-selector involvedObject.kind=ConfigMap,involvedObject.name=ip-masq-agent \
     --sort-by=.lastTimestamp
   ```

   Если появилось событие `InvalidMode`, исправьте значение аннотации.

1. Чтобы проверить правила маскарадинга на узле, [подключитесь к нему по SSH](../node-connect-ssh.md) и выполните команду:

   ```bash
   sudo iptables -t nat -L IP-MASQ -v -n
   ```

Не удаляйте ConfigMap для сброса настроек: сервис создаст ее заново по системному шаблону. Для изменения поведения используйте аннотацию режима.

#### Полезные ссылки {#see-also}

* [Кластеры с несколькими диапазонами IP-адресов подов](../../concepts/cluster-multi-cidr.md)
* [Сеть в Managed Service for Kubernetes](../../concepts/network.md)