Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

Отключение IPv6 на узлах Nova

На узлах кластера Nova IPv6 можно отключить двумя способами. Выберите вариант по таблице ниже.

Вариант Что происходит Когда применить Ограничение

Отключение через GRUB

Стек IPv6 полностью отключается на уровне ядра, в том числе IPv6 на loopback-интерфейсе

Только на новых узлах в UPI-режиме перед установкой Nova 7.6.0 и новее

Могут не работать приложения, которым нужен IPv6, в том числе адрес ::1 в контейнере

Отключение через sysctl с сохранением IPv6 на lo

IPv6 отключается на внешних интерфейсах узла, на loopback-интерфейсе lo сохраняются адрес и маршрут ::1

На уже развёрнутых кластерах, а также для более ранних версий Nova

Приложения не получают маршрутизируемый IPv6. Сохраняется только локальная совместимость с localhost и ::1

Варианты нельзя комбинировать. Если узел загружен с параметром ядра ipv6.disable=1, включить IPv6 на lo через sysctl невозможно. Чтобы перейти от полного отключения IPv6 к варианту с сохранением ::1, сначала удалите параметр из конфигурации GRUB, пересоздайте конфигурацию GRUB, перезагрузите узел и только после этого примените sysctl.

1. Сценарий 1. Полное отключение IPv6 через GRUB

Этот вариант предназначен только для новых узлов в UPI-режиме перед установкой Nova версии 7.6.0 и выше.

На каждом узле выполните действия ниже.

  1. Добавьте параметр ядра ipv6.disable=1 для всех загрузочных записей.

    Astra Linux и Debian
    1. Откройте файл /etc/default/grub и добавьте параметр ipv6.disable=1 в переменную GRUB_CMDLINE_LINUX.

      Если в переменной уже указаны другие параметры ядра, сохраните их и добавьте ipv6.disable=1 через пробел.

    GRUB_CMDLINE_LINUX="ipv6.disable=1"
    1. Обновите конфигурацию GRUB:

    sudo update-grub
    RHEL-подобные ОС

    Добавьте параметр ipv6.disable=1 во все загрузочные записи:

    sudo grubby --update-kernel=ALL --args="ipv6.disable=1"
  2. Перезагрузите узел:

    sudo reboot
  3. После перезагрузки проверьте, что параметр присутствует в командной строке ядра:

    cat /proc/cmdline

    В выводе должна быть строка с параметром ipv6.disable=1.

    Пример вывода:
    [root@control-plane1 ~]# cat /proc/cmdline
    kvm.enable_virt_at_load=0 BOOT_IMAGE=(hd0,gpt2)/vmlinuz-4.18.0-425.3.1.el8.x86_64 root=UUID=884de598-4542-4c97-91e0-5b27f5e58805 ro resume=UUID=0169ad66-5fd4-4867-92b9-7dec9271be3c net.ifnames=0 rhgb quiet ipv6.disable=1

После настройки всех узлов можно переходить к установке Nova 7.6.0 и новее.

2. Сценарий 2. Отключение IPv6 через sysctl с сохранением IPv6 на loopback-интерфейсе

Этот вариант используют на уже развёрнутых кластерах и для более ранних версий Nova. IPv6 отключается на внешних интерфейсах узла, на loopback-интерфейсе lo сохраняются адрес и маршрут ::1.

2.1. Почему нельзя отключать IPv6 на lo

Kubernetes создаёт для Pod файл /etc/hosts, который обычно содержит записи:

127.0.0.1  localhost
::1        localhost ip6-localhost ip6-loopback

Если задать net.ipv6.conf.lo.disable_ipv6=1, IPv6-адреса и маршруты на loopback удаляются. Процесс, который слушает только адрес ::1, не сможет привязать сокет.

[root@master1 ~]# ip -6 route get ::1
RTNETLINK answers: Network is unreachable
[root@master1 ~]# curl -k --noproxy '*' --connect-timeout 3 https://[::1]:6443/readyz
curl: (7) Failed to connect to ::1 port 6443 after 0 ms: Couldn't connect to server

При создании или пересоздании пользовательских нагрузок Kubernetes не выполняет admission-проверки через API-сервер по адресу ::1. В Nova новые Pod не создаются, в событиях ресурсов могут появиться ошибки:

pods "harbor-registry-b4d9dc6-" is forbidden: Get "https://[::1]:6443/api/v1/namespaces/harbor/limitranges": dial tcp [::1]:6443: connect: cannot assign requested address

pods "flask-test-app-64f8899cdb-" is forbidden: Get "https://[::1]:6443/api/v1/namespaces/flask/limitranges": dial tcp [::1]:6443: connect: cannot assign requested address

2.2. Настройка

Выполняйте настройку последовательно, по одному узлу.

Перед применением sysctl убедитесь, что узел не загружен с параметром ipv6.disable=1. Если параметр присутствует, сначала удалите его из конфигурации GRUB и перезагрузите узел.

  1. Создайте файл /etc/sysctl.d/99-nova-disable-ipv6.conf:

    sudo tee /etc/sysctl.d/99-nova-disable-ipv6.conf <<'EOF'
    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1
    net.ipv6.conf.lo.disable_ipv6 = 0
    EOF
  2. Примените конфигурацию:

    sudo sysctl --system
  3. Проверьте значения параметров sysctl, адрес и маршрут loopback-интерфейса, наличие IPv6-адресов на всех интерфейсах:

    sysctl net.ipv6.conf.all.disable_ipv6
    sysctl net.ipv6.conf.default.disable_ipv6
    sysctl net.ipv6.conf.lo.disable_ipv6
    ip -6 addr show dev lo
    ip -6 route get ::1
    ip -o -6 addr show
    Ожидаемые результаты проверки параметров sysctl
    Проверка Вывод

    all.disable_ipv6

    1

    default.disable_ipv6

    1

    lo.disable_ipv6

    0

    Ожидаемые результаты проверки интерфейсов
    Проверка Вывод Ожидаемый результат

    Адрес на lo

    В выводе ip -6 addr show dev lo есть строка inet6 ::1/128 scope host

    Присутствует адрес ::1/128

    Маршрут к ::1

    В выводе ip -6 route get ::1 маршрут указывает на интерфейс lo

    Маршрут проходит через интерфейс lo

    Внешние и управляющие интерфейсы

    В выводе ip -o -6 addr show IPv6-адрес есть только у интерфейса lo

    На внешних и управляющих интерфейсах IPv6-адреса отсутствуют

2.3. Перезапуск kubelet

После применения параметров перезапустите kubelet на текущем узле:

sudo systemctl restart kubelet
sudo systemctl status kubelet

2.4. Проверка узла в production-кластере

Для production-кластера дождитесь восстановления узла. Узел должен перейти в состояние Ready, системные Pod — восстановить штатное состояние.

kubectl get node <node-name>
kubectl get pods -A -o wide

После проверки повторите процедуру последовательно на остальных узлах кластера.