前端analysis | What,Why,Who,When,Where,How

多机独立Docker Compose到K8s集群动态调度

2025-04-01

以下是实现从多机独立Docker Compose到K8s集群动态调度的Cypress自动化测试的完整方案:


架构转型路线图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
graph LR
A[分散式] -->|解耦| B[集中式]
B -->|扩展| C[动态调度]

subgraph 初始状态
A1[主机1: docker-compose]
A2[主机2: docker-compose]
A3[...]
end

subgraph 目标架构
B1[K8s Master]
B2[Worker Node Pool]
B3[分布式存储]
end

具体实施步骤

1. 容器化改造(基础层)

1
2
3
4
5
6
7
# 改造后的Cypress Dockerfile
FROM cypress/included:12.0.0
+ ARG TEST_ENV
+ ENV CYPRESS_ENV=${TEST_ENV}
+ COPY --from=opencv-python /usr/local/lib/python3.9/site-packages/cv2 /usr/local/lib/python3.9/site-packages/cv2
VOLUME /e2e
WORKDIR /e2e

2. K8s集群部署(控制层)

1
2
3
4
5
6
# 使用k3sup快速搭建集群(5节点示例)
for i in {1..5}; do
k3sup join --ip 192.168.1.$i \
--server-ip 192.168.1.1 \
--user ubuntu
done

3. 动态调度系统(核心逻辑)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# cypress-dispatcher.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: cypress-{{.TestID}}
spec:
ttlSecondsAfterFinished: 3600
template:
spec:
containers:
- name: runner
image: your-registry/cypress-ai:latest
envFrom:
- configMapRef:
name: test-env-{{.EnvType}}
volumeMounts:
- name: testcases
mountPath: /e2e
volumes:
- name: testcases
persistentVolumeClaim:
claimName: cypress-pvc
restartPolicy: Never

4. 测试任务编排(调度层)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# task_scheduler.py
from kubernetes import client, config

def dispatch_test(env: str, test_case: str):
config.load_kube_config()
api = client.BatchV1Api()

body = client.V1Job(
metadata=client.V1ObjectMeta(
generate_name="cypress-"),
spec=client.V1JobSpec(
template=client.V1PodTemplateSpec(
spec=client.V1PodSpec(
containers=[
client.V1Container(
name="cypress",
image="your-registry/cypress-ai",
env=[{"name": "TEST_CASE", "value": test_case}]
)]
)))
)
api.create_namespaced_job(namespace="test", body=body)

5. 资源监控与回收

1
2
# 自动清理完成的任务
kubectl get jobs --field-selector=status.successful=1 -o name | xargs kubectl delete

关键优化点

1. 测试资源动态分配

1
2
3
4
5
graph TB
A[测试队列] --> B{资源检查}
B -->|CPU充足| C[立即执行]
B -->|资源不足| D[加入Pending队列]
C --> E[NodeSelector定向调度]

2. 跨节点存储方案

1
2
3
4
5
1. **MinIO对象存储**
```bash
helm install minio minio/minio \
--set persistence.size=100Gi \
--set mode=distributed
  1. 测试结果收集
    1
    2
    3
    4
    5
    6
    7
    8
    // cypress/plugins/index.js
    afterRun: async (results) => {
    await s3.putObject({
    Bucket: 'cypress-results',
    Key: `${Date.now()}.json`,
    Body: JSON.stringify(results)
    })
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    #### **3. 智能调度策略**
    ```yaml
    # Pod亲和性配置示例
    affinity:
    podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
    matchExpressions:
    - key: app
    operator: In
    values: ["cypress"]
    topologyKey: "kubernetes.io/hostname"

性能对比指标

指标 Docker Compose方案 K8s动态调度方案
测试任务启动时间 15-30s/节点 3-8s/Pod
资源利用率 30%-45% 65%-80%
最大并发测试数 5(固定节点数) 50+(自动扩展)
失败任务自动恢复 需手动干预 内置重试机制

迁移实施 checklist

  1. 所有测试容器镜像推送到私有Registry
  2. 持久化存储方案部署完成(MinIO/NFS)
  3. K8s节点打标区分性能等级(如:gpu=true)
  4. 编写Helm Chart或Kustomize模板
  5. CI/CD流水线适配K8s调度API
  6. 监控告警系统集成(Prometheus+Alertmanager)

常见问题解决方案

Q: 如何保持测试环境一致性?

1
2
3
4
5
6
7
8
9
10
11
12
+ 方案:
- 使用K8s ConfigMap统一管理环境变量
- 通过PodPreset注入公共配置
```yaml
apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
name: cypress-env
spec:
env:
- name: CYPRESS_BASE_URL
value: "https://test.example.com"
1
2
3
4
5
6
7
8
9

**Q: 测试任务如何优先调度到空闲节点?**
```bash
# 给空闲节点添加标签
kubectl label node <node-name> workload=idle

# 在Job中配置节点选择
nodeSelector:
workload: idle

通过以上方案,您可以将分散的测试能力转化为弹性可扩展的云原生测试平台,实现资源利用率提升和运维成本降低的双重收益。建议先在一个节点上进行试点迁移,验证稳定后再全量切换。

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