在 Serverless kubernetes 集羣中運行 Gitlab Runner

背景

Serverless Kubernetes 讓您無需管理和維護集羣與服務器,便可快速建立 Kuberentes 容器應用,而且根據應用實際使用的 CPU 和內存資源量進行按需付費。使用 Serverless Kubernetes,您能夠專一於設計和構建應用程序,而不是管理運行應用程序的基礎設施。充分結合了虛擬化資源帶來的安全性、彈性和 Kubernetes 生態。html

由此定位,這種集羣是很適合用來跑 CI 流程場景的。CI 觸發時建立對應資源,CI 結束後銷燬對應的資源。目前 Serverless Kubernetes 或多或少有一些不友好的體驗,好比:git

  • 不能自定義 CoreDNS/Kube-DNS 配置。
  • 不能使用 docker-in-docker 方式構建鏡像。

需求資源

  • NAS 存儲
  • Serverless Kubernetes 集羣

部署

註冊 Runner

獲取 registration token

在項目的 settings/ci_cd 頁面,或者管理員的 /admin/runners 頁面均可以找到 tokentoken 是 Runner 註冊的憑證。若是是從項目獲取的 token,那麼這個 Runner 屬於此項目,能夠經過配置容許其餘項目也可使用。若是是從管理員頁面獲取的 token ,那麼這個 Runner,全部項目可見,均可以使用,即共享 Runner。github

下面以共享的 Runner 爲例:docker

image

須要獲取圖中模糊處理的兩個參數:api

  • URL: https://gitlab.example.choerodon.io
  • Registration token: XXXXXXXXXXXXXXXXXXX

註冊 Runner

  • 運行 Runner,進入容器緩存

    docker run -it --rm --entrypoint=bash dockerhub.azk8s.cn/gitlab/gitlab-runner:alpine-v11.8.0
  • 進行註冊安全

    gitlab-runner register
  • 註冊成功後查看生成的tokenbash

    cat /etc/gitlab-runner/config.toml

image

執行完上述操做記錄 [[runners]] 域下的 token服務器

  • token: **********************

部署 Runner

  • 建立緩存掛載PV/PVC配置文件:cache.yaml (若不須要緩存掛載,請跳過此步驟)
    PS: 若需掛載多個目錄,請按實際狀況建立PV、PVC
apiVersion: v1
kind: PersistentVolume
metadata:
  name: runner-cache-pv
  spec:
    accessModes:
   - ReadWriteMany
    capacity:
      storage: 100Gi
    mountOptions:
   - nolock,tcp,noresvport
   - vers=3
    nfs:
     path: /cache
     server: abcde.cn-shanghai.nas.example.choerodon.io
    ---
    apiVersion: v1
  kind: PersistentVolumeClaim
  metadata:
    name: runner-cache-pvc
  spec:
    accessModes:
    - ReadWriteMany
    resources:
      requests:
        storage: 100Gi
    volumeName: runner-cache-pv
  • 在觸發 CI 流程時,Runner 會在 Kubenertes 集羣中建立對應的 Pod 執行任務,故須要集羣權限,複製 kubeconfig 文件中的信息,將對應值粘貼到對應字段建立 Secret,這裏再也不累述。最後 Runner 引用到這個 Secret 用以認證,編寫文件serverless-runner-kubeconfig.yaml
apiVersion: v1
  kind: Secret
  metadata:
    name: serverless-runner-kubeconfig
  type: kubernetes.io/tls
  data:
    ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUq......
    tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR......
    tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQp......
  • 編寫 Runner 配置文件:serverless-runner-config.yaml
