MicroK8S集群中Ingress Controller指向错误服务的排查求助
看起来你遇到的问题主要是Ingress规则的路径冲突,还有Dashboard相关配置的小疏漏,咱们一步步来梳理解决:
1. 核心问题:Ingress路径冲突导致访问根路径总是命中Hello World应用
你现在定义了两个Ingress资源,它们的路径都是/。Ingress Controller在匹配规则时,当多个规则的路径完全相同时,会优先匹配创建时间更早的那个(或者按字典序,取决于具体实现),这就是为什么你访问根路径总是跳转到Hello World而不是Dashboard。
解决这个问题有两种常用方案:
方案A:给Dashboard设置独立的访问路径
修改dashboard-ingress的路径为/dashboard,这样访问http://192.168.50.251/dashboard就会指向Dashboard了:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: dashboard-ingress spec: rules: - http: paths: - path: /dashboard pathType: Prefix backend: service: name: dashboard-service port: number: 443
方案B:用不同的主机名区分服务
在本地主机的hosts文件(Windows是C:\Windows\System32\drivers\etc\hosts,Linux/macOS是/etc/hosts)中添加一条映射:192.168.50.251 dashboard.local,然后修改dashboard-ingress配置主机名:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: dashboard-ingress spec: rules: - host: dashboard.local http: paths: - path: / pathType: Prefix backend: service: name: dashboard-service port: number: 443
之后访问https://dashboard.local就会直接指向Dashboard了。
2. 修复Dashboard Service的配置错误
你当前的dashboard-service有两个关键问题,导致它根本找不到Dashboard的Pod:
- 选择器标签错误:Kubernetes Dashboard的Pod默认标签是
k8s-app: kubernetes-dashboard(你可以用microk8s kubectl get pods -n kube-system -l k8s-app=kubernetes-dashboard确认),而你写的是app.kubernetes.io/name: kubernetes,完全不匹配。 - 目标端口错误:Dashboard容器的默认端口是
8443,不是443,你需要把targetPort改成8443。
修正后的dashboard-service配置如下:
apiVersion: v1 kind: Service metadata: name: dashboard-service spec: selector: k8s-app: kubernetes-dashboard ports: - port: 443 targetPort: 8443 type: NodePort
3. 额外注意:Ingress访问HTTPS服务的适配
因为Dashboard本身是HTTPS服务,而你的Ingress当前是HTTP规则,访问时可能会出现证书错误或者跳转问题。如果遇到这种情况,可以给dashboard-ingress配置TLS(不过需要先准备证书),或者先通过NodePort直接测试Dashboard是否能正常访问:
# 先看dashboard-service的NodePort端口 microk8s kubectl get service dashboard-service # 然后访问https://192.168.50.251:<NodePort>测试
最后执行步骤
- 把上述修正后的内容更新到你的
manifest.yml中 - 重新应用配置:
microk8s kubectl apply -f manifest.yml - 验证Service和Pod的关联:
microk8s kubectl get endpoints dashboard-service,如果能看到Dashboard Pod的IP,说明关联成功 - 测试访问对应的Ingress路径或主机名
备注:内容来源于stack exchange,提问作者halfer

