如何在k8s(kubernetes)里安装gitlab-runner

2,232 阅读4分钟

新建命名空间

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

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

注册runner

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

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

gitlab-runner register

然后根据提示,一步一步输入内容

在填写gitlab-ci token的时候,需要注意:

  • 如果是新建一个共享型runner,也即多个仓库可以共用的runner,需要到 https://your-gitlab-domain/admin/runners 这个页面去找token
  • 如果是新建某个仓库自己的runner,可以在项目设置页面的CI/CD里去找

最后一步executor的类型填kubernetes就可以了

完成之后,到 https://your-gitlab-domain/admin/runners 就能看到你刚刚注册的runner了,以及这个runner的token(下面会用到)

创建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

然后使用命令行: 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 = "gitlab-runner"
  url = "https://your-gitlab-domain/"
  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"

配置项解释:

  • 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

至此,整个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

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