apiVersion: v1
  kind: ConfigMap
  metadata:
    name: serverless-runner-config
  data:
    config.toml: |
      # 可同時併發執行任務的數量
      concurrent = 10
      check_interval = 0
      [[runners]]
        name = "runner"
        url = "https://gitlab.example.choerodon.io"
        # [[runners]] 域下的 token
        token = "**********************"
        executor = "kubernetes"
        # 日誌大小限制
        output_limit = 51200
        # 經常使用固定環境變量
        environment = ["CHOERODON_URL=http://api.example.choerodon.io",
                       "SONAR_URL=http://sonarqube.example.choerodon.io"]
        [runners.kubernetes]
          # kubeconfig 文件中的 apiserver 訪問地址
          host = "https://abcde.serverless-1.kubernetes.cn-shanghai.example.choerodon.io:6443"
          # 對應上面建立的 Secret
          cert_file = "/etc/gitlab-runner/tls.crt"
          key_file = "/etc/gitlab-runner/tls.crt"
          ca_file = "/etc/gitlab-runner/ca.crt"
          namespace = "default"
          pull_policy = "always"
          # 因爲 Serverless Kubernetes 使用有規格約束,故在 Pod 資源申請與限制應按相應規格進行設置,本例爲 4c8g
          cpu_limit = "3750m"
          cpu_request = "3750m"
          memory_limit = "7680Mi"
          memory_request = "7680Mi"
          helper_cpu_limit = "250m"
          helper_cpu_request = "250m"
          helper_memory_limit = "512Mi"
          helper_memory_request  = "512Mi"
          helper_image = "dockerhub.azk8s.cn/gitlab/gitlab-runner-helper:x86_64-4745a6f3"
          [runners.kubernetes.pod_annotations]
            # 未購買 snat 可掛載 eip 使得 CI Job 能夠訪問公網資源,例如阿里雲使用如下 annotation
            # "k8s.aliyun.com/eci-with-eip" = "true"
          [runners.kubernetes.volumes]
            # 掛載緩存目錄(可選)
            [[runners.kubernetes.volumes.pvc]]
              name = "runner-cache-pvc"
              mount_path = "/cache"
              readonly = false
            # [[runners.kubernetes.volumes.pvc]]
            #   name = "runner-maven-pvc"
            #   mount_path = "/root/.m2"
            #   readonly = false
  • 編寫 Runner manifest 文件:serverless-runner.yaml
apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: serverless-runner
  spec:
    selector:
      matchLabels:
        app: gitlab-runner
    template:
      metadata:
        labels:
          app: gitlab-runner
      spec:
        containers:
        - image: dockerhub.azk8s.cn/gitlab/gitlab-runner:alpine-v11.8.0
          imagePullPolicy: IfNotPresent
          name: runner-gitlab
          volumeMounts:
          - mountPath: /etc/gitlab-runner
            name: config
        volumes:
        - name: config
          projected:
            defaultMode: 420
            sources:
            - secret:
                items:
                - key: ca.crt
                  path: ca.crt
                - key: tls.crt
                  path: tls.crt
                - key: tls.key
                  path: tls.key
                name: serverless-runner-kubeconfig
            - configMap:
                items:
                - key: config.toml
                  path: config.toml
                name: serverless-runner-config
  • 應用配置併發

    • 建立PV/PVC (可選)

      kubectl apply -f cache.yaml
    • 應用 Runner

      kubectl apply -f serverless-runner-kubeconfig.yaml -f serverless-runner-config.yaml -f serverless-runner.yaml

不能自定義CoreDNS/Kube-DNS配置

自定義CoreDNS/Kube-DNS配置是爲了讓集羣內部應用不經過公網訪問同一VPC下的其餘應用直接經過內網便可,好比Gitlab,Harbor等。

例如阿里雲官方提供的解決方案是使用privateZone,其餘雲廠商也有相似的雲產品。

不能使用 docker-in-docker 方式構建鏡像

使用kaniko進行鏡像構建,這裏咱們將官方鏡像中的可執行文件複製到本身的CI鏡像中便可使用,Dockerfile以下。

FROM gcr.azk8s.cn/kaniko-project/executor:v0.18.0 AS kaniko
FROM registry.cn-shanghai.aliyuncs.com/c7n/cibase:0.9.1
COPY --from=kaniko /kaniko/executor /usr/bin/kaniko

這是有build好可直接使用的鏡像:

registry.cn-shanghai.aliyuncs.com/c7n/cibase:0.10.0
  • 待友好解決的問題:執行kaniko後會出現Deleting filesystem...操做,致使執行完kaniko後不能再執行其餘命令,在CI中能夠再分出一個stage來規避這個問題。
本篇文章出自 Choerodon豬齒魚社區鍾梓凌。
相關文章
相關標籤/搜索