AWS Load Balancer Controller 外部管理负载均衡器实践指南
前言
在 Kubernetes 集群中,AWS Load Balancer Controller(LBC)通常负责自动创建和管理 AWS 负载均衡器资源。然而,在某些特定场景下,运维团队可能需要手动管理这些负载均衡器。本文将详细介绍如何使用 AWS Load Balancer Controller 实现对外部管理负载均衡器的集成。
适用场景
手动管理 AWS 负载均衡器的典型场景包括:
- IP 地址保留需求:防止关键 IP 地址被意外释放
- 混合架构支持:当 Kubernetes 集群只是负载均衡器的多个后端目标之一时
- 合规性要求:组织出于安全或成本考虑,需要对负载均衡器创建进行特定管理
技术原理
AWS Load Balancer Controller 通过 TargetGroupBinding 自定义资源定义(CRD)实现 Kubernetes 服务与手动创建的 AWS 负载均衡器的集成。其核心机制是:
- 运维人员先在 AWS 控制台或通过 CLI 手动创建负载均衡器(支持 NLB 和 ALB)
- 为负载均衡器配置监听器和目标组
- 在 Kubernetes 集群中创建 TargetGroupBinding 资源,将目标组 ARN 与 Kubernetes 服务关联
- LBC 控制器会监控关联的服务,自动将对应的 Pod IP 地址注册到目标组中
准备工作
环境要求
- 已安装 AWS Load Balancer Controller 的 Kubernetes 集群
- 配置好 AWS CLI 工具
- 安装 kubectl 命令行工具
必要信息
需要提前准备以下 AWS 资源信息:
- 集群 VPC 信息:
- EKS 集群 ID
- 子网 ID 列表
- 这些信息可在 EKS 控制台的"网络"部分找到
- 目标 Kubernetes 服务的端口和协议信息
负载均衡器配置步骤
1. 创建网络负载均衡器(NLB)
使用 AWS CLI 创建 NLB,注意每个可用区只能指定一个子网:
aws elbv2 create-load-balancer \
--name my-nlb \
--type network \
--subnets subnet-0e3f5cac72EXAMPLE subnet-1a2b3c4d5eEXAMPLE
关键输出:命令返回的负载均衡器 ARN,格式如下:
arn:aws:elasticloadbalancing:region:account-id:loadbalancer/net/my-nlb/id
2. 创建目标组
创建与 Kubernetes 服务匹配的目标组,必须指定集群所在的 VPC:
aws elbv2 create-target-group \
--name my-targets \
--protocol TCP \
--port 80 \
--vpc-id vpc-0598c7d356EXAMPLE
关键输出:目标组 ARN,格式如下:
arn:aws:elasticloadbalancing:region:account-id:targetgroup/my-targets/id
3. 创建监听器
创建监听器将流量转发到目标组,端口和协议需与 Kubernetes 服务匹配:
aws elbv2 create-listener \
--load-balancer-arn arn:aws:elasticloadbalancing:region:account-id:loadbalancer/net/my-nlb/id \
--protocol TCP \
--port 80 \
--default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:account-id:targetgroup/my-targets/id
Kubernetes 资源配置
创建 TargetGroupBinding
定义 YAML 文件将目标组与 Kubernetes 服务关联:
apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
name: nlb-tgb
spec:
serviceRef:
name: web-service # 目标服务名称
port: 80 # 服务端口
targetGroupARN: arn:aws:elasticloadbalancing:region:account-id:targetgroup/my-targets/id
应用配置到集群:
kubectl apply -f nlb-tgb.yaml
验证配置
等待约 30 秒后,可通过以下方式验证:
- 在 AWS 控制台查看目标组的注册目标
- 确认 Kubernetes 集群中对应服务的 Pod IP 已正确注册
- 通过负载均衡器 DNS 名称测试服务可达性
高级配置建议
- 健康检查配置:确保目标组的健康检查设置与应用程序特性匹配
- 跨区域负载均衡:根据业务需求考虑启用跨区域负载均衡
- 安全组配置:确保负载均衡器和 Pod 所在节点的安全组规则允许流量通过
- 标签管理:为手动创建的 AWS 资源添加适当标签,便于成本管理和资源跟踪
排错指南
常见问题及解决方法:
-
目标未注册:
- 检查 TargetGroupBinding 中的服务名称和端口是否正确
- 确认服务对应的 Pod 处于 Running 状态
- 检查 LBC 控制器日志是否有错误信息
-
流量不通:
- 验证安全组规则
- 检查网络 ACL 是否阻止流量
- 确认目标组健康检查配置是否正确
-
控制器不响应:
- 检查 LBC Pod 是否正常运行
- 验证 IAM 权限是否足够
总结
通过 AWS Load Balancer Controller 的 TargetGroupBinding 功能,我们可以在保留对负载均衡器手动控制权的同时,仍然享受 Kubernetes 服务自动发现和 Pod IP 动态注册的便利。这种混合管理模式为企业在 Kubernetes 上运行关键业务提供了更大的灵活性和控制力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考