使用Nginx Ingress暴露Kubernetes Dashboard失败求助
问题:通过Nginx Ingress暴露Minikube中的Kubernetes Dashboard失败
环境信息
- 本地Minikube环境,使用podman作为VM驱动,容器运行时为Docker
- Kubernetes Dashboard版本:v2.6.1,通过官方yaml完成资源初始化
已完成操作
- Dashboard相关资源已正常创建,执行
kubectl get all -n kubernetes-dashboard输出如下:
NAME READY STATUS RESTARTS AGE pod/dashboard-metrics-scraper-8c47d4b5d-7dptt 1/1 Running 1 (78m ago) 9h pod/kubernetes-dashboard-6c75475678-4c9n2 1/1 Running 0 9h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/dashboard-metrics-scraper ClusterIP 10.105.70.143 <none> 8000/TCP 14h service/kubernetes-dashboard NodePort 10.111.136.242 <none> 443:32361/TCP 14h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/dashboard-metrics-scraper 1/1 1 1 9h deployment.apps/kubernetes-dashboard 1/1 1 1 9h NAME DESIRED CURRENT READY AGE replicaset.apps/dashboard-metrics-scraper-8c47d4b5d 1 1 1 9h replicaset.apps/kubernetes-dashboard-6c75475678 1 1 1 9h
- 将
service/kubernetes-dashboard类型从ClusterIP修改为NodePort - 创建Ingress资源,yaml配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: dashboard-ingress namespace: kubernetes-dashboard annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: test.ml http: paths: - path: / pathType: Exact backend: service: name: kubernetes-dashboard port: number: 443
- 在本地
/etc/hosts添加解析:192.168.49.2 test.ml
当前状态
- Ingress资源已创建,执行
kubectl get ingress -n kubernetes-dashboard输出:
NAME CLASS HOSTS ADDRESS PORTS AGE dashboard-ingress <none> test.ml 192.168.49.2 80 14h
- 无论通过IP地址
192.168.49.2还是hostnametest.ml访问,均无法打开Kubernetes Dashboard
解决方案
问题分析
- 协议不兼容:Kubernetes Dashboard服务监听443端口(HTTPS),但当前Ingress用HTTP(80端口)转发,协议不匹配导致访问失败。
- 路径规则错误:
Exact类型的/仅严格匹配根路径,Dashboard的前端资源会请求子路径(如/static/、/api/),这些请求会被Ingress拒绝。 - Ingress Class未正确关联:Minikube中Nginx Ingress需要明确指定
ingressClassName,仅靠旧annotation可能无法生效(部分版本中kubernetes.io/ingress.class已废弃)。
修复步骤
1. 更新Ingress配置
替换原Ingress yaml为以下内容:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: dashboard-ingress namespace: kubernetes-dashboard annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" # 告知Ingress后端使用HTTPS nginx.ingress.kubernetes.io/ssl-redirect: "false" # 禁用HTTP转HTTPS(避免证书问题) spec: ingressClassName: nginx # 明确绑定Nginx Ingress类 rules: - host: test.ml http: paths: - path: / pathType: Prefix # 匹配所有以/开头的子路径 backend: service: name: kubernetes-dashboard port: number: 443
2. 应用配置并验证
# 应用更新后的Ingress kubectl apply -f updated-ingress.yaml -n kubernetes-dashboard # 确认Ingress Class已正确设置 kubectl get ingress -n kubernetes-dashboard
3. 测试访问
在浏览器中访问http://test.ml,浏览器会提示证书不安全(Dashboard使用自签名证书),手动信任即可进入页面。
额外排查点
- 确认Minikube的Nginx Ingress插件已启用:
未启用则执行:minikube addons list | grep ingressminikube addons enable ingress - 检查Nginx Ingress Controller Pod状态:
kubectl get pods -n ingress-nginx - 查看Ingress Controller日志排查转发错误:
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
内容的提问来源于stack exchange,提问作者Karnik Kanojia
相关产品推荐
相关产品推荐

