Другое

Как устранить ошибку ingress аддона в Minikube/Kubernetes

Решаем проблему таймаута и отсутствия секрета 'ingress-nginx-admission' при установке ingress аддона в Minikube. Полное руководство с пошаговыми решениями для VMware, Proxmox и VirtualBox.

Как устранить ошибку при установке ingress аддона (webhook) в Minikube/Kubernetes?

На виртуальной машине (пробовал ВМ на VMware, Proxmox VE и VirtualBox) при попытке включить ingress аддон в запущенном minikube (пробовал версии 1.30 и latest) возникает ошибка на этапе установки:

  - Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.6.2
  - Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.6.2
  - Using image registry.k8s.io/ingress-nginx/controller:v1.13.2
* Verifying ingress addon...

После таймаута появляется ошибка:

x exiting due to mk_addon_enable: enable failed: run callbacks: running callbacks: [waiting for app.kubernetes.io/name=ingress-nginx pods: context deadline exceeded]

или

X Exiting due to MK_ADDON_ENABLE: enable failed: run callbacks: running callbacks: [waiting for app.kubernetes.io/name=ingress-nginx pods: timed out waiting for the condition]

В логах обнаружена ошибка отсутствия секрета:

Warning  FailedMount  2m (x10 over 6m9s)  kubelet            MountVolume.SetUp failed for volume "webhook-cert" : secret "ingress-nginx-admission" not found

Попытки создать секрет и сгенерировать сертификаты вручную не помогли решить проблему с включением ingress аддона.

Ошибка при установке ingress аддона в Minikube, связанная с отсутствием секрета “ingress-nginx-admission” и таймаутом вебхука, обычно возникает из-за проблем с инициализацией сертификатов или сетевыми настройками в виртуальных средах. Для решения этой проблемы необходимо выполнить базовые шаги по перезапуску Minikube, очистке неисправных вебхуков и, в некоторых случаях, ручной корректировке конфигурации ValidatingWebhookConfiguration.

Содержание

Основные причины проблемы

Проблема с установкой ingress аддона в Minikube возникает по нескольким основным причинам:

  1. Неправильная инициализация секрета: Ошибка secret "ingress-nginx-admission" not found указывает на то, что необходимый секрет для вебхука не был создан во время установки.

  2. Сетевые ограничения в виртуальных средах: Виртуальные машины на VMware, Proxmox VE и VirtualBox могут иметь ограничения на сетевое взаимодействие между компонентами Kubernetes, что приводит к таймаутам.

  3. Конфликт версий: Как отмечается в сообщении на Stack Overflow, downgrading до minikube v1.23.2 может решить проблему, что указывает на ошибки в более новых версиях.

  4. Проблемы с загрузкой образов: В некоторых случаях образы ingress-nginx не загружаются корректно, что приводит к невозможности запуска подов.

Пошаговые решения

Метод 1: Полная перезапуск и очистка

  1. Удалите текущий кластер Minikube:
bash
minikube delete
  1. Запустите Minikube заново:
bash
minikube start --driver=<ваш_драйвер>  # virtualbox, vmware, proxmox
  1. Включите ingress аддон:
bash
minikube addons enable ingress

Этот метод помогает в большинстве случаев, так как он полностью очищает состояние и заново инициализирует все компоненты.

Метод 2: Удаление конфигурации вебхука

Если предыдущий метод не сработал, удалите конфигурацию вебхука вручную:

  1. Проверьте наличие ValidatingWebhookConfiguration:
bash
kubectl get ValidatingWebhookConfiguration ingress-nginx-admission
  1. Удалите конфигурацию вебхука:
bash
kubectl delete ValidatingWebhookConfiguration ingress-nginx-admission

Как упоминается в решении на Stack Overflow, этот шаг часто решает проблему.

Метод 3: Ручная установка ingress-nginx

Если встроенный аддон не работает, установите ingress-nginx вручную:

  1. Добавьте репозиторий Helm:
