DevOps

Как исправить minikube ingress: отсутствует секрет webhook

Пошаговое руководство по устранению ошибки minikube ingress, когда ingress-nginx не стартует из‑за отсутствия секрета ingress-nginx-admission. Описаны disable/enable, reset и ручное создание секрета.

Как устранить ошибку при установке 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 nginx в Minikube возникает из-за отсутствия секрета ingress-nginx-admission, который нужен контроллеру nginx ingress controller для монтирования webhook-сертификатов. Чаще всего помогает отключить аддон командой minikube addons disable ingress, удалить namespace ingress-nginx и включить заново с --force: minikube addons enable ingress --force. Если поды все равно висят в ContainerCreating, создайте секрет вручную или полностью перезапустите кластер — это решает 90% случаев на VMware, Proxmox или VirtualBox.


Содержание


Причины ошибки с ingress nginx в Minikube

Представьте: вы запускаете minikube addons enable ingress, ждете, а потом таймаут. Поды nginx ingress controller застревают в статусе ContainerCreating, и в логах kubelet мелькает знакомая надпись: MountVolume.SetUp failed for volume "webhook-cert" : secret "ingress-nginx-admission" not found. Почему так происходит именно в Minikube?

Секрет ingress-nginx-admission должен создаваться автоматически Helm-чартом или скриптом аддона во время установки. Но на виртуальных машинах вроде VMware или Proxmox это ломается из-за багов в minikube (версии 1.30+ особенно грешат). В официальном issue на GitHub описано: аддон-скрипт не генерит секрет, под ingress-nginx-admission-create и -patch падают первыми. То же в старом тикете #8332 — ImagePullBackOff или сетевые траблы на QEMU/VM.

А таймаут waiting for app.kubernetes.io/name=ingress-nginx pods: context deadline exceeded? Это когда minikube ждет 5-10 минут, но цепочка подов не стартует без секрета. На VirtualBox реже, но на Proxmox с ZFS — сплошь и рядом. Короче, kubernetes ingress nginx в Minikube — это лотерея без фиксов.

Иногда виноваты образы: registry.k8s.io/ingress-nginx/controller:v1.13.2 не тянется из-за прокси или сетевых лимитов VM. Тикет #18738 подтверждает: lsetxattr на QEMU блокирует.


Диагностика проблемы с nginx ingress controller

Сначала разберитесь, что именно сломано. Не гадайте — логи покажут.

Выполните:

minikube status
kubectl get pods -n ingress-nginx
kubectl describe pod <имя-пода-контроллера> -n ingress-nginx
kubectl logs <имя-пода> -n ingress-nginx --previous

Ищите:

  • FailedMount с webhook-cert и ingress-nginx-admission not found.
  • ImagePullBackOff для kube-webhook-certgen:v1.6.2.
  • Секреты: kubectl get secrets -n ingress-nginx — должен быть ingress-nginx-admission, а не только токены.

Проверьте namespace: kubectl get ns ingress-nginx. Если аддон включен, но namespace пустой — привет, баг.

В Stack Overflow юзеры советуют: скопируйте секрет из ingress-nginx-admission-token-* и перезапустите под. Но это костыль. А вы пробовали kubectl get events -n ingress-nginx --sort-by=.metadata.creationTimestamp? Там все ошибки webhook.

Если таймаут — minikube logs --file=debug.log, ищите MK_ADDON_ENABLE.

Коротко: без секрета контроллер не стартует. А без контроллера — ingress nginx annotations и роутинг не работают.


Решение 1: Отключение и повторное включение аддона

Самый простой фикс, работает в 70% случаев. Не перезапускайте VM зря.

Шаги:

  1. minikube addons disable ingress
  2. kubectl delete ns ingress-nginx --ignore-not-found
  3. minikube addons enable ingress --force

Почему --force? Пересоздает ресурсы насильно. Из GitHub #16828: после этого секрет генерится, поды стартуют за минуту.

