EKS v1.22部署Ingress触发backend字段校验错误
问题原因
该校验错误是Ingress API版本不兼容导致的:
- Kubernetes从v1.22版本开始(包括EKS v1.22)正式移除
networking.k8s.io/v1beta1版本Ingress API的支持,仅接受networking.k8s.io/v1版本的规范结构 - 你提交的清单虽然声明了
apiVersion: networking.k8s.io/v1,但backend块使用的是旧v1beta1版本的字段:直接写serviceName、servicePort,v1版本中这两个字段已经被废弃,必须嵌套在service对象下声明,API服务器校验字段结构不匹配就会抛出你看到的backend字段校验错误。
除此之外你的配置还存在3个会导致部署/运行失败的问题:
alb.ingress.kubernetes.io/listen-ports注解中的JSON格式错误,YAML中用双引号包裹JSON字符串时,内部双引号没有正确转义,会导致ALB Ingress控制器无法解析监听端口配置- v1版本Ingress强制要求每个path配置
pathType字段,缺失该字段同样会触发校验错误 - 旧版
kubernetes.io/ingress.class注解已经被废弃,新版推荐使用spec.ingressClassName字段声明Ingress类型,避免后续版本兼容问题
修复方案
将Ingress配置调整为符合v1 API规范的结构,修正后的完整可用配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: alb-alb namespace: deploy annotations: alb.ingress.kubernetes.io/certificate-arn: "arn:aws:acm:us-west-1:0987654322:certificate/ee21bffb-ba4a-45a6-95a6-00551c1cfa32" alb.ingress.kubernetes.io/healthcheck-interval-seconds: "15" alb.ingress.kubernetes.io/healthcheck-port: traffic-port alb.ingress.kubernetes.io/healthcheck-protocol: HTTP alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5" alb.ingress.kubernetes.io/healthy-threshold-count: "2" # 修正JSON包裹方式,用单引号包裹避免转义问题 alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]' alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS-1-1-2017-01 alb.ingress.kubernetes.io/ssl-redirect: "443" alb.ingress.kubernetes.io/success-codes: "200" alb.ingress.kubernetes.io/target-group-attributes: "stickiness.enabled=true,stickiness.lb_cookie.duration_seconds=60" alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/unhealthy-threshold-count: "2" spec: # 替换旧的ingress.class注解,使用v1版本标准字段声明 ingressClassName: alb rules: - http: paths: - path: /* # 新增必填的pathType字段,ALB场景使用ImplementationSpecific匹配原有规则 pathType: ImplementationSpecific backend: # 替换旧的serviceName/servicePort结构,使用v1要求的嵌套service配置 service: name: service-svc port: number: 80
校验方式
修改完成后可以先执行客户端干跑命令验证配置合法性,无报错再正式部署:kubectl apply -f <你的ingress配置文件名>.yaml --dry-run=client
内容的提问来源于stack exchange,提问作者Sridharan r.g
相关产品推荐
相关产品推荐

