EKS中通过kubectl将CLB迁移至ALB时Ingress无地址排查
问题根因
配置未生效、ALB无法创建的原因有4个:
- 前置组件缺失:EKS集群默认不搭载AWS Load Balancer Controller(原ALB Ingress Controller),没有该组件时,集群无法解析ALB类型的Ingress资源,也不会调用AWS API创建负载均衡实例。
- 注解格式错误:
alb.ingress.kubernetes.io/tags注解值末尾多了无效的**字符,会导致控制器解析配置失败,直接跳过该Ingress资源的处理。 - Ingress类配置不兼容:使用的
kubernetes.io/ingress.class: alb是旧版本控制器的注解,在v2.2.0及以上版本的AWS Load Balancer Controller中已被废弃,若集群中没有手动创建名为alb的IngressClass资源,控制器无法匹配到需要处理的Ingress。 - 监听配置缺失:ALB默认仅创建80端口的HTTP监听,原有CLB同时开放8080、8443两个端口,当前Ingress没有配置多端口监听规则,就算ALB创建完成也无法兼容原有业务的访问逻辑。
修正方案
- 先在EKS集群部署匹配版本的AWS Load Balancer Controller,为控制器对应的服务账户配置IRSA权限,确保组件拥有创建ALB、目标组、监听、安全组等资源的AWS API权限。
- 修正Ingress配置中的格式错误,替换废弃注解,补充必要的监听配置,参考如下可直接使用的配置:
apiVersion: v1 kind: Service metadata: name: helloworld spec: ports: - name: https port: 8443 protocol: TCP targetPort: 8080 - name: http port: 8080 protocol: TCP targetPort: 8080 selector: app: helloworld type: NodePort --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: helloworld annotations: alb.ingress.kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing # 移除了末尾多余的** alb.ingress.kubernetes.io/tags: Environment=dev,Team=app # 配置ALB监听端口,可根据业务需求调整 alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' # 开启HTTPS需要配置ACM证书ARN,替换为自己的证书信息即可 # alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:<区域ID>:<账号ID>:certificate/<证书ID> # 可选:开启HTTP自动跳转到HTTPS # alb.ingress.kubernetes.io/ssl-redirect: '443' # 配置空闲超时时间,和原有CLB的3600秒配置保持一致 alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=3600 spec: # 显式指定Ingress类,兼容新版控制器 ingressClassName: alb rules: - host: "*.amazonaws.com" http: paths: - path: /echo pathType: Prefix backend: service: name: helloworld port: number: 8080
- 应用配置后,执行
kubectl describe ingress helloworld查看资源事件,可看到ALB创建的流程日志,等待1-3分钟资源创建完成后,执行kubectl get ingress即可看到ADDRESS字段返回ALB的公网访问域名。
注意:如果原有业务直接通过CLB的8080、8443端口访问,ALB默认监听80/443端口,可以通过修改
listen-ports注解调整监听端口,或者在业务侧切换为80/443端口访问。
内容的提问来源于stack exchange,提问作者ImPurshu
相关产品推荐
相关产品推荐