bash
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
  1. Установите ingress-nginx через Helm:
bash
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx --create-namespace

Дополнительные методы

Корректировка политики вебхука

  1. Проверьте текущую конфигурацию:
bash
kubectl get validatingwebhookconfigurations ingress-nginx-admission -o yaml
  1. Измените failurePolicy на Ignore (временно для обхода проблемы):
bash
kubectl edit ValidatingWebhookConfiguration ingress-nginx-admission

Замените failurePolicy: Fail на failurePolicy: Ignore в секции вебхука.

Проверка и исправление секрета

  1. Проверьте наличие секрета:
bash
kubectl get secret -n kube-system ingress-nginx-admission
  1. Если секрет отсутствует, создайте его вручную:
bash
kubectl create secret generic ingress-nginx-admission \
  --from-file=<путь_к_сертификату> \
  -n kube-system

Настройка DNS и сети для виртуальных сред

Для VMware, Proxmox VE и VirtualBox:

  1. Проверьте сетевые настройки виртуальной машины
  2. Убедитесь, что DNS правильно настроен в гостевой ОС
  3. Добавьте правила портов в файрволе виртуальной машины для портов 80 и 443

Предотвращение проблем в будущем

  1. Используйте стабильные версии Minikube: Как показывают исследования, более новые версии могут иметь проблемы. Версия 1.23.2 считается стабильной.

  2. Регулярно обновляйте ingress-nginx: Следите за обновлениями и вовремя обновляйте компоненты:

bash
minikube addons enable ingress --force
  1. Мониторьте ресурсы: Убедитесь, что в виртуальной машине достаточно ресурсов:
bash
minikube start --cpus=4 --memory='8192m'
  1. Используйте правильные драйверы: Для каждой виртуальной платформы используйте соответствующий драйвер Minikube.

Диагностика и проверка

Проверка состояния ingress

После решения проблемы убедитесь, что ingress работает корректно:

bash
# Проверьте статус подов
kubectl get pods -n kube-system | grep ingress

# Проверьте ресурсы ingress
kubectl get ingress,svc,configmap -n kube-system | grep ingress

# Проверьте логи подов
kubectl logs -n kube-system -l app.kubernetes.io/name=ingress-nginx

Тестирование работы ingress

Создайте тестовый ingress для проверки:

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
  - host: test.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kube-dns
            port:
              number: 53

Примените и проверьте доступность через minikube tunnel.

Источники

  1. kubernetes - Nginx Ingress Controller - Failed Calling Webhook - Stack Overflow
  2. ingress can’t start because secret “ingress-nginx-admission” not found · Issue #8332 · kubernetes/minikube
  3. Minikube addons enable ingress - timed out · Issue #11532 · kubernetes/minikube
  4. kubernetes - Why can’t I enable ingress in minikube? - Stack Overflow
  5. Fixing ImagePullBackOff and ContainerCreating Errors in Ingress-NGINX on Minikube | Medium
  6. Internal error occurred: failed calling webhook “validate.nginx.ingress.kubernetes.io” · Issue #5401 · kubernetes/ingress-nginx

Заключение

Основными способами решения проблемы с ingress аддоном в Minikube являются:

  1. Полная перезапуск кластера - наиболее эффективный метод в большинстве случаев
  2. Удаление конфигурации вебхука - помогает при конкретной ошибке таймаута
  3. Ручная установка через Helm - обходной путь при неисправности встроенного аддона
  4. Корректировка сетевых настроек - особенно важно для виртуальных сред

Для предотвращения подобных проблем в будущем рекомендуется использовать стабильные версии Minikube, обеспечивать достаточные ресурсы виртуальной машины и регулярно обновлять компоненты. Если проблема persists, стоит обратиться к официальной документации и сообществу Kubernetes для получения актуальных решений.

Авторы
Проверено модерацией
Модерация