在 gitlab 的 Amin Area 頁面,打開側邊欄的 Kubernetes ,點擊 Integrate with a cluster certificates,選擇 Connect existing cluster,輸入以下信息
- Kubernetes cluster name:輸入集群名稱
cnblogs-production
- API URL:通過
kubectl cluster-info
命令查看 api 地址,我們這里是https://k8s-api:6443
- CA Certificate: 通過下面的命令獲取證書
kubectl get secret \
$(kubectl get secrets | grep default-token | awk '{print $1}') \
-o jsonpath="{['data']['ca\.crt']}" | base64 --decode
- Service Token:通過以下步驟拿到 service token
- 創建名為 gitlab 的 service account:
kubectl create serviceaccount gitlab -n kube-system
- 將 gitlab service account 加入到 cluster-admin 角色:
kubectl create clusterrolebinding gitlab-cluster-admin --clusterrole=cluster-admin --serviceaccount=default:gitlab -n kube-system
(注:這個命令中 serviceaccount 參數寫錯了,不是default:gitlab
,應該是kube-system:gitlab
) - 拿 service token:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep gitlab | awk '{print $1}')
- 創建名為 gitlab 的 service account:
然后點擊 "Add Kubernetes cluster" 按鈕進行提交,提交時報錯:
is blocked: Requests to the local network are not allowed
報錯解決方法:在 Admin Area -> Settings -> Network 中選中 "Allow requests to the local network from web hooks and services" 並保存。
再次提交成功。
在 gitlab 服務器的 hosts 文件中添加 api url 用到的主機名 k8s-api 的解析(我們搭建的是高可用集群,所以這里用的是自定義主機名)。
配置完成,gitlab 卻連不上 k8s 集群。

登錄到 gitlab 服務器,將之前拿到的證書保存到 ca.crt 文件,用下面的 curl 命令請求 api
curl --cacert ca.crt -H "Authorization: Bearer <service token>" https://k8s-api:6443/api/v1/namespaces/production/pods
返回的是 403 錯誤
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "pods is forbidden: User \"system:serviceaccount:kube-system:gitlab\" cannot list resource \"pods\" in API group \"\" in the namespace \"production\"",
"reason": "Forbidden",
"details": {
"kind": "pods"
},
"code": 403
}
通過上面的錯誤信息找到了線索,請求 api 時使用的 service account 是 kube-system:gitlab
,但我們創建 ClusterRoleBinding 時用的是 --serviceaccount=default:gitlab
,命名空間弄錯了,通過下面的命令編輯 ClusterRoleBinding 配置文件,更正命名空間后問題就解決了。
kubectl edit clusterrolebinding gitlab-cluster-admin -n kube-system
gitlab 連接 k8s 集群成功!

參考資料: