背景

在k8s中使用Helm Chart部署的GitLab Runner,拉取镜像时默认使用海外的GitLab Registry和Docker Registry。

由于集群经常拉取Docker Registry镜像,容易被Docker Registry限制拉取频率。再加上容易出现网络波动,GitLab Runner拉取镜像时有很大概率失败,提高了CI的失败频率,强迫症狂怒。

为了避免上述问题,我自建了本地镜像仓库以减小在海外拉取镜像的频率。建好本地仓库,同步好镜像之后还需要修改GitLab Runner配置,让它使用本地的镜像。然而在查询文档的过程中发现GitLab官方的文档非常混乱,找到正确的配置选项费了一番功夫,看来没怎么维护。不由地联想到前段时间GitLab卖身,感觉GitLab有点危险了……

配置

为了将GitLab Runner所需的镜像全部本地化,需要修改三个镜像的地址。

Runner的守护Pod

守护Pod会一直运行,轮询有没有可用的Job需要被执行,并且在得到可执行Job时负责调度和管理工作Pod。

官方镜像地址:registry.gitlab.com/gitlab-org/gitlab-runner:alpine-v<AppVersion>

GitLab.org / charts / GitLab Runner · GitLab可以找到官方的GitLab Runner Helm Chart。查看values.yaml可以找到image字段,这里配置的是Runner的守护Pod,修改其中的registryimage字段为自己的本地仓库即可。

image.png

另外可以看到这里使用的镜像的默认Tag是alpine-v{{.Chart.AppVersion}}AppVersion指的是这个Runner的Chart对应的GltLab的版本,使用命令helm list -n <dst_namespace>即可查看。在同步镜像到你的本地仓库的时候要注意Tag不要写错。当然你要修改为自己定义的Tag也不是不行。

image.png

这里插一嘴,相应的,使用Helm Chart安装Runner时也要选择好可用的版本,一般选择兼容的最高版本。例如,我目前使用的是GitLab CE 16.11.10版本,那么我安装的就是兼容此GitLab版本的最高版本Runner Chart。
添加好GitLab的Helm仓库后,使用helm search repo gitlab-runner --versions命令即可查看所有版本。

image.png

Runner基础作业容器

Runner基础作业容器是执行CI/CD的主要容器。(来自ChatGPT)

默认Docker Registry镜像:alpine:latest

我们同样来到上述values.yaml处。修改runners.config中的runners.kubernetes.image,改为自己的本地镜像地址即可。

image.png

Runner Helper

Runner Helper是辅助容器,用于执行GitLab CI/CD作业的辅助任务,比如文件上传下载、执行脚本等。(来自ChatGPT)

官方镜像地址:registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-v<AppVersion>

还是在上述values.yamlrunners.config中的runners.kubernetes处,添加一个字段helper_image(与image字段并列),填入自己的本地镜像地址即可。

配置展示

这里贴出我自己的Runner的Chart Values供参考:

image:
  registry: reg.mikumikumi.xyz
  image: mirror/gitlab-runner
  tag: alpine-v{{.Chart.AppVersion}}

checkInterval: 10
concurrent: 4
gitlabUrl: https://gitlab.mikumikumi.xyz
rbac:
  clusterWideAccess: false
  create: true
  rules:
  - resources:
    - pods
    - pods/attach
    - pods/exec
    - secrets
    - configmaps
    - services
    - events
  - verbs:
    - get
    - list
    - watch
    - create
    - patch
    - delete
    - update
  serviceAccountName: gitlab-runner
resources:
  limits:
    cpu: 3000m
    ephemeral-storage: 1024Mi
    memory: 1024Mi
runnerToken: <secret>
runners:
  config: |
    [[runners]]
      cache_dir = "/cache"
      [runners.kubernetes]
        namespace = "{{.Release.Namespace}}"
        image = "reg.mikumikumi.xyz/mirror/alpine:latest"
        helper_image = "reg.mikumikumi.xyz/mirror/gitlab-runner/gitlab-runner-helper:x86_64-v{{.Chart.AppVersion}}"
        pull_policy = "if-not-present"
          [[runners.kubernetes.volumes.pvc]]
            name = "gitlab-runner-cache"
            mount_path = "/cache"
  privileged: false
securityContext:
  allowPrivilegeEscalation: false
  capabilities:
    drop:
    - ALL
  privileged: false
  readOnlyRootFilesystem: false
  runAsNonRoot: true
volumeMounts:
- mountPath: /cache
  name: cache
volumes:
- name: cache
  persistentVolumeClaim:
    claimName: gitlab-runner-cache