本文目录导读:

- 场景一:使用 Nginx (通过修改配置文件 + 重载)
- 场景二:使用 HAProxy (通过 Runtime API)
- 场景三:使用云服务商 API (如 AWS ALB/NLB、GCP HTTP LB、阿里云 SLB)
- 场景四:Kubernetes 中修改 Service 负载均衡算法
- 场景五:使用 API Gateway(Kong/APISIX)的 Admin API
- 安全性与最佳实践
修改负载均衡算法通常需要根据具体的负载均衡器(如 Nginx、HAProxy、F5、云服务商 LB 等)以及运行环境(物理机、K8s、云平台)来确定方法,脚本化的方式一般用于配置文件自动化替换、API 调用或命令行工具链操作。
以下是几种常见场景的脚本修改方案:
使用 Nginx (通过修改配置文件 + 重载)
Nginx 自身支持的算法有限(轮询、权重、IP_Hash、最少连接等),用脚本直接替换 upstream 块中的 hash、least_conn 等指令。
示例 Nginx 配置片段 (/etc/nginx/conf.d/upstream.conf):
upstream backend {
# 当前是轮询
server 10.0.0.1:80 weight=3;
server 10.0.0.2:80;
}
Bash 脚本示例 (修改为 IP_Hash):
#!/bin/bash
# 将 upstream 块中的 "server" 行前面加上 "ip_hash;" 字段
CONFIG_FILE="/etc/nginx/conf.d/upstream.conf"
# 使用 sed 在 upstream 块的第一个 server 前插入 ip_hash
sed -i '/^upstream backend/,/^}/{/^ server/ s/^ server/ ip_hash;\n server/}' "$CONFIG_FILE"
# 或者更稳妥:直接替换整个 upstream 块(推荐用此方法)
cat > "$CONFIG_FILE" <<EOF
upstream backend {
ip_hash;
server 10.0.0.1:80 weight=3;
server 10.0.0.2:80;
}
EOF
# 检查配置语法,然后重载
nginx -t && systemctl reload nginx
注意: Nginx 运行在 Docker 中,则需要用 docker exec 或 docker cp 配合上述脚本。
使用 HAProxy (通过 Runtime API)
HAProxy 支持运行时通过 Unix Socket 或 Stats Socket 动态修改算法(针对 backend)。
开启 HAProxy Socket(在 haproxy.cfg 中):
global
stats socket /var/run/haproxy.sock mode 666 level admin
defaults
...
Python 脚本示例 (使用 socket 连接修改 backend 算法为 leastconn):
#!/usr/bin/env python3
import socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect("/var/run/haproxy.sock")
# 1. 禁用该 backend 的所有 server(否则可能无法切换算法)
sock.send(b"disable backend mybackend\n")
sock.recv(1024)
# 2. 修改算法(HAProxy 支持:roundrobin, static-rr, leastconn, first, source, uri, url_param, hdr, rdp-cookie 等)
sock.send(b"set backend mybackend algorithm leastconn\n")
sock.recv(1024)
# 3. 重新启用 server
sock.send(b"enable backend mybackend\n")
sock.close()
关键点: set backend <name> algorithm <algo> 是 HAProxy 2.4+ 支持的运行时命令。
使用云服务商 API (如 AWS ALB/NLB、GCP HTTP LB、阿里云 SLB)
云负载均衡器的算法一般无法通过脚本直接修改配置文件的“算法字段”,而是通过 API/CLI 更新监听器规则或目标组的属性。
AWS CLI 示例(将 NLB 的负载均衡算法从 round_robin 切换为 least_outstanding_requests):
#!/bin/bash
# 需要安装 aws cli 并配置权限
TARGET_GROUP_ARN="arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/my-tg/123456789"
# 查看当前算法
aws elbv2 describe-target-group-attributes --target-group-arn $TARGET_GROUP_ARN
# 修改算法(NLB 支持 round_robin, least_outstanding_requests)
aws elbv2 modify-target-group-attributes \
--target-group-arn $TARGET_GROUP_ARN \
--attributes Key=load_balancing.algorithm.type,Value=least_outstanding_requests
阿里云 CLI 示例(修改 SLB 的调度算法):
#!/bin/bash
# 需要下载并配置 aliyun-cli
LOAD_BALANCER_ID="lb-xxxxxxxxx"
LISTENER_PORT="80"
# 修改为 加权轮询(wrr),可选:wrr(加权轮询)、wlc(加权最小连接数)、rr(轮询)、lvs(一致性哈希等)
aliyun slb SetLoadBalancerTCPListenerAttribute \
--LoadBalancerId $LOAD_BALANCER_ID \
--ListenerPort $LISTENER_PORT \
--Scheduler "wlc"
Kubernetes 中修改 Service 负载均衡算法
K8s 自身 Service(ClusterIP/NodePort/LB)不支持直接修改算法,但可以通过 Service Mesh(如 Istio)或 Ingress Controller(如 Nginx Ingress、Traefik)的配置实现。
使用 Nginx Ingress Controller 示例 (通过 ConfigMap 或 Annotation 修改算法):
#!/bin/bash
# 1. 编辑 configmap 修改全局算法(需要重启 Pod)
kubectl edit configmap nginx-configuration -n ingress-nginx
# 2. 在 data 中添加(使用最少连接)
# data:
# load-balance: "least_conn"
# 3. 或者针对特定 Ingress 资源添加 annotation(kubectl patch)
kubectl patch ingress my-ingress -n default --type='json' \
-p='[{"op": "add", "path": "/metadata/annotations/nginx.ingress.kubernetes.io/load-balance", "value": "least_conn"}]'
注意: 部分 Ingress Controller 不支持动态热更新,如需动态修改可能需要触发 Ingress Controller 重载。
使用 API Gateway(Kong/APISIX)的 Admin API
以 Kong 为例(通过 REST API 修改 Upstream 的算法):
#!/bin/bash
KONG_ADMIN_URL="http://127.0.0.1:8001"
UPSTREAM_NAME="my-upstream"
# 获取当前 upstream 的算法
curl -s "$KONG_ADMIN_URL/upstreams/$UPSTREAM_NAME" | jq .algorithm
# 修改为 least-connections(有效值:round-robin, consistent-hashing, least-connections)
curl -X PATCH "$KONG_ADMIN_URL/upstreams/$UPSTREAM_NAME" \
-H "Content-Type: application/json" \
-d '{"algorithm": "least-connections"}'
安全性与最佳实践
- 使用声明式配置:避免临时
sed修改生产环境,建议使用 Ansible、Puppet 或 Terraform 进行配置管理。 - 回滚准备:修改前备份原有配置(
cp /etc/nginx/conf.d/upstream.conf /tmp/upstream.conf.bak)。 - 分阶段修改:在灰度环境验证脚本,确认新算法对应用无影响。
- API 速率限制:如果是调用云 API,注意并发限制,最好加入退避重试逻辑。
| 负载均衡器 | 脚本修改方式 | 是否支持热更新 |
|---|---|---|
| Nginx | 修改配置文件 + nginx -s reload |
是(短暂中断) |
| HAProxy | Unix Socket 发送命令 | 是(完全热更新) |
| AWS ALB/NLB | AWS CLI / API | 是 |
| 阿里云 SLB | aliyun CLI / API | 否(需重启实例前修改) |
| Kubernetes | kubectl patch ConfigMap/Ingress | 部分支持(依赖 Ingress Controller) |
| Kong/APISIX | REST API | 是 |
根据你的具体环境(本地、云端、K8s)选择对应的脚本方法,多数情况下,HAProxy 的 Runtime API 和 云厂商的 API 是最适合脚本动态修改的。