Serverless Kubernetes 讓您無需管理和維護集羣與服務器,便可快速建立 Kuberentes 容器應用,而且根據應用實際使用的 CPU 和內存資源量進行按需付費。使用 Serverless Kubernetes,您能夠專一於設計和構建應用程序,而不是管理運行應用程序的基礎設施。充分結合了虛擬化資源帶來的安全性、彈性和 Kubernetes 生態。html
由此定位,這種集羣是很適合用來跑 CI 流程場景的。CI 觸發時建立對應資源,CI 結束後銷燬對應的資源。目前 Serverless Kubernetes 或多或少有一些不友好的體驗,好比:git
CoreDNS
/Kube-DNS
配置。docker-in-docker
方式構建鏡像。在項目的 settings/ci_cd
頁面,或者管理員的 /admin/runners
頁面均可以找到 token
。token
是 Runner 註冊的憑證。若是是從項目獲取的 token
,那麼這個 Runner 屬於此項目,能夠經過配置容許其餘項目也可使用。若是是從管理員頁面獲取的 token
,那麼這個 Runner,全部項目可見,均可以使用,即共享 Runner。github
下面以共享的 Runner 爲例:docker
須要獲取圖中模糊處理的兩個參數:api
https://gitlab.example.choerodon.io
XXXXXXXXXXXXXXXXXXX
運行 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
執行完上述操做記錄 [[runners]]
域下的 token
:服務器
**********************
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
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......
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
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配置是爲了讓集羣內部應用不經過公網訪問同一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
Deleting filesystem...
操做,致使執行完kaniko後不能再執行其餘命令,在CI中能夠再分出一個stage
來規避這個問題。本篇文章出自 Choerodon豬齒魚社區鍾梓凌。