Kubernetes中搭配MetalLB的Ingress DNS配置不生效问题求助
问题根因及排查步骤
1. 优先验证后端服务可用性
你Ingress规则绑定的是dev命名空间下的hello-service,但你只提供了hello-node-service的配置,首先确认hello-service是否配置正确:
- 执行以下命令验证
hello-service本身可访问:
kubectl run -it --rm --image=curlimages/curl testcurl -- curl http://hello-service.dev.svc.cluster.local
如果该命令返回异常,说明hello-service未正确配置selector关联app:hello标签的Pod,或端口映射配置错误,优先修复服务配置。
如果该命令返回正常,继续排查以下问题。
2. 路径匹配规则问题
你当前Ingress配置cluster.local的/hello路径转发到hello-service,默认Nginx Ingress会将原始路径完整透传给后端服务,如果你的后端服务仅提供根路径/的接口,未实现/hello路径的接口,就会返回404。
解决方法:给Ingress添加路径重写注解,修改Ingress配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-hello namespace: dev annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - host: cluster.local http: paths: - backend: service: name: hello-service port: number: 80 path: /hello/?(.*) pathType: Prefix
该配置会将/hello路径下的所有请求重写到后端服务的根路径,比如访问/hello会转发到后端的/,/hello/abc会转发到后端的/abc。
3. 验证Ingress资源是否被控制器正常加载
执行以下命令查看Ingress资源的状态:
kubectl get ingress -n dev ingress-hello
正常情况下ADDRESS列会显示Ingress控制器的对外IP10.0.57.28,如果为空说明Ingress控制器未正常识别该规则:
- 执行
kubectl describe ingress -n dev ingress-hello查看事件输出,确认是否有找不到服务、端口不匹配等报错。
4. 日志无输出问题说明
你看到的控制器无日志属于正常情况,默认Nginx Ingress v1.x版本未开启访问日志,仅输出错误日志,你可以修改Ingress控制器的配置开启访问日志,方便后续排查。
关于DNS配置的说明
你在本地工作机配置/etc/hosts解析到Ingress对外IP10.0.57.28的方案是正确的,不需要额外配置集群内的DNS。
内容的提问来源于stack exchange,提问作者Andrew Kaa

