【问题标题】:Terminate spot instance after each successful job using Gitlab CI使用 Gitlab CI 在每次成功作业后终止现场实例
【发布时间】:2021-01-20 05:23:50
【问题描述】:

这几天我一直在研究 Gitlab CI。我已将 EC2 -ASG 设置为具有 Spot 实例的运行器。

我想知道我们是否有任何解决方案可以在作业成功后立即删除现场实例。

以下是 gitlab runner 配置。

concurrent = 2
check_interval = 3

[session_server]
  session_timeout = 1800

[[runners]]
  name = "shell-runner"
  url = "https://gitlab.com/"
  token = "xxxx-xxxx"
  executor = "shell"
  limit = 1
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]

[[runners]]
  name = "docker-machine-runner"
  url = "https://gitlab.com/"
  token = "xxxx-xyxyxyxy"
  executor = "docker+machine"
  limit = 1
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "docker:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
  [runners.machine]
    IdleCount = 0
    IdleTime = 1800
    MaxBuilds = 100
    MachineDriver = "amazonec2"
    MachineName = "gitlab-docker-machine-%s"
    MachineOptions = [
    "amazonec2-region=us-west-2", 
    "amazonec2-ssh-user=ubuntu", 
    "amazonec2-vpc-id=vpc-xxxx", 
    "amazonec2-subnet-id=subnet-xxx", 
    "amazonec2-use-private-address=true", 
    "amazonec2-instance-type=t3a.medium", 
    "amazonec2-ami=ami-xxx", 
    "amazonec2-zone=a",
    "amazonec2-security-group=gitlab-runner-sg", 
    "amazonec2-request-spot-instance=true", 
    "amazonec2-spot-price=0.025"
    ]

我在上述配置中有两个运行器,即 shell 和 docker-machine。

目前,它根本没有删除 Spot 队列,如果我设置 amazonec2-block-duration-minutes=20 标志,我猜它会将 Spot 实例保留 20 分钟并在之后将其删除那个。

我正在寻找一种解决方案,以便在每个作业成功后删除 Spot 实例和/或它可以等待某个时间等待其他作业并终止。

在上面的 docker-machine-runner 中,需要进行哪些配置更改才能实现这一点?

或者我们可以做任何其他自动化来实现它吗?

如果需要更多相关信息,请告诉我。

提前致谢。

【问题讨论】:

    标签: amazon-web-services gitlab-ci gitlab-ci-runner docker-machine spot-instances


    【解决方案1】:

    我昨天回答了一个关于我如何监控跑步者平台的类似问题。完整帖子在这里:Start build on a windows ec2 with gitlab runner

    我在某处运行一个小应用程序,它不断地轮询各种 Gitlab API 以检索待处理作业的数量和可用运行器的数量。然后,根据我定义的一些阈值,我将增加或减少跑步者的数量,直至达到一个阈值。

    例如,假设我一次最多需要 5 个跑步者,并且在增加跑步者数量(最多 5 个)之前,我希望队列中的作业不超过 5 个。这是我要做的(从链接的帖子复制):

    1. 点击 Runners API 以获取跑步者的数量。
    2. 点击 Projects API 以获取所有项目并将其过滤以仅保留启用了管道/CI 的项目。您也可以存储此号码,这样您就不必每次都打这个电话了。
    3. 为每个项目点击 Pipelines API 以获取所有待处理/正在进行的 Pipelines。
    4. 为每个管道点击 Jobs API 以获取所有待处理的作业。
    5. 如果没有跑步者但有待处理的作业,请添加 1 名跑步者。
    6. 如果跑步者多于 1 人但小于最大跑步者,并且超过工作阈值,则将 1 名跑步者添加到最大值。
    7. 如果有 1 个或多个运行器且没有待处理的作业,请销毁一个休眠运行器(并从 Gitlab 注销它,以便 Runners API 调用保持干净)。 睡一两分钟,然后从顶部循环。

    使用的各种 API 有:

    【讨论】:

    • 酷@adam。除了 windows,我几乎做了同样的事情,我在 linux 上实现了一个 bash 脚本,这样它就会通过 API 并在找不到正在运行或待处理的作业时终止现场实例。
    猜你喜欢
    • 2019-03-16
    • 2018-06-06
    • 1970-01-01
    • 2020-08-01
    • 2019-09-28
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多