Как исправить 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
- Диагностика проблемы с nginx ingress controller
- Решение 1: Отключение и повторное включение аддона
- Решение 2: Полный сброс Minikube
- Решение 3: Ручное создание секрета ingress-nginx-admission
- Решение 4: Удаление webhook-конфигурации
- Решение 5: Обновление манифестов и образов
- Лучшие практики настройки kubernetes ingress nginx
- Источники
- Заключение
Причины ошибки с 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 зря.
Шаги:
minikube addons disable ingresskubectl delete ns ingress-nginx --ignore-not-foundminikube 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. Но базово — фиксите секрет сначала.
Источники
- GitHub kubernetes/minikube #16828
- GitHub kubernetes/minikube #8332
- Stack Overflow: MountVolume.Setup failed
- Server Fault: Ingress nginx-controller failed
- GitHub kubernetes/minikube #18738
- Stack Overflow: Nginx Ingress Failed Calling Webhook
Заключение
Ошибка minikube ingress с webhook-секретом — классика, но фиксится отключением/включением аддона или ручным секретом. Начните с disable + delete ns + enable --force, и nginx ingress controller взлетит. В будущем мониторьте версии Minikube — баги фиксят быстро. Теперь ваш kubernetes ingress nginx готов к трафику!