如何在我所有的跑步者身上部署同样的工作?
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 您的基础架构以及应如何配置该基础架构的状态以及 运行 在其上运行的应用程序。
例如,您可以:
- 使用合适的协调器,例如 docker swarm 或 Kubernetes AND/OR
- 使用配置工具,例如连接到每个 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
会成功,您可能会一次性关闭整个集群。
我有几个虚拟机 运行 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 您的基础架构以及应如何配置该基础架构的状态以及 运行 在其上运行的应用程序。
例如,您可以:
- 使用合适的协调器,例如 docker swarm 或 Kubernetes AND/OR
- 使用配置工具,例如连接到每个 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
会成功,您可能会一次性关闭整个集群。