Gitlab Runner 安装

如何在 kubernetes 中安装 Gitlab Runner

Posted by Brian on Friday, September 8, 2023

介绍

本文主要介绍如何在 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

image-20230915180745309

点击Create Runner

image-20230915180843532

修改 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 的学习了。

image-20230915182645772