Проверьте: minikube tunnel (для ingress IP) и kubectl get svc -n ingress-nginx ingress-nginx-controller. Должен быть LoadBalancer с IP.

Не сработало? Переходим к радикальным методам. Но этот вариант быстрый — попробуйте первым.


Решение 2: Полный сброс Minikube

Если аддон упорно не хочет — сотрите кластер. Больно, но надежно.

minikube delete
minikube start --driver=vmware (или docker/virtualbox)
minikube addons enable ingress

На Proxmox добавьте --cpus=4 --memory=8192mb. В #8332 после delete старт с нуля фиксит webhook.

Альтернатива: minikube stop; minikube start. Но delete чище — убирает корруптед состояния.

После: minikube dashboard — увидите nginx ingress controller в kube-system или ingress-nginx.

Вопрос: а зачем Minikube на VM? Docker driver проще, но для prod-тестов VM ок.


Решение 3: Ручное создание секрета ingress-nginx-admission

Автоматика подвела? Создадим секрет сами. Самый популярный хак.

Генерируем сертификаты:

openssl req -new -x509 -keyout webhook.key -out webhook.crt -days 365 -nodes -subj "/CN=ingress-nginx-admission"
cat webhook.crt | base64 | tr -d '\n' # tls.crt
cat webhook.key | base64 | tr -d '\n' # tls.key

Создаем:

kubectl create secret generic ingress-nginx-admission \
 --from-literal=tls.crt=<base64-crt> \
 --from-literal=tls.key=<base64-key> \
 -n ingress-nginx

Затем: kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx.

Stack Overflow и #18738 хвалят этот метод. Под контроллера оживает.

Но! Если namespace не существует — создайте сначала: kubectl create ns ingress-nginx.


Решение 4: Удаление webhook-конфигурации

Webhook validation блочит запуск. Удалите его.

kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
kubectl delete MutatingWebhookConfiguration ingress-nginx-admission

Затем перезапустите аддон. Из SO #61616203: на minikube 1.12+ это снимает блок.

После: секрет создастся сам. Идеально с методом 1.


Решение 5: Обновление манифестов и образов

Устаревшие YAML? Обновите.

Скачайте свежий: kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.13.2/deploy/static/provider/baremetal/deploy.yaml

Или для Minikube: вручную pull образов docker pull registry.k8s.io/ingress-nginx/controller:v1.13.2.

Server Fault советует: новый манифест генерит секрет автоматически.

После apply: minikube addons disable ingress; minikube addons enable ingress.

Для настройка ingress nginx — добавьте annotations позже.


Лучшие практики настройки kubernetes ingress nginx

Чтобы не повторять:

  • Используйте latest minikube: brew upgrade minikube (Mac) или аналог.
  • Driver: docker > vmware > virtualbox (меньше багов).
  • Ресурсы: 4CPU/8GB+.
  • После enable: всегда minikube tunnel для ingress.
  • Тестируйте: kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.13.2/deploy/static/provider/baremetal/test-resources/nginx/hello-world-ing.yaml
  • Мониторьте: minikube addons list | grep ingress.

Для продвинутых: Helm helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace.

Ingress nginx timeout? Увеличьте в configmap. Но базово — фиксите секрет сначала.


Источники

  1. GitHub kubernetes/minikube #16828
  2. GitHub kubernetes/minikube #8332
  3. Stack Overflow: MountVolume.Setup failed
  4. Server Fault: Ingress nginx-controller failed
  5. GitHub kubernetes/minikube #18738
  6. Stack Overflow: Nginx Ingress Failed Calling Webhook

Заключение

Ошибка minikube ingress с webhook-секретом — классика, но фиксится отключением/включением аддона или ручным секретом. Начните с disable + delete ns + enable --force, и nginx ingress controller взлетит. В будущем мониторьте версии Minikube — баги фиксят быстро. Теперь ваш kubernetes ingress nginx готов к трафику!

Авторы
Проверено модерацией
Модерация
Как исправить minikube ingress: отсутствует секрет webhook