You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决GitLab Kubernetes Runner拉取私有镜像的CA证书认证问题

问题

我有GitLab实例和小型Kubernetes集群,使用通配符证书*.ourdomain.corp同时适配GitLab实例与内部Docker仓库。通过Helm部署GitLab Runner时,最初因x509问题无法注册,添加CA证书密钥(chart配置中的certsSecretName)后注册成功,但拉取私有仓库自定义镜像时失败,报错:

WARNING: Failed to pull image with policy "": image pull failed: rpc error: code = Unknown desc = pinging container registry nexus.ourdomain.corp:5556: Get "https://nexus.ourdomain.corp:5556/v2/": x509: certificate signed by unknown authority.

当前values.yaml开头配置:

image:
  registry: registry.gitlab.com
  image: gitlab-org/gitlab-runner

尝试过的方法均无效:

  • 修改chart的config.toml模板中的ca_file、tls_file参数,其中tls_file导致Runner失去与GitLab的连接
  • 尝试将容器内/home/gitlab-runner/.gitlab-runner/certs/gitlab.ourdomain.corp.crt证书复制到usr/local/share/ca-certificates/并执行update-ca-certificates,但权限不足
  • 尝试挂载密钥卷到/etc/gitlab-runner/certs/ca.crt遭遇权限问题
  • 配置before_step复制证书并更新CA,但Runner会先尝试拉取镜像导致失败

补充信息:

  • P.S.1:从Runner Shell执行curl访问GitLab返回x509错误,但Runner可正常拉取公共仓库镜像
  • P.S.2:GitLab版本15.1.2,Runner版本15.1.0(Helm Chart版本gitlab/gitlab-runner 0.42.0)
解决方案

方法1:通过Helm Values注入CA并更新系统可信证书

利用Helm的extraVolumes和extraVolumeMounts挂载CA证书到容器系统目录,同时以root权限启动Runner以更新CA:

  1. 确认你的CA证书已存储在Kubernetes Secret中(可复用注册时用的Secret,或单独创建含ca.crt的Secret)

  2. 修改values.yaml,添加以下配置:

extraVolumes:
  - name: custom-ca
    secret:
      secretName: <你的CA证书Secret名称>
      items:
        - key: ca.crt
          path: ourdomain-ca.crt

extraVolumeMounts:
  - name: custom-ca
    mountPath: /usr/local/share/ca-certificates/ourdomain-ca.crt
    subPath: ourdomain-ca.crt
    readOnly: true

securityContext:
  runAsUser: 0  # 以root身份启动,确保能执行update-ca-certificates

command: ["/bin/bash", "-c"]
args:
  - |
    update-ca-certificates
    /entrypoint run --user=gitlab-runner --working-directory=/home/gitlab-runner

说明:

  • 证书挂载到/usr/local/share/ca-certificates/目录,后缀为.crt,确保update-ca-certificates能识别
  • 启动命令先更新系统CA证书,再启动Runner服务,避免拉取镜像时触发证书错误

方法2:为Docker Executor配置CA证书

如果使用Docker executor,直接在Runner配置中指定Docker客户端的CA证书路径:

修改values.yaml的config部分:

config:
  template: |
    [[runners]]
      [runners.kubernetes]
        image = "ubuntu:20.04"
        # 保留原有Kubernetes相关配置
      [runners.docker]
        tls_ca_cert = "/home/gitlab-runner/.gitlab-runner/certs/ourdomain.corp.crt"
        # 保留原有Docker相关配置

确保CA证书已通过certsSecretName挂载到/home/gitlab-runner/.gitlab-runner/certs/目录,或者通过extraVolumes指定对应路径。

方法3:集群节点全局添加CA证书(适合小型集群)

如果有权限操作集群节点,可直接在每个节点上添加CA证书:

  • 将CA证书复制到节点的/usr/local/share/ca-certificates/目录
  • 执行update-ca-certificates更新节点可信证书
  • 重启Docker服务systemctl restart docker

此方法无需修改Runner配置,所有Pod都会继承节点的可信CA列表。

内容的提问来源于stack exchange,提问作者German Vavilin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:27:10