使用 Argo CD 自动同步 Docker Compose 到边缘节点

解读

在国内边缘计算场景里,“云-边-端”三层架构已成主流:中心云跑 K8s,边缘节点因资源受限仍沿用 Docker Compose。面试官想知道你能否把 GitOps 理念 落地到这种“混合运行时”环境,实现“一次声明、多点自动交付”。核心难点有三:

  1. Argo CD 原生只认 K8s 资源,如何让它“理解” Compose 文件;
  2. 边缘节点不在云 VPC 内,弱网、NAT、单向隧道常见,如何安全同步;
  3. 边缘侧可能跑 ARM64 工业盒子,镜像多架构、多版本如何对齐。
    回答时必须给出“可落地的中国方案”,包括网络、工具链、合规(等保 2.0、信创)细节,否则会被判“纸上谈兵”。

知识点

  • Argo CD 插件机制:ConfigManagementPlugin 可调用任意 CLI,把 Compose 转成 K8s 资源或远程触发边缘脚本。
  • docker-compose-substitution:国内常用 Harbor 镜像仓库 + 加速器,需支持变量替换 image: ${REGISTRY}/app:${VERSION}
  • 边缘隧道:用 KubeEdge/EdgeMeshOpenYurt 的 Raven L3 VPN 解决单向 NAT,云侧 Argo CD 通过隧道 API Server 访问边缘。
  • Git 触发:Gitee 企业版 webhook → Argo CD ApplicationSet → 多边缘节点矩阵。
  • 安全:Compose 文件里 secrets 使用 SOPS 加密,边缘节点用 TPM 绑定解密密钥,满足等保 2.0 对“边缘数据落地加密”要求。
  • 多架构:在 CI 阶段用 docker buildx --platform linux/arm64,amd64 推到 Harbor 的同一个 multi-arch 镜像,边缘节点自动拉取匹配架构。
  • 健康检查:边缘脚本把 docker compose ps -f json 结果写回 ConfigMap,Argo CD 通过 Resource Health Lua 脚本 判定 Synced & Healthy。

答案

整体采用“Argo CD 插件 + 边缘代理”两级方案,全部声明式,零人工 SSH。

  1. 代码仓库布局

    ├── manifests
    │   ├── edge1
    │   │   └── docker-compose.yaml
    │   └── edge2
    │       └── docker-compose.yaml
    └── argocd
        └── cm-plugin.yaml
    

    仓库放 Gitee 私有组,开启 IP 白名单+Webhook 秘钥,满足国企合规。

  2. Argo CD 插件配置
    在 argocd-cm 里注册 ConfigManagementPlugin

    configManagementPlugins: |
      - name: compose-to-edge
        generate:
          command: ["sh", "-c"]
          args: ["docker run --rm -v $(pwd):/ws -e EDGE_NAME=${EDGE_NAME} -e EDGE_API=${EDGE_API} registry.cn-hangzhou.aliyuncs.com/ops/compose-runner:v1.0"]
    

    compose-runner 镜像内置 docker-compose-cli、yq、kubectl,会把 compose 文件渲染成 EdgeJob CR(自定义 CRD),并推送到边缘 API Server。

  3. 边缘节点侧
    预装 KubeEdge EdgeCoreOpenYurt node,暴露本地 Docker Engine API unix:///var/run/docker.sock
    部署 edge-agent DaemonSet,监听 EdgeJob CR,收到任务后执行:

    docker compose -p ${EDGE_NAME} -f /tmp/compose.yaml up -d --remove-orphans
    

    执行结果写回 EdgeJob.status,Argo CD 通过 resource.customizations 的 Lua 脚本判定 Healthy。

  4. Argo CD Application

    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: edge-compose
    spec:
      project: default
      source:
        repoURL: https://gitee.com/your-company/edge-apps.git
        targetRevision: HEAD
        path: manifests
        plugin:
          name: compose-to-edge
          env:
            - name: EDGE_NAME
              value: "{{path.basename}}"
      destination:
        server: https://edge-apiserver.raven.openyurt.io:10250
        namespace: edge-system
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
        retry:
          limit: 5
          backoff:
            duration: 5s
            factor: 2
    

    使用 ApplicationSet 可一次性生成 100+ 边缘节点的 Application,实现“矩阵式交付”。

  5. 镜像与网络

    • Harbor 部署在 中心云,开启 P2P 预热(Dragonfly)解决边缘带宽瓶颈。
    • 边缘节点 /etc/docker/daemon.json 配置 双向 TLS 访问 Harbor,防止中间人篡改。
    • 若边缘在 4G/5G 内网,启用 Harbor 代理缓存 项目,避免重复拉取。
  6. 回滚与灰度
    Git 回退 commit → Argo CD 自动 Sync → edge-agent 执行 docker compose down && docker compose up 旧版本,30 秒内完成,无需人工登边缘机。

  7. 监控告警
    edge-agent 同时把 docker compose ps 结果转成 Prometheus 指标,通过 EdgeMesh 隧道 回传中心 Thanos,实现“云边一体化可观测”。

拓展思考

  • 信创场景:边缘盒子换成 鲲鹏 ARM+麒麟 V10,需把 compose-runner 镜像重编译为 arm64v8 版本,并验证 docker-engine 20.10 以上对 cgroups v2 的兼容性
  • 离线交付:把 Harbor 做成 离线压缩包 + docker save 镜像 tar,通过 移动硬盘/国密 U 盘 导入边缘,Argo CD 插件改为读取本地 tar,满足军工离线机房要求。
  • 多集群治理:当边缘节点超过 1000,引入 Argo CD ApplicationSet + ClusterGenerator,把“省-市-区县”三级边缘集群统一纳管,实现国网/运营商级规模。
  • 安全加固:用 Kyverno 策略 强制检查 EdgeJob 里是否使用了 非 root 用户、只读文件系统、seccomp=runtime/default,否则拒绝同步,满足等保 2.0 三级对容器运行时的强制访问控制要求。