1. 在EKS上使用LBC GatewayAPI的实践指南
作为一名长期在AWS和Kubernetes领域工作的工程师,我最近深入测试了AWS Load Balancer Controller(LBC)对Gateway API的支持。虽然官方文档提到2.17版本还不建议在生产环境使用,但从实际测试来看,这个功能已经相当成熟,值得提前了解。
Gateway API是Kubernetes社区推出的新一代入口标准,相比传统的Ingress API,它提供了更丰富的路由能力和更清晰的职责分离。AWS LBC作为AWS官方维护的控制器,能够将Gateway API资源映射为AWS的NLB和ALB服务。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 前置条件检查
在开始之前,请确保你的环境满足以下要求:
- EKS集群版本1.21+
- AWS Load Balancer Controller版本2.13.0+
- 集群IAM角色具有创建ELB的权限
- kubectl和helm已正确配置
提示:可以使用以下命令检查LBC版本
bash复制helm list -n kube-system | grep aws-load-balancer-controller
2.2 安装Gateway API CRD
Gateway API通过Custom Resource Definitions(CRD)扩展Kubernetes API。我们需要安装两组CRD:
bash复制# 安装实验性Gateway API CRD
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/experimental-install.yaml
# 安装LBC特定的Gateway API扩展CRD
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/config/crd/gateway/gateway-crds.yaml
这两组CRD分别提供了:
- 标准Gateway API资源(GatewayClass、Gateway、HTTPRoute等)
- LBC扩展资源(LoadBalancerConfiguration、TargetGroupConfiguration等)
3. 配置AWS Load Balancer Controller
3.1 启用Gateway API支持
默认情况下,LBC不会监听Gateway API资源。需要通过feature flag显式启用:
bash复制helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=<your-cluster-name> \
--set vpcId=<your-vpc-id> \
--set "controllerConfig.featureGates.NLBGatewayAPI=true" \
--set "controllerConfig.featureGates.ALBGatewayAPI=true"
安装完成后,检查LBC日志确认Gateway API reconciler已启动:
code复制{"level":"info","ts":"2026-01-23T06:28:00Z","logger":"setup","msg":"starting gateway route reconciler"}
3.2 控制器工作原理
LBC通过reconciliation loop管理Gateway API资源:
- 持续监控Gateway API资源变更
- 将变更事件加入内部处理队列
- 验证并转换为AWS资源配置
- 比较期望状态与实际状态
- 调用AWS API进行调和
- 更新资源status字段
4. 实现L4路由(TCP/UDP)
4.1 创建GatewayClass和Gateway
首先定义NLB类型的GatewayClass:
yaml复制apiVersion: gateway.networking.k8s.io/v1beta1
kind: GatewayClass
metadata:
name: aws-nlb-gateway-class
spec:
controllerName: gateway.k8s.aws/nlb
然后创建具体的Gateway实例:
yaml复制apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: my-tcp-gateway
namespace: default
spec:
gatewayClassName: aws-nlb-gateway-class
listeners:
- name: tcp-app
protocol: TCP
port: 8080
allowedRoutes:
namespaces:
from: Same
应用后,LBC会自动创建NLB,但此时还没有监听器。
4.2 创建TCPRoute
定义TCP路由规则:
yaml复制apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TCPRoute
metadata:
name: my-tcp-app-route
namespace: default
spec:
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: my-tcp-gateway
sectionName: tcp-app
rules:
- backendRefs:
- name: foo-service
port: 5678
weight: 1 # 必须显式设置,不能为0
注意:当前版本(2.17)存在一个已知问题 - 必须显式设置weight且不能为0,否则会导致监听器创建失败。
5. 实现L7路由(HTTP/GRPC)
5.1 创建ALB Gateway
定义ALB类型的GatewayClass:
yaml复制apiVersion: gateway.networking.k8s.io/v1beta1
kind: GatewayClass
metadata:
name: aws-alb-gateway-class
spec:
controllerName: gateway.k8s.aws/alb
创建HTTP Gateway:
yaml复制apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: my-alb-gateway
namespace: default
spec:
gatewayClassName: aws-alb-gateway-class
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: Same
5.2 创建HTTPRoute
定义HTTP路由规则:
yaml复制apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: my-http-app-route
namespace: default
spec:
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: my-alb-gateway
sectionName: http
rules:
- matches:
- path:
type: PathPrefix
value: /api
backendRefs:
- name: api-service
port: 8080
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: web-service
port: 80
6. 高级配置选项
6.1 负载均衡器配置
通过LoadBalancerConfiguration自定义负载均衡器属性:
yaml复制apiVersion: gateway.k8s.aws/v1beta1
kind: LoadBalancerConfiguration
metadata:
name: internet-facing-config
spec:
scheme: internet-facing
ipAddressType: ipv4
然后在Gateway中引用:
yaml复制apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: my-alb-gateway
spec:
gatewayClassName: aws-alb-gateway-class
infrastructure:
parametersRef:
kind: LoadBalancerConfiguration
name: internet-facing-config
group: gateway.k8s.aws
# ... 其他配置
6.2 目标组配置
通过TargetGroupConfiguration自定义目标组属性:
yaml复制apiVersion: gateway.k8s.aws/v1beta1
kind: TargetGroupConfiguration
metadata:
name: custom-tg-config
spec:
targetReference:
kind: Service
name: foo-service
defaultConfiguration:
targetType: ip
healthCheckConfig:
healthCheckPath: /health
healthCheckInterval: 30
healthyThresholdCount: 3
6.3 监听器规则配置
通过ListenerRuleConfiguration自定义高级路由行为:
yaml复制apiVersion: gateway.k8s.aws/v1beta1
kind: ListenerRuleConfiguration
metadata:
name: redirect-to-https
spec:
actions:
- type: redirect
redirectConfig:
protocol: HTTPS
port: "443"
statusCode: HTTP_301
然后在HTTPRoute中引用:
yaml复制apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: my-http-app-route
spec:
rules:
- filters:
- type: ExtensionRef
extensionRef:
group: gateway.k8s.aws
kind: ListenerRuleConfiguration
name: redirect-to-https
# ... 其他配置
7. 生产环境注意事项
虽然Gateway API功能强大,但在生产环境使用时需要注意:
- 版本兼容性:确保LBC和Gateway API CRD版本匹配
- 权限控制:Gateway API引入了新的RBAC资源,需要相应调整
- 监控告警:为Gateway和Route资源设置适当的监控
- 性能考虑:大量路由规则可能影响控制器性能
- 备份策略:Gateway配置应纳入集群备份范围
8. 常见问题排查
8.1 NLB监听器创建失败
症状:TCPRoute创建后NLB监听器未出现
排查步骤:
- 检查LBC日志是否有权重相关错误
- 确保TCPRoute中backendRefs的weight=1
- 检查NLB是否已创建(AWS控制台)
8.2 ALB路由不生效
症状:HTTP访问返回404
排查步骤:
- 检查HTTPRoute的parentRef是否正确
- 验证后端服务是否健康
- 检查ALB监听器规则(AWS控制台)
8.3 资源状态不更新
症状:Gateway的status字段长时间为空
排查步骤:
- 检查LBC pod是否正常运行
- 查看LBC日志是否有协调错误
- 验证CRD是否已正确安装
9. 经验分享与最佳实践
在实际使用中,我总结了以下几点经验:
-
命名规范:为Gateway和Route资源建立清晰的命名约定,如
<env>-<purpose>-gateway -
分阶段部署:
- 先创建Gateway
- 验证负载均衡器创建成功
- 再创建Route
-
使用Annotations:虽然Gateway API不鼓励使用annotations,但某些高级功能仍需通过annotations配置
-
测试策略:
- 在非生产环境充分测试
- 逐步迁移流量
- 监控关键指标
-
文档记录:记录Gateway和Route的配置决策,方便后续维护
10. 未来展望
随着Gateway API逐渐GA,我们可以期待:
- 更完善的协议支持(如WebSocket)
- 更好的跨云兼容性
- 更丰富的扩展点
- 性能优化和稳定性提升
虽然目前还有一些小问题(如NLB权重参数),但整体来看Gateway API已经展现出强大的潜力,值得投入时间学习和实践。
