三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

从NLB迁移到ALB:Kubernetes监控服务负载均衡优化实践

从NLB迁移到ALB:Kubernetes监控服务负载均衡优化实践

1. 为什么需要从NLB迁移到ALB?

在Kubernetes生产环境中,监控服务作为关键基础设施,其高可用性和稳定性直接影响运维效率。传统上很多团队选择Network Load Balancer(NLB)作为入口,主要看中其高性能和低延迟特性。但随着业务规模扩大,NLB的局限性逐渐显现:

  • 功能单一:NLB仅支持四层(TCP/UDP)负载均衡,无法实现基于路径或主机的路由
  • 运维复杂度高:需要自行管理SSL证书、维护访问控制策略
  • 成本效益低:无法实现智能流量分配,导致资源利用率不均衡

相比之下,Application Load Balancer(ALB)作为七层负载均衡器提供了更丰富的功能集:

  • 高级路由能力:支持基于路径(/metrics, /api)、HTTP头或查询参数的流量路由
  • 内置安全特性:原生集成AWS Certificate Manager(ACM)、WAF防护
  • 精细化监控:提供请求级别指标和访问日志
  • 成本优化:通过智能算法提升资源利用率

2. 迁移前的关键准备工作

2.1 环境拓扑梳理

首先需要绘制当前监控服务的完整架构图,明确以下要素:

  • 现有NLB的监听器配置(端口、协议)
  • 后端目标组关联的EC2实例或IP地址
  • 安全组规则(入站/出站流量限制)
  • DNS记录指向情况

建议使用AWS Resource Groups服务快速获取相关资源清单:

aws resourcegroupstaggingapi get-resources \ --tag-filters Key=kubernetes.io/service-name,Values=monitoring-service

2.2 配置基线测试

建立性能基准指标至关重要:

  1. 使用CloudWatch获取当前NLB的关键指标:

    • ActiveFlowCount(活跃连接数)
    • ProcessedBytes(处理流量)
    • HealthyHostCount(健康后端数量)
  2. 通过k6进行负载测试:

import http from 'k6/http'; import { check } from 'k6'; export default function() { const res = http.get('http://monitoring-service/api/v1/query'); check(res, { 'status is 200': (r) => r.status === 200, 'response time < 500ms': (r) => r.timings.duration < 500 }); }

2.3 ALB预配置

创建新的ALB时需要特别注意:

  • 选择双AZ部署确保高可用
  • 启用跨区域负载均衡(Cross-Zone Load Balancing)
  • 配置访问日志输出到S3:
resource "aws_lb" "monitoring_alb" { enable_cross_zone_load_balancing = true access_logs { bucket = "monitoring-logs-bucket" prefix = "alb" enabled = true } }

3. 零停机迁移实施步骤

3.1 双轨运行阶段

