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

