GitLab 是一個全球知名的一體化 DevOps 平臺,很多人都透過私有化部署 GitLab 來進行原始碼託管。極狐GitLab 是 GitLab 在中國的發行版,專門為中國程式設計師服務。可以一鍵式部署極狐GitLab。
資料
-
Kubernetes
-
高階配置
-
新增額外主機別名
-
Pod 的 DNS 配置
-
極狐GitLab Runner 的 Kubernetes 執行器
-
Docker 執行器
-
透過特權模式使用 Docker-in-Docker
-
極狐GitLab CI/CD Services
說明
- 極狐GitLab Runner 註冊到 極狐GitLab 的操作請參見上面章節中的 CentOS 安裝 GitLab Runner, 只需要將流水線的執行器設定成kubernetes即可,然後執行流水線,會出現問題,按照下方內容去解決
- 本文采用遇見什麼錯誤,增加對應的配置來介紹 GitLab Runner、Kubernetes 的配置
配置
-
執行流水線,出現問題
Using Kubernetes namespace: default ERROR: Preparation failed: getting Kubernetes config: invalid configuration: no configuration has been provided, try setting KUBERNETES_MASTER environment variable
原因:k8s地址未配置 修改檔案
vim /etc/gitlab-runner/config.toml
修改對應流水線的配置內容如下
[runners.kubernetes] # k8s 地址 host = "https://192.168.80.130:6443"
-
執行流水線,出現問題
ERROR: Job failed (system failure): prepare environment: setting up credentials: Post "https://192.168.61.139:6443/api/v1/namespaces/default/secrets": x509: certificate signed by unknown authority. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
原因:k8s證書未配置 修改檔案
vim /etc/gitlab-runner/config.toml
修改對應流水線的配置內容如下
[runners.kubernetes] # k8s 證書 ca_file = "/etc/kubernetes/pki/ca.crt"
-
執行流水線,出現問題
ERROR: Job failed (system failure): prepare environment: setting up credentials: secrets is forbidden: User "system:anonymous" cannot create resource "secrets" in API group "" in the namespace "default". Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
原因:k8s賬戶未配置 修改檔案
vim /etc/gitlab-runner/config.toml
修改對應流水線的配置內容如下
[runners.kubernetes] # service 賬戶配置 # 設定 服務授權的名稱 service_account = "gitlab-runner" bearer_token = "先隨便寫一個" bearer_token_overwrite_allowed = true
-
執行流水線,出現問題
ERROR: Job failed (system failure): prepare environment: setting up credentials: Unauthorized. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
原因:k8s憑證不正確,需要:建立名稱空間、建立角色、建立服務賬戶並授權名稱空間、建立服務賬戶在名稱空間的token 修改檔案
vim /etc/gitlab-runner/config.toml
修改對應流水線的配置內容如下
# 建立名稱空間 kubectl create namespace gitlab # 建立角色 gitlab-runner 前,要求名稱空間 gitlab 必須存在 cat > role.yaml << EOF apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: gitlab-runner namespace: gitlab rules: - apiGroups: ["*"] resources: ["pods"] verbs: ["list", "get", "watch", "create", "delete"] - apiGroups: ["*"] resources: ["pods/exec"] verbs: ["create"] - apiGroups: ["*"] resources: ["pods/log"] verbs: ["get"] - apiGroups: ["*"] resources: ["pods/attach"] verbs: ["list", "get", "create", "delete", "update"] - apiGroups: ["*"] resources: ["secrets"] verbs: ["list", "get", "create", "delete", "update"] - apiGroups: ["*"] resources: ["configmaps"] verbs: ["list", "get", "create", "delete", "update"] EOF cat role.yaml kubectl apply -f role.yaml # 名稱空間授權 kubectl create serviceaccount gitlab-runner -n gitlab # 建立使用者操作名稱空間的Token,指定有效時間,單位是秒,315360000s代表10年 kubectl create token gitlab-runner -n gitlab --duration=315360000s vim /etc/gitlab-runner/config.toml [runners.kubernetes] # service 賬戶配置 # 設定 服務授權的名稱 service_account = "gitlab-runner" bearer_token = "填寫上述生成的token"
-
執行流水線,出現問題
ERROR: Job failed (system failure): prepare environment: setting up credentials: secrets is forbidden: User "system:serviceaccount:gitlab:gitlab-runner" cannot create resource "secrets" in API group "" in the namespace "default". Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
原因:要設定上述建立的名稱空間 修改檔案
vim /etc/gitlab-runner/config.toml
修改對應流水線的配置內容如下
[runners.kubernetes] namespace = "gitlab"
-
執行流水線,出現問題
ERROR: Job failed (system failure): prepare environment: setting up credentials: secrets is forbidden: User "system:serviceaccount:gitlab:gitlab-runner" cannot create resource "secrets" in API group "" in the namespace "gitlab". Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
原因:建立角色繫結,將角色極狐gitlab-runner、名稱空間極狐gitlab設定服務賬戶gitlab:gitlab-runner並命名為極狐gitlab-runner
修改對應流水線的配置內容如下
kubectl create rolebinding gitlab-runner --namespace=gitlab --role=gitlab-runner --serviceaccount=gitlab:gitlab-runner
-
執行流水線,出現問題
WARNING: Failed to pull image with policy "": image pull failed: rpc error: code = Unknown desc = failed to pull and unpack image "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-7178588d": failed to resolve reference "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-7178588d": failed to do request: Head "https://registry.gitlab.com/v2/gitlab-org/gitlab-runner/gitlab-runner-helper/manifests/x86_64-7178588d": dial tcp 35.227.35.254:443: connect: connection refused ERROR: Job failed: prepare environment: waiting for pod running: pulling image "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-7178588d": image pull failed: rpc error: code = Unknown desc = failed to pull and unpack image "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-7178588d": failed to resolve reference "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-7178588d": failed to do request: Head "https://registry.gitlab.com/v2/gitlab-org/gitlab-runner/gitlab-runner-helper/manifests/x86_64-7178588d": dial tcp 35.227.35.254:443: connect: connection refused. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
原因:下載極狐gitlab-runner-helper失敗,需要手動上設定helper_image 修改檔案
vim /etc/gitlab-runner/config.toml
修改對應流水線的配置內容如下
# 選擇適合的gitlab-runner-helper版本 [runners.kubernetes] # helper_image="gitlab/gitlab-runner-helper:x86_64-${CI_RUNNER_REVISION}" # 由於 gitlab 將 gitlab-runner-helper 釋出到 hub.docker.com 的時間較慢,可以會用 bitnami/gitlab-runner-helper # 也可以使用 xuxiaoweicomcn/gitlab-runner-helper:所有映象均為 registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper 中拉取並上傳的,未做任何修改 # bitnami/gitlab-runner-helper:15.6.1 helper_image = "gitlab/gitlab-runner-helper:x86_64-v14.10.2"
-
執行流水線,出現問題
ERROR: Job failed (system failure): prepare environment: waiting for pod running: timed out waiting for pod to start. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
原因:建立 pod 時需要 helper_image,但是拉取超時,可手動拉取 helper_image;拉取流水線所用的映象超時,可手動拉取
# 執行過程可使用 kubectl -n gitlab describe pod pod的名稱,檢視狀態,pod的名稱可在流水線中看到 ctr -n=k8s.io image pull docker.io/gitlab/gitlab-runner-helper:x86_64-v14.10.2 # ctr -n=k8s.io image pull docker.io/bitnami/gitlab-runner-helper:15.6.1 # 也可以使用 xuxiaoweicomcn/gitlab-runner-helper:所有映象均為 registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper 中拉取並上傳的,未做任何修改 # 假如流水線使用的映象是 node:16.0.0 ctr -n=k8s.io image pull docker.io/node:16.0.0 ctr -n=k8s.io image list
-
如果要在 k8s 中使用 Docker,方案如下:
-
方案 1(不推薦): 在 k8s 各節點上安裝 docker,並設定 docker 開機,流水線執行時掛載
docker.sock
,需要在 GitLab Runner 中配置如下,詳情參見: 極狐GitLab Runner、Kubernetes(k8s)配置[[runners]] ... [runners.kubernetes] ... [runners.kubernetes.volumes] [[runners.kubernetes.volumes.host_path]] name = "docker" mount_path = "/var/run/docker.sock" host_path = "/var/run/docker.sock"
-
方案 2(推薦): 以特權身份執行流水線, 極狐GitLab CI/CD Services 中文文件, 需要在極狐 GitLab Runner 中配置如下:
[[runners]] ... [runners.kubernetes] ... privileged = true
使用 docker.sock 埠 示例
stages: # 階段名稱:構建 - build # job 名稱 build: # 階段名稱 stage: build # 環境變數 variables: # maven 環境變數 MAVEN_OPTS: >- -Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true # 顏色定義 COLOR_BLUE: \033[34m COLOR_GREEN: \033[92m COLOR_RED: \033[31m COLOR_RESET: \033[0m COLOR_YELLOW: \033[93m # 映象 image: maven:3.6.3-openjdk-17 # 使用的服務 # 如果是基於 k8s 執行流水線,請以特權身份執行(在 /etc/gitlab-runner/config.toml 中配置 privileged = true),否則無法使用 services # 由於要訪問域名 nexus.xuxiaowei.cn、pig.docker.xuxiaowei.cn,所以在 /etc/gitlab-runner/config.toml 中配置了對應的 runners.kubernetes.host_aliases services: # 使用 docker 服務,用於構建 docker 映象 - name: docker:dind # 服務別名 alias: docker-dind variables: # 關閉 TLS(僅使用 http) DOCKER_TLS_CERTDIR: "" # docker 映象釋出域名 pig.docker.xuxiaowei.cn(僅作者區域網可以訪問) # 預設情況下域名 pig.docker.xuxiaowei.cn 證書可能不受信任(可能是非權威機構頒發的證書,也可能是容器映象無法識別權威機構頒發的域名證書) # 信任域名證書 command: [ "--insecure-registry=pig.docker.xuxiaowei.cn" ] # 執行指令碼前的任務 before_script: # 此處使用 http 而非 https,因為 https 證書可能不受信任(可能是非權威機構頒發的證書,也可能是容器映象無法識別權威機構頒發的域名證書) # 下載的 settings-private.xml 配置檔案裡使用的也是 http 協議 - echo -e $COLOR_BLUE'下載作者 Maven 私庫配置檔案(僅作者區域網可用)'$COLOR_RESET && curl -o settings-private.xml http://nexus.xuxiaowei.cn/repository/raw-hosted/maven/settings-private.xml - echo -e $COLOR_BLUE'檢視作者 Maven 私庫配置檔案'$COLOR_RESET && cat settings-private.xml # 執行指令碼 script: - echo -e $COLOR_BLUE'使用作者 Maven 私庫配置檔案構建 jar 包'$COLOR_RESET && mvn clean -U install -s settings-private.xml - echo -e $COLOR_BLUE'將所有 *.xml 檔案中的 <image> <name> 標籤增加 CI_PIPELINE_ID 變數,CI_PIPELINE_ID 變數代表 流水線ID'$COLOR_RESET - find . -type f -name "*.xml" -exec sed -i 's|<name>${docker.registry}/${docker.namespace}/${project.name}:${project.version}</name>|<name>${docker.registry}/${docker.namespace}/${project.name}:${project.version}-${CI_PIPELINE_ID}</name>|g' {} + - echo -e $COLOR_BLUE'使用作者 Maven 私庫配置檔案構建 docker 映象'$COLOR_RESET && mvn -pl pig-auth docker:build -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD - echo -e $COLOR_BLUE'使用作者 Maven 私庫配置檔案構建 docker 映象'$COLOR_RESET && mvn -pl pig-auth docker:push -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD - echo -e $COLOR_BLUE'使用作者 Maven 私庫配置檔案構建 docker 映象'$COLOR_RESET && mvn -pl pig-gateway docker:build -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD - echo -e $COLOR_BLUE'使用作者 Maven 私庫配置檔案構建 docker 映象'$COLOR_RESET && mvn -pl pig-gateway docker:push -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD - echo -e $COLOR_BLUE'使用作者 Maven 私庫配置檔案構建 docker 映象'$COLOR_RESET && mvn -pl pig-upms/pig-upms-biz docker:build -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD - echo -e $COLOR_BLUE'使用作者 Maven 私庫配置檔案構建 docker 映象'$COLOR_RESET && mvn -pl pig-upms/pig-upms-biz docker:push -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD - echo -e $COLOR_BLUE'使用作者 Maven 私庫配置檔案構建 docker 映象'$COLOR_RESET && mvn -pl pig-visual/pig-codegen docker:build -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD - echo -e $COLOR_BLUE'使用作者 Maven 私庫配置檔案構建 docker 映象'$COLOR_RESET && mvn -pl pig-visual/pig-codegen docker:push -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD - echo -e $COLOR_BLUE'使用作者 Maven 私庫配置檔案構建 docker 映象'$COLOR_RESET && mvn -pl pig-visual/pig-monitor docker:build -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD - echo -e $COLOR_BLUE'使用作者 Maven 私庫配置檔案構建 docker 映象'$COLOR_RESET && mvn -pl pig-visual/pig-monitor docker:push -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD - echo -e $COLOR_BLUE'使用作者 Maven 私庫配置檔案構建 docker 映象'$COLOR_RESET && mvn -pl pig-visual/pig-quartz docker:build -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD - echo -e $COLOR_BLUE'使用作者 Maven 私庫配置檔案構建 docker 映象'$COLOR_RESET && mvn -pl pig-visual/pig-quartz docker:push -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD # 快取 cache: # 快取名稱 # 使用 job 名稱 key: "${CI_JOB_NAME}" # 快取路徑 paths: - .m2/repository # 流水線標籤:選擇可執行流水線的機器 tags: - plugin-kubernetes # 觸發條件:觸發流水線執行的條件 only: # 僅在 xuxiaowei/k8s 分支上執行 - xuxiaowei/k8s
-
問題
-
如果克隆映象時無法解析極狐 GitLab 的域名,可以在極狐 GitLab Runner 中自定義域名的IP(其他自定義域名同理)
vim /etc/gitlab-runner/config.toml
[[runners]] ... [runners.kubernetes] [[runners.kubernetes.host_aliases]] # 自定義 GitLab 的 IP ip = "192.168.80.14" hostnames = ["gitlab.example.com"] [[runners.kubernetes.host_aliases]] # 自定義 Docker host 的 IP ip = "192.168.80.33" hostnames = ["host.docker.example.xuxiaowei.cloud"] [[runners.kubernetes.host_aliases]] # 自定義 Docker 私庫的 IP ip = "192.168.80.45" hostnames = ["registry.docker.example.xuxiaowei.cloud"]
更多關於極狐GitLab 的最佳實踐,請搜尋關注【極狐GitLab】公眾號或者登入極狐GitLab 官網 https://gitlab.cn 進行學習。