解决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:
确认你的CA证书已存储在Kubernetes Secret中(可复用注册时用的Secret,或单独创建含
ca.crt的Secret)修改
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

