背景
在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,修改其中的registry
和image
字段为自己的本地仓库即可。
另外可以看到这里使用的镜像的默认Tag是alpine-v{{.Chart.AppVersion}}
,AppVersion
指的是这个Runner的Chart对应的GltLab的版本,使用命令helm list -n <dst_namespace>
即可查看。在同步镜像到你的本地仓库的时候要注意Tag不要写错。当然你要修改为自己定义的Tag也不是不行。
这里插一嘴,相应的,使用Helm Chart安装Runner时也要选择好可用的版本,一般选择兼容的最高版本。例如,我目前使用的是GitLab CE 16.11.10版本,那么我安装的就是兼容此GitLab版本的最高版本Runner Chart。
添加好GitLab的Helm仓库后,使用helm search repo gitlab-runner --versions
命令即可查看所有版本。
Runner基础作业容器
Runner基础作业容器是执行CI/CD的主要容器。(来自ChatGPT)
默认Docker Registry镜像:alpine:latest
我们同样来到上述values.yaml处。修改runners.config
中的runners.kubernetes.image
,改为自己的本地镜像地址即可。
Runner Helper
Runner Helper是辅助容器,用于执行GitLab CI/CD作业的辅助任务,比如文件上传下载、执行脚本等。(来自ChatGPT)
官方镜像地址:registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-v<AppVersion>
还是在上述values.yaml的runners.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
Comments NOTHING