如何在我所有的跑步者身上部署同样的工作?

how to deploy same job on all my runners?

我有几个虚拟机 运行 gilab-runner,我正在使用 gitlab-ci 将微服务部署到这些虚拟机中。现在我想用 prometheus 和 grafana 监控这些虚拟机,但我需要设置 node-exporter/cadvisor 等服务到这些虚拟机中。

我的想法是使用 gitlab-ci 为这些 VM 定义一个通用作业。

我已经写好了 docker-compose.yml 和 .gitlab-ci.yml.

version: '3.8'

services:
  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    restart: unless-stopped
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.rootfs=/rootfs'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
    ports:
      - "9100:9100"

  cadvisor:
    image: google/cadvisor
    container_name: cadvisor
    restart: unless-stopped
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro
    ports:
      - "8080:8080"
deploy-workers:
  tags:
    - worker
  stage: deploy-workers
  script:
    - docker-compose -f docker-compose.worker.yaml pull
    - docker-compose -f docker-compose.worker.yaml down
    - docker-compose -f docker-compose.worker.yaml up -d

然后我用 'worker' 标签在我所有的虚拟机中注册跑步者。

但是,在 ci 期间只触发了一个工作任务。

我还有大约 20 个虚拟机要使用。

有人有什么建议吗?

这可能不是将服务部署到虚拟机上的好方法。你不想只是启动你的 GitLab CI 工作,然后希望它能产生你想要的结果。分别管理每个 VM 既乏​​味又容易出错。

您可能想要做的是拥有一种方法,该方法具有声明性方式 define/describe 您的基础架构以及应如何配置该基础架构的状态以及 运行 在其上运行的应用程序。

例如,您可以:

  1. 使用合适的协调器,例如 docker swarm 或 Kubernetes AND/OR
  2. 使用配置工具,例如连接到每个 VM 的 Ansible,或者如果您的 VM 运行 在云中,Terraform 或类似工具。

在这两个示例中,您可以从单个 GitLab CI 作业中利用这些工具,并立即将更改部署到所有 VMs/clusters。

使用docker群

例如,您可以将所有 20 个虚拟机加入同一个 docker 群,而不是 运行 在 20 台主机上构建您的 docker-compose。

然后在你的 compose 文件中,你创建一个 deploy 键来指定你想要在 swarm 中有多少个副本,包括每个节点的数量。或者使用 mode: global 来简单地指定您希望集群中的每台主机都有一个服务容器。

services:
  node-exporter:
    deploy:
      mode: global # deploy exactly one container per node in the swarm
  # ...
  cadvisor:
    deploy:
      mode: global # deploy exactly one container per node in the swarm

然后 运行ning docker stack deploy 从任何管理器节点将对 所有 你的集群工作节点做正确的事情。 Docker swarm 也会在失败时自动重启你的容器。

参见 deploy reference

使用 swarm(或任何编排器)还有很多其他好处,例如健康检查、回滚等,这将使您的部署过程更安全、更易于维护。

如果您必须为每个主机使用一个作业

为每个 VM 上的每个 运行ner 设置一个 唯一标签。然后使用一个并行矩阵,为每个标签设置一个作业。

job:
  parallel:
    matrix:
      RUNNER: [vm1, vm2, vm3, vm4, vm5] # etc.
  tags:
    - $RUNNER

run a matrix of parallel jobs

您要确保标签是唯一的并涵盖所有主机,或者您可以 运行 同一主机上的同一作业多次。

这会让你做你想做的事。但是,这不是一种可取的做法。举个简单的例子:不能保证您的 docker-compose up 会成功,您可能会一次性关闭整个集群。