在Linux和Docker环境中实现容器的动态调度与负载均衡,需要结合编排工具、服务发现和负载均衡技术。以下是具体方案:
编排工具
服务发现
负载均衡
# 初始化Swarm集群
docker swarm init
# 部署服务时指定副本数和资源约束
docker service create \
--name web \
--replicas 3 \
--reserve-cpu 0.5 \
--reserve-memory 128M \
-p 80:80 \
nginx
# 动态扩缩容
docker service scale web=5
--constraint
指定节点标签(如node.labels.zone==east
)# Deployment示例(带资源请求和节点亲和性)
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
template:
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
cpu: "500m"
memory: "128Mi"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: zone
operator: In
values: ["east"]
ingress
网络自动暴露服务端口,请求被均匀分配到所有副本。
bash
docker service create --name web --replicas 3 -p 8080:80 nginx
# 访问任意节点IP:8080,请求会被均衡到3个容器
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer # 或使用ClusterIP + Ingress
bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
# docker-compose.yml示例
version: '3'
services:
traefik:
image: traefik
command:
- --api.insecure=true
- --providers.docker
ports:
- "80:80"
- "8080:8080" # Dashboard
volumes:
- /var/run/docker.sock:/var/run/docker.sock
web:
image: nginx
labels:
- "traefik.http.routers.web.rule=Host(`example.com`)"
指标收集:
HPA(Kubernetes):
kubectl autoscale deployment web --cpu-percent=50 --min=2 --max=10
自定义脚本(Docker Swarm):
# 根据CPU负载动态扩缩容
while true; do
load=$(awk '{print $1}' /proc/loadavg)
if (( $(echo "$load > 2.0" | bc -l) )); then
docker service scale web=+1
fi
sleep 30
done
SIGTERM
)。topologySpreadConstraints
(K8s)或--placement-pref
(Swarm)实现跨AZ调度。通过上述方案,可实现从简单到企业级的容器调度与负载均衡。对于生产环境,推荐使用Kubernetes或云托管服务(如EKS/GKE)。