使用 DIND 并行运行多个构建作业的问题

问题描述 投票:0回答:1

我们有一个使用 3 个运行程序的本地 gitlab 实例,当我们运行单个构建作业时,该实例运行良好。

遗憾的是,当使用

dind
并行启动 3 个构建作业时,它失败并出现大量错误:

  • 有时无法登录docker拉取镜像进行缓存
  • 有时登录成功,构建失败

但在这两种情况下它都会抱怨证书:

gRPC 拨号失败:无法连接到 Docker 守护进程。 “docker daemon”是否在此主机上运行?:x509:由未知颁发机构签名的证书(可能是因为在尝试验证候选颁发机构证书“docker:dind CA”时出现“crypto/rsa:验证错误”)

怀疑证书被其他构建作业崩溃,我们决定将用于证书的文件夹分开,因此它对于每个运行者来说都是唯一的,遗憾的是问题仍然存在。

我们还注意到

DOCKER_HOST="tcp://docker:2376"
docker地址是随机的,并且多次返回相同的值,这意味着它们再次使用相同的资源。

我找到了一份关于如何手动使用脚本来确保每个作业连接到其独特的 dind 服务的指南(这里),但由于这篇文章已有 5 年多了,我想知道这是否仍然适用,或者我是否仍然适用?做错事了。

请分享有关去哪里查找的任何建议或指导。

docker gitlab gitlab-ci gitlab-ci-runner
1个回答
0
投票

我也遇到了同样的问题,但在 Jenkins 中,我在 Kubernetes 中运行了多个作业。我发现使用docker-cli镜像的dind镜像每次都会生成证书,所以你必须检查是否没有从主机挂载

/certs/client
目录到每个构建器,因为在这种情况下,证书将覆盖每个运行构建作业的时间。我也遇到这样的错误
error during connect: Post "https://localhost:2376/v1.24/auth": x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "docker:dind CA")
。在 kubernetes 中,我使用 pod 反亲和性修复了这个问题,防止在同一节点上安排两个 Jenkins pod:

affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
              - key: jenkins
                operator: In
                values:
                  - slave
          topologyKey: kubernetes.io/hostname
© www.soinside.com 2019 - 2024. All rights reserved.