介绍
本文主要介绍如何在 kubernetes 中安装 Gitlab Runner , 在开始之前假设您T已经拥有了一个 Kubernetes Cluster。Kubernets 应用管理工具我这里选择 Helm 版本是 V3 ,您必须使用与 Gitlab 相对应版本的 Gitlab Runner 。防止因版本不一致导致奇奇怪怪的问题。
- Gitlab (16.1.0)
- Minio
- Docker
Runner 使用范围
全局共享
适用于所有群组和项目
群组共享
用于群组中的所有项目和子组
特定项目
只能用于特定的项目仓库
全局共享一般由仓库管理员实现注册并提供给所有的项目组使用。群组共享一般由群组管理员提供。特定项目由该项目的管理员创建。其实三种方式的区别就是权限的不同而已。本质都是提供 Runner 来运行 pipeline。默认情况下Gitlab已经为每个项目启用了Runner功能。
安装Runner
因为我的机器是 ARM 构架的。所以部署的镜像都是基于 Arm 的。并且我使用的命名空间为 kube-ops
,
添加 Runner 仓库地址
helm repo add gitlab https://charts.gitlab.io
更新仓库地址
helm repo update gitlab
查看历史版本列表
helm search repo -l gitlab/gitlab-runner
修改配置项
# 把 helm 包中 values.yaml 生成后放到本地
helm show values gitlab/gitlab-runner > values.yaml
创建ConfigMap
配置项里使用了 Minio 做构建的缓存的储存。点我查看Minio 的安装及配置请参,同时还使用了 docker , 这样的配置我们也可以使用 docker-in-docker 的方式构建。daemon.json
{
"registry-mirrors": [
"https://dockerproxy.com",
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.m.daocloud.io",
"http://hub-mirrors.c.163.com"
],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"data-root": "/var/lib/docker",
"exec-opts": [
"native.cgroupdriver=systemd"
]
}
创建 docker-daemon
configmap
kubectl create configmap docker-daemon --namespace kube-ops --from-file /etc/docker/daemon.json
配置里还有 docker-client-config
的 configmap, 这个配置是给 Docker push image 的时候使用, 映射config.json
如下
{
"auths": {
"https://your.harbor.domain": {
"username": "robot$gitlab",
"password": "You Harbor Roboot Password"
}
}
}
创建 docker-client-config
configmap
kubectl create configmap docker-client-config --namespace kube-ops --from-file config.json
配置里还有 kaniko-client-config
的 configmap, 这个配置是给 kaniko push image 的时候使用, 映射config.json
如下
{
"auths": {
"https://your.harbor.domain": {
"username": "robot$gitlab",
"password": "You Harbor Roboot Password"
}
}
}
kubectl create configmap kaniko-client-config --namespace kube-ops --from-file config.json
看到这里是不是有点迷糊呢。其实配置这么多主要是考虑到在进行构建的时候可以使用多种构建方式。
- Docker- In- Docker 简称 Dind
- kaniko 构建。
我主要使用 kaniko 来进行构建,它有如下几个好处。
- 不依赖于 docker ,kubernetes 在 1.24+ 后默认使用 containerd 。如果想使用 docker 进行构建的话还需要把 docker.sock 挂载到pod 中。
- 不需要特权模式。使用docker in docker 是需要特权模式的。
- 构建的性能比 Docker in Docker 的好。
缺点:
- 构建时间久。不知道是我网络的原因还是机器性能的原因。每次构建都要花好几分钟。即使使用了缓存也需要一两分钟。没有极致的体验。猜想如果有好的机器的话应该会快一些吧。
RBAC
由于Runner默认账号为 default
,我在实例测试的时候不管怎么更改配置里账号都不生效,没办法只能给 default
账号最高权限了,生产环境可不能这么做,学习使用的话,我只想快速实现从构建到部署的过程。 创建 rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: kube-ops
name: gitlab-runner
rules:
- apiGroups: [""]
resources:
- services
- deployments
verbs: ["*"]
- apiGroups:
- extensions
- networking.k8s.io
resources:
- ingresses
- ingressclasses
verbs: ["*"]
- apiGroups:
- extensions
- networking.k8s.io
resources:
- ingresses/status
verbs:
- update
- apiGroups:
- traefik.io
- traefik.containo.us
resources:
- middlewares
- middlewaretcps
- ingressroutes
- traefikservices
- ingressroutetcps
- ingressrouteudps
- tlsoptions
- tlsstores
- serverstransports
verbs: ["*"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: gitlab-ci
namespace: kube-ops
subjects:
- kind: ServiceAccount
name: default
namespace: kube-ops
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
获取 runnerRegistrationToken
,此示例中我将使用全局的 Runner 。其它的都是类似的操作。具体操作如下:
依次点击左侧菜单 Admin Area -> Runners
打开Runners 列表页面。然后点击 New instance runner
创建一个新Runner
点击Create Runner
修改 values.yaml
如下配置
gitlabUrl: 'https://xxx.your.domain/'
runnerRegistrationToken: 'xxxxx'
unregisterRunners: true
concurrent: 10
checkInterval: 30
rbac:
create: true
clusterWideAccess: true
serviceAccountName: gitlab-runner
runners: # 下面配置 minio 作为 GitLab Runner 共享缓存的 s3 替换方案,minio 具体配置参考下文
config: |
concurrent = 4
[[runners]]
name = "kubernetes executor runner"
executor = "kubernetes"
log_format = "json"
environment = ["DOCKER_DRIVER=overlay2","DOCKER_HOST=tcp://docker:2376","DOCKER_TLS_CERTDIR=/certs","DOCKER_TLS_VERIFY=1","DOCKER_CERT_PATH=$DOCKER_TLS_CERTDIR/client"]
[runners.docker]
image = "docker:24.0.5"
privileged = true
disable_cache = false
volumes = ["/certs/client", "/cache"]
tls_verify = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
[runners.cache]
Type = "s3"
Shared = true
[runners.cache.s3]
AccessKey = "Your Access Key"
SecretKey = "Your Secret Key"
BucketName = "gitlab"
ServerAddress = "You minio domain"
[runners.kubernetes]
namespace = "{{.Release.Namespace}}"
image = "ubuntu:20.04"
helper_image = "gitlab/gitlab-runner-helper:arm64-latest"
privileged = true
poll_interval = 5
poll_timeout = 3600
[[runners.kubernetes.services]]
name = "docker:24.0.5-dind"
command = ["--registry-mirror", "https://dockerproxy.com"]
[[runners.kubernetes.volumes.config_map]]
name = "docker-daemon"
mount_path = "/etc/docker/daemon.json"
sub_path = "daemon.json"
[[runners.kubernetes.volumes.config_map]]
name = "docker-client-config"
mount_path = "/root/.docker/config.json"
sub_path = "config.json"
[[runners.kubernetes.volumes.config_map]]
name = "kaniko-client-config"
mount_path = "/kaniko/.docker/config.json"
sub_path = "config.json"
[[runners.kubernetes.volumes.empty_dir]]
name = "docker-certs"
mount_path = "/certs/client"
medium = "Memory"
部署 GitLab Runner
使用以下命令部署
helm install -f ./values-docker.yaml gitlab-runner-docker gitlab/gitlab-runner --namespace kube-ops --version 0.55.0
查看部署状态
helm status -n kube-ops gitlab-runner-k8s
# OutPut:
NAME: gitlab-runner-k8s
LAST DEPLOYED: Tue Sep 5 17:46:38 2023
NAMESPACE: kube-ops
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Your GitLab Runner should now be registered against the GitLab instance reachable at: "https://git.cmoee.com/"
Runner namespace "kube-ops" was found in runners.config template.
稍等一会等待Pod创建,回到 Runners 查看此时Runner已经上线了。接下来就可以进行 ci / cd 的学习了。