Nginx Ingress Controller metrics服务Ingress路由返回404问题咨询
Nginx Ingress路由metrics服务404问题排查方案
核心问题排查点
- 后端服务名称配置错误
你提到部署后自动生成的metrics服务名为internal-controller-metrics,但当前Ingress配置中指定的backend service名称为nginx-internal-controller-metrics,二者名称不匹配是最常见的404原因。你可以执行kubectl get svc -A | grep metrics确认服务的实际名称和所属命名空间,修正Ingress中的service名称配置。 - Ingress规则未被对应控制器加载
如果控制器日志中没有相关请求的路由报错,说明请求没有匹配到你编写的这条Ingress规则:- 执行
kubectl describe ingress metrics-ingress查看事件列表,确认是否存在service不存在、端口不匹配、ingress class不匹配等配置错误 - 执行
kubectl get ingress metrics-ingress确认ADDRESS字段已经正常分配控制器地址
- 执行
- metrics端口监听地址限制
Nginx Ingress Controller的metrics服务默认仅监听127.0.0.1,仅允许本地访问,即使集群内部Service也无法转发。你可以检查控制器的启动参数,确认是否配置了--metrics-address=0.0.0.0:10254,确保metrics端口监听在所有网卡上。 - 跨命名空间访问限制
如果你的Ingress资源和metrics服务不在同一个命名空间,部分版本的Nginx Ingress Controller会默认禁止跨命名空间转发,你可以在Ingress的annotations中添加nginx.ingress.kubernetes.io/allow-cross-namespace: "true"开启权限。
修正后配置参考
确认服务名称正确后,可以使用如下配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 kubernetes.io/ingress.class: nginx-internal # 跨命名空间时开启下面的注解 # nginx.ingress.kubernetes.io/allow-cross-namespace: "true" name: metrics-ingress spec: rules: - host: dnsname.of.ingress.controller.com http: paths: - backend: service: # 替换为实际的metrics服务名称 name: internal-controller-metrics port: number: 10254 path: /metric(/|$)(.*) pathType: Prefix
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

