K8s Ingress结合AWS ALB(ClusterIP+target-type:ip)无法生成负载均衡地址求助
AWS EKS中Ingress无法生成ALB负载均衡地址的排查与解决方案
1. 先确认AWS Load Balancer Controller是否部署
EKS集群默认不会自动创建ALB,必须部署AWS Load Balancer Controller(替代旧版ALB Ingress Controller)。执行命令检查控制器Pod状态:
kubectl get pods -n kube-system -l app.kubernetes.io/name=aws-load-balancer-controller
如果没有运行中的Pod,先完成控制器部署:确保绑定了具备ALB创建、子网访问等权限的IAM角色,再通过Helm或YAML完成安装。
2. 检查Ingress资源的核心配置
2.1 验证注解完整性
使用target-type: ip时,必须配置必要的ALB注解,示例正确配置如下:
annotations: alb.ingress.kubernetes.io/scheme: internet-facing # 内网ALB用internal alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/subnets: subnet-xxxxxx, subnet-yyyyyy # 指定带集群标签的VPC子网 alb.ingress.kubernetes.io/security-groups: sg-xxxxxx # 可选,无则控制器自动创建
注意:指定的子网必须带有标签kubernetes.io/cluster/<你的集群名称>: shared或owned,否则控制器无法识别可用子网。
2.2 确认Backend关联有效性
- 检查ClusterIP Service是否正确关联Pod:
确保kubectl get svc <你的Service名称>TARGETS列显示Pod的IP和端口,说明Service与Pod绑定正常。 - 检查Pod状态:
确认Pod处于kubectl get pods -l <你的Pod标签>Running状态,且就绪探针(readinessProbe)检查通过。
3. 验证集群网络适配性(针对target-type: ip)
使用target-type: ip时,ALB直接转发流量到Pod IP,需满足:
- 集群使用VPC CNI插件(EKS默认配置),Pod拥有VPC内独立IP,而非通过kube-proxy转发。
- Pod所在子网与ALB子网连通,且安全组允许ALB访问Pod的业务端口(如80/443)。
4. 查看控制器日志定位错误
通过控制器日志获取具体故障信息:
kubectl logs -n kube-system -l app.kubernetes.io/name=aws-load-balancer-controller --follow
常见错误场景:IAM权限不足、子网标签缺失、Service/Pod未就绪、Ingress语法错误等。
5. 正确配置示例参考
deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 2 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: nginx:latest ports: - containerPort: 80 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 10
ingress.yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app-ingress annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/subnets: subnet-0123456789abcdef0, subnet-0abcdef1234567890 alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443},{"HTTP":80}]' spec: ingressClassName: alb # 必须指定对应控制器的ingressClass rules: - host: my-app.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-app-svc port: number: 80
service.yaml(ClusterIP类型)
apiVersion: v1 kind: Service metadata: name: my-app-svc spec: type: ClusterIP selector: app: my-app ports: - port: 80 targetPort: 80
内容的提问来源于stack exchange,提问作者Pooja Honey
相关产品推荐
相关产品推荐

