如何在k8s里安装gitlab-runner

2022/7/10 k8sDevops

这篇笔记是转载的我们组长写的 K8s 相关文章、仅用于个人学习。

# 新建命名空间

在你的集群下面新建一个命名空间: gitlab,下面所有的操作都在这个命名空间下

gitlab命名空间下,使用镜像  gitlab/gitlab-runner:latest 启动一个 pod, Deployment  的名字可以叫 gitlab-runner,副本数填 1 个就可以了

# 注册 runner

启动 pod 之后,进入 pod 对应的终端,我们需要在里面完成 runner register 操作.

进入 pod 终端之后,输入命令:

gitlab-runner register
1

然后根据提示,一步一步输入内容,其中让你填写 gitlab-ci token 的时候,需要到  https://gitlab.timetask.cn/admin/runners (opens new window)  这个页面去找,而不是在你的 gitlab 仓库里找。最后一步 executor 的类型填 kubernetes 就可以了。

完成之后,到  https://gitlab.timetask.cn/admin/runners (opens new window)  就能看到你刚刚注册的 runner 了

# 创建 service account

gitlab-runner 这个 pod,需要拥有开启新 pod,结束 pod 等更高权限的操作,所以我们必须创建一个 k8s 的 service account,给这个账号分配更高的权限,让 gitlab-runner 能利用这个账号完成它的操作.

进入集群管理器,随意在一个地方新建一个文件, service-account.yml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: gitlab-runner
  namespace: gitlab
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: gitlab-runner
  namespace: gitlab
rules:
  - apiGroups: [""]
    resources: ["*"]
    verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: gitlab-runner
  namespace: gitlab
subjects:
  - kind: ServiceAccount
    name: gitlab-runner
    namespace: gitlab
roleRef:
  kind: Role
  name: gitlab-runner
  apiGroup: rbac.authorization.k8s.io
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

然后使用命令行: kubectl apply -f service-account.yml  让配置生效

这个配置就是在 gitlab 命名空间下,新建一个名为 gitlab-runner  的 ServiceAccount,和一个名为 gitlab-runner  的角色,然后给这个角色分配所有权限,最后把这个角色和 ServiceAccount 绑定起来,让这个 ServiceAccount 拥有 Role 所对应的权限

# 新建配置项,重启 gitlab-runner pod

在注册完 runner 和生成了 service account 之后,需要给刚刚新建的 gitlab-runner Deployment 配置一些额外参数,让他能顺利工作

配置项名称: gitlab-runner-config
添加一个子配置项:config.toml
子配置项的内容是:

concurrent = 4
[[runners]]
name = "暗访者三号"
url = "https://gitlab.timetask.cn/"
token = "xxxxxxx"
executor = "kubernetes"
builds_dir = "/home/runner-build"
cache_dir = "/home/runner-cache"
[runners.kubernetes]
namespace = "gitlab"
privileged = true
image = "docker:stable"
service_account = "gitlab-runner"
1
2
3
4
5
6
7
8
9
10
11
12
13

配置项解释:
token 是你在最开始注册 runner 成功之后,gitlab 给你生成的 token,而不是你最开始注册 runner 的时候填的那个 token,注意不要搞错了
builds_dir 和 cache_dir 是用来缓存构建相关的文件的,这个地方,如果不挂载 NAS 之类的网盘,那么每次构建都会完全重 0 开始克隆代码,没有任何缓存可用,所以后面可以自己新建一个 NAS,然后把这个 NAS 给挂载到这两个文件夹下

然后重新修改 gitlab-runner 这个 Deployment 的配置文件:
把刚刚的配置项挂载到 /etc/gitlab-runner  文件夹下
然后把 spec.template.spec.serviceAccountName  的值设置为 gitlab-runner (这一步别忽略了)
然后重启 Deployment
一个完整的 gitlab-runner Deployment 的配置项类似下面:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "2"
  creationTimestamp: "2019-07-11T03:51:41Z"
  generation: 2
  labels:
    app: gitlab-runner
  name: gitlab-runner
  namespace: gitlab
  resourceVersion: "32793356"
  selfLink: /apis/apps/v1beta2/namespaces/gitlab/deployments/gitlab-runner
  uid: 3110b6d9-a38f-11e9-a804-00163e13ab0b
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: gitlab-runner
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: gitlab-runner
    spec:
      containers:
        - image: "gitlab/gitlab-runner:latest"
          imagePullPolicy: Always
          name: gitlab-runner
          resources:
            requests:
              cpu: 250m
              memory: 512Mi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /etc/gitlab-runner
              name: volume-1562819980384
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccountName: gitlab-runner
      terminationGracePeriodSeconds: 30
      volumes:
        - configMap:
            defaultMode: 420
            name: gitlab-runner-config
          name: volume-1562819980384
status:
  availableReplicas: 1
  conditions:
    - lastTransitionTime: "2019-07-11T03:52:10Z"
      lastUpdateTime: "2019-07-11T03:52:10Z"
      message: Deployment has minimum availability.
      reason: MinimumReplicasAvailable
      status: "True"
      type: Available
    - lastTransitionTime: "2019-07-11T03:51:41Z"
      lastUpdateTime: "2019-07-11T04:39:58Z"
      message: ReplicaSet "gitlab-runner-6746755594" has successfully progressed.
      reason: NewReplicaSetAvailable
      status: "True"
      type: Progressing
  observedGeneration: 2
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74

至此,整个 runner 就在 k8s 里建好了

# 在 gitlab 里试一下

新建一个仓库,然后在 runner 管理中心,把这个仓库加到刚刚新建的 runner 里,这样这个仓库就能使用这个 runner 进行构建了

clone 这个仓库到本地,然后添加 .gitlab-ci.yml  文件,内容为:

image: node:10.15.0

before_script:
  - echo hello_world

stages:
  - test

job test:
  stage: test
  script:
    - echo test
1
2
3
4
5
6
7
8
9
10
11
12

提交之后,在这个仓库的 ci 里就能开始构建了
image.png

Last Updated: 2022/8/30 下午6:11:52