采用蓝绿部署策略,保持新旧系统并行运行:

  1. 在Kubernetes中创建新的Ingress资源指向ALB:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: monitoring-alb annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip spec: rules: - host: monitoring.example.com http: paths: - path: /* pathType: Prefix backend: service: name: monitoring-service port: number: 9090
  1. 通过权重路由逐步切换流量:
resource "aws_route53_record" "monitoring" { zone_id = data.aws_route53_zone.main.zone_id name = "monitoring" type = "CNAME" ttl = 60 weighted_routing_policy { weight = 10 # 初始10%流量到ALB } set_identifier = "alb" records = [aws_lb.monitoring_alb.dns_name] }

3.2 健康检查优化

ALB的健康检查机制与NLB有显著差异:

  • 调整健康检查路径为/healthz
  • 设置合理的超时时间(建议5秒)
  • 配置成功阈值(3次成功视为健康)
alb.ingress.kubernetes.io/healthcheck-path: /healthz alb.ingress.kubernetes.io/healthcheck-interval-seconds: "15" alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5" alb.ingress.kubernetes.io/success-codes: "200-399"

3.3 证书与安全配置

迁移过程中SSL/TLS处理要点:

  1. 在ACM中申请或导入证书
  2. 配置ALB监听器HTTPS规则:
resource "aws_lb_listener" "https" { load_balancer_arn = aws_lb.monitoring_alb.arn port = "443" protocol = "HTTPS" ssl_policy = "ELBSecurityPolicy-TLS13-1-2-2021-06" certificate_arn = aws_acm_certificate.monitoring.arn default_action { type = "forward" target_group_arn = aws_lb_target_group.monitoring.arn } }

4. 迁移后的验证与优化

4.1 功能验证矩阵

设计全面的测试用例确保服务完整性:

测试场景预期结果验证方法
指标采集端点访问返回200状态码curl -I https://monitoring.example.com/metrics
告警规则评估触发预期告警模拟阈值突破事件
历史数据查询返回完整时间序列Grafana面板检查
服务发现自动发现新Pod部署测试Pod验证

4.2 性能基准对比

收集关键指标进行新旧环境对比:

  • 延迟分布:使用CloudWatch的ALB TargetResponseTime指标
  • 错误率:对比HTTP 5xx错误计数
  • 资源利用率:监控ALB的ActiveConnectionCount变化
aws cloudwatch get-metric-statistics \ --namespace AWS/ApplicationELB \ --metric-name TargetResponseTime \ --dimensions Name=LoadBalancer,Value=$(aws alb describe-load-balancers --query 'LoadBalancers[?contains(DNSName,`monitoring`)].LoadBalancerArn' --output text) \ --start-time $(date -v-1d +%Y-%m-%dT%H:%M:%SZ) \ --end-time $(date +%Y-%m-%dT%H:%M:%SZ) \ --period 300 \ --statistics Average

4.3 成本优化建议

ALB特有的成本控制策略:

  1. 请求压缩:启用ALB的gzip压缩减少数据传输量
resource "aws_lb" "monitoring_alb" { enable_deletion_protection = false enable_http2 = true idle_timeout = 60 ip_address_type = "ipv4" load_balancer_type = "application" enable_cross_zone_load_balancing = true }
  1. 智能路由:根据URI路径分流到不同规格的实例组
alb.ingress.kubernetes.io/actions.weighted-routing: | { "type":"forward", "forwardConfig":{ "targetGroups":[ { "serviceName":"monitoring-heavy", "servicePort":"9090", "weight":20 }, { "serviceName":"monitoring-light", "servicePort":"9090", "weight":80 } ] } }

5. 常见问题与排错指南

5.1 502 Bad Gateway问题排查

典型原因及解决方案:

  1. 目标组健康检查失败

    • 检查后端服务/healthz端点可达性
    • 验证安全组允许ALB的私有IP访问(ALB使用100.64/10网段)
  2. 证书链不完整

    • 使用openssl验证证书链
    openssl s_client -connect monitoring.example.com:443 -showcerts
  3. 请求超时

    • 调整ALB的idle_timeout(默认60秒)
    • 检查Pod资源限制是否合理

5.2 监控数据断点处理

迁移过程中可能出现的数据丢失应对:

  1. 配置Prometheus的scrape_interval为15s(原30s)
  2. 启用远程写入到S3长期存储
remote_write: - url: http://thanos-receive:10908/api/v1/receive queue_config: capacity: 2500 max_shards: 200 min_shards: 100

5.3 DNS缓存问题

客户端可能缓存旧NLB的DNS记录:

  1. 设置TTL为60秒(迁移期间临时调整)
  2. 使用curl测试解析结果:
for i in {1..10}; do dig +short monitoring.example.com | sort | uniq -c; sleep 5; done

在完成全面验证后,可逐步将Route53权重调整为100%指向ALB,并持续观察48小时确保无异常。最后清理NLB相关资源时,建议保留配置快照作为回滚预案。

← 返回列表