You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ingress未绑定LoadBalancer及API访问404问题求助

问题诊断与缺失步骤

从你的描述和配置来看,核心问题是Ingress资源没有被Ingress Controller识别并绑定到LoadBalancer,同时还有几处配置不匹配的地方导致API返回404。以下是需要补充的关键步骤:

1. 为Ingress指定匹配的Ingress Class

你的Ingress Controller启动参数里设置了--controller-class=k8s.io/ingress-nginx,但你的应用Ingress没有声明对应的ingressClassName,这会直接导致Ingress Controller忽略这个Ingress资源,自然不会将它绑定到LoadBalancer。

修改你的应用Ingress配置,添加spec.ingressClassName字段:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: d2d-server
spec:
  ingressClassName: k8s.io/ingress-nginx  # 和控制器的controller-class完全匹配
  rules:
  - host: api.cloud.myhostname.com
    http:
      paths:
      - backend:
          service:
            name: d2d-server
            port:
              number: 443
        path: /
        pathType: ImplementationSpecific

你也可以用kubectl get ingressclass命令查看集群中已存在的IngressClass资源,直接使用其名称即可。

2. 配置Ingress的TLS证书(适配LB的HTTPS协议)

你的LoadBalancer配置了HTTPS协议,但应用Ingress没有配置TLS,这会导致LB的HTTPS流量无法被Ingress Controller正确处理,进而引发404错误。

如果你的域名已有SSL证书,先创建存储证书的Secret:

kubectl create secret tls d2d-server-tls --cert=./your-cert.pem --key=./your-private.key

然后在Ingress中添加TLS配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: d2d-server
spec:
  ingressClassName: k8s.io/ingress-nginx
  tls:
  - hosts:
    - api.cloud.myhostname.com
    secretName: d2d-server-tls  # 引用刚才创建的证书Secret
  rules:
  - host: api.cloud.myhostname.com
    http:
      paths:
      - backend:
          service:
            name: d2d-server
            port:
              number: 443
        path: /
        pathType: ImplementationSpecific

3. 让Ingress Controller启用Proxy Protocol

你的LoadBalancer开启了proxy-protocol,但Ingress Controller的启动参数里没有对应的开启配置,这会导致nginx无法解析来自LB的流量格式,请求会被错误处理。

修改Ingress Controller的Deployment,在args中添加--enable-proxy-protocol:

args:
- /nginx-ingress-controller
- '--publish-service=$(POD_NAMESPACE)/ingress-nginx-controller'
- '--election-id=ingress-controller-leader'
- '--controller-class=k8s.io/ingress-nginx'
- '--configmap=$(POD_NAMESPACE)/ingress-nginx-controller'
- '--validating-webhook=:8443'
- '--validating-webhook-certificate=/usr/local/certificates/cert'
- '--validating-webhook-key=/usr/local/certificates/key'
- '--enable-proxy-protocol'  # 添加这一行开启Proxy Protocol支持

修改后重启Ingress Controller:

kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx

4. 验证Service与Pod的关联(排查潜在端点问题)

最后需要确认你的d2d-server Service的selectorapp: d2d-server和Pod的labels完全匹配,否则Service无法找到后端Pod,请求也会返回404。用以下命令验证:

# 查看Service的端点状态
kubectl describe service d2d-server
# 查看匹配selector的Pod
kubectl get pods -l app=d2d-server

如果Service的Endpoints字段为空,说明Pod和Service没有关联,需要修正Pod的labels。

完成以上步骤后,等待2-3分钟让配置生效,Ingress的状态应该会更新为绑定到LoadBalancer的IP,API请求也能正确转发到你的应用服务了。

内容的提问来源于stack exchange,提问作者Ethan Miller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:52:47