Ошибки при запуске пода ingress-nginx-controller

После переноса образов контейнеров на отдельный диск и восстановления работоспособности worker-узла может не запускаться под ingress-nginx-controller.

Может возникнуть ошибка, при которой сбросились разрешения (capabilities) бинарных файлов после переноса содержимого containerd. Работа по исправлению ошибки делится на следующие этапы:

Подтверждение ошибки с разрешениями бинарных файлов

Чтобы подтвердить ошибку:

  1. Подключитесь к кластеру.

  2. Проверьте логи пода ingress-nginx-controller. Для этого:

    1. Получите полное название пода с информацией по worker-узлам, выполнив команду:

      kubectl get pods -n ingress-nginx -o wide

      Отобразится список всех подов ingress-nginx-controller.

      Пример вывода списка всех подов
      NAME                             READY   STATUS    RESTARTS         AGE   IP             NODE
      ingress-nginx-controller-j25z6   1/1     Running   9 (5d15h ago)    9d    00.000.1.000   siem-testing-w03
      ingress-nginx-controller-ppp6c   1/1     Pending   15 (5d15h ago)   41d   00.000.2.000   siem-testing-w02
      ingress-nginx-controller-wltdd   1/1     Running   7 (5d15h ago)    41d   00.000.3.000   siem-testing-w01
    2. Скопируйте название пода на worker-узле, с которым производились работы.

    3. Откройте логи пода ingress-nginx-controller, выполнив команду:

      kubectl logs -n ingress-nginx <pod_name>

      Здесь:

      • <pod_name> — название пода, полученное на предыдущем шаге.

  3. Найдите в логах следующую запись:

    port 80 is already in use. Please check the flag --http-port
    Если вы не нашли в логах упомянутую выше запись, то ошибка запуска пода ingress-nginx-controller возникла не из-за сброса разрешения бинарных файлов. Для решения проблемы обратитесь в службу поддержки по адресу support@rvision.ru.
  4. Проверьте разрешения бинарных файлов, выполнив команду:

    getcap $(find /var/lib/containerd/ -name nginx-ingress-controller -type f)

    Если в разрешении ingress-nginx-controller отображается значение cap_net_bind_service+ep, то он работает корректно. Если отображается любое другое значение, то у пода ingress-nginx-controller сбросились разрешения бинарных файлов.

Исправление ошибки разрешений бинарных файлов пода ingress-nginx-controller

Чтобы исправить ошибку:

  1. Подключитесь к кластеру.

  2. Установите метку marked-for-drain для worker-узла, выполнив команду:

    kubectl label nodes <node_name> marked-for-drain=true

    Здесь:

    • <node_name> — название выбранного worker-узла.

    Предварительно необходимо скорректировать конфигурации контроллеров DaemonSet. Подробности приведены в разделе Настройка отдельного диска под образы контейнеров.

    Объединенная файловая система (OverlayFS) запущенного пода ingress-nginx-controller примонтирована к файловой системе worker-узла. Это блокирует возможность удаления и перезаписывания слоев образа.

    Установка метки marked-for-drain запрещает планировать на worker-узел поды контроллеров DaemonSet. Тогда Docker-образ ingress-nginx-controller не будет задействован ни одним запущенным контейнером на выбранном worker-узле. Блокировка замены и удаления образа будет снята.

  3. Удалите под ingress-nginx-controller, выполнив команду:

    kubectl delete pod <pod_name> -n ingress-nginx --field-selector spec.nodeName=<node_name>

    Здесь:

    • <pod_name> — название пода, полученное на этапе подтверждения ошибки.

  4. Подключитесь к выбранному worker-узлу.

  5. Удалите образ пода ingress-nginx-controller, выполнив команду:

    crictl rmi harbor.rvision.pro/third_party/ingress-nginx/controller:1.11.3-distroless-20250428
  6. Проверьте, что образ корректно удалился и не отображается в общем списке, с помощью команды:

    crictl images | grep ingress
  7. Подключитесь к серверу, на котором производилась установка системы.

  8. Распространите образ пода ingress-nginx-controller по всему кластеру, выполнив команду:

    /opt/r-vision/common/bin/evoctl instance upload --archive ingress-nginx.img
  9. Проверьте наличие нового образа, выполнив команду:

    crictl images | grep ingress
  10. Проверьте корректность разрешений бинарных файлов, выполнив команду:

    getcap $(find /var/lib/containerd/ -name nginx-ingress-controller -type f)
  11. Снимите метку marked-for-drain с выбранного worker-узла, выполнив команду:

    kubectl label nodes <node_name> marked-for-drain-

    Здесь:

    • <node_name> — название выбранного worker-узла.

  12. Дождитесь запуска пода ingress-nginx-controller и проверьте его статус, выполнив команду:

    kubectl get pods -n ingress-nginx --field-selector spec.nodeName=<node_name>

    Здесь:

    • <node_name> — название выбранного worker-узла.

Была ли полезна эта страница?

Обратная связь