gitlab流水線與k8s集群的連接,首先是通過gitlab-ci.yml文件中的命令,通過runner執行器實例運行對應的kubectl命令實現的。
那么runner執行器實例執行器如何執行kubectl命令,執行環境的配置,kubectl命令如何與k8s集群互認,以及從git push到k8s集群的運行,都需要逐步進行配置并確定連通性。
這個流程應當是:
IDE->gitlab->gitlab runner->shell->docker+kubectl->k8s集群
1.runner與k8s的連接
我們安裝gitlab runner肯定是為了構建自動化流水線的。現在考慮如何將自動化流水線與k8s相連接。
1.1 執行器實例機器kubectl安裝
首先我在gitlab runner的runner實例的執行器(我選的shell)運行的位置安裝kube,方便kubectl命令的執行。
- 下載。換google的官方源難以yum安裝,嘗試使用io提供的文件。
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
我是x86架構的centos7.4內核的系統,如上命令即可。如果是arm架構等其他情況,可以修改對應的位置。
下載后轉移到自己的PATH下即可。一般放到/usr/local/bin/
下就行。
為了保持學習的態度,我們可以通過echo $PATH
命令查看自己系統的PATH有哪些。他會返回一系列用:結尾的字符串,這些就是你的PATH地址。
2. 下一步,修改kubectl文件的可執行權限。
# 在kubectl存放的位置檢查一下權限
ls -la kubectl
# 可以看到只有所有者有讀寫權限。考慮到中標麒麟的權限管理嚴格,我計劃給所有用戶執行權限。
sudo chmod 711 kubectl
# 更改完后查詢權限
ls -la kubectl
# 可以看到執行權限被添加了
- 轉移到bin下
sudo mv kubectl /usr/local/bin/
- 驗證安裝成功
kubectl version --client#返回值為
Client Version: v1.34.0
Kustomize Version: v5.7.1
說明安裝成功了
1.2 測試gitlab能否正常連接kubectl
我們操作k8s執行的整個鏈條為:
- 通過IDE在本地編輯gitlab-ci.yml文件。
- 文件指導gitlab,通過文件中的tag和gitlab中注冊的runner實例tag匹配,選擇gitlab runner特定執行器執行相關命令。
- 執行器選擇使用shell
- shell命令使用kubectl命令
- kubectl按照IDE中編輯的deployment.yaml和service.yaml,將要執行的內容部署到K8S集群上
我需要確認gitlab-ci.yml能正常命令shell級別的kubectl能正常執行。既確認IDE到kubectl的連接。
首先修改gitlab-ci.yml內容為:
stages:- build- deployvariables:DOCKER_DRIVER: overlay2DOCKER_TLS_CERTDIR: ""build:stage: buildtags:- shellscript:- docker --versiondeploy:stage: deploytags:- shellscript:- kubectl version --client
之后進行commit和push。
之后前往gitlab->demo項目->構建->作業 下查看build和deploy是否正常反饋。
build里會看到Job succeeded的字樣:
# 省略一大段
$ docker --version
Docker version 17.03.2-ce,build f5ec1e2
Job succeeded
deploy里也會看到:
# 省略一大段
$ kubectl version --client
Client Version: v1.34.0
Kustomize Version: v5.7.1
Job succeeded
至此我可以確認IDE->gitlab->gitlab runner->shell->docker/kubectl是正常的。
1.3 將k8s集群與kubectl連接
在端口開通沒有障礙的情況下,直接在k8s節點復制config文件到kubectl運行的位置是最方便的,命令如下:
# 在k8s主節點執行
scp /etc/kubernetes/admin.conf 目標機器用戶名@IP地址:/etc/kubernetes/config
考慮到我這邊開通機器到機器的權限比較麻煩,我選擇手動復制。從k8s的master機器,或者通過kubephere手動拷貝config內容。
到了本地機器之后,在本地執行環境配置:
echo "export KUBECONFIG=/etc/kubernetes/config" >> ~/.bashrc
source ~/.bashrc
你的config文件存儲位置/etc/kubernetes/config
不是這個的話,記得進行修改。
測試一下能不能連接集群
kubectl get nodes
執行上述命令你會發現,哎他通不了
1.4 集群和本級策略開通
基于內網環境,各種端口默認是不能通信的,那么需要調查確定需要開通哪些權限。
1.4.1 開通端口的確認
k8s集群的kubernetes API server服務監聽端口需要確認。k8s默認監聽6443端口,進行API server。
受限網絡環境下,我申請到開通一個策略的時間代價是很長的,所以我傾向于先確認再后續操作。下面通過命令確認開通情況。
ps -ef | grep kube-apiserver | grep -E 'secure-port|bind-address'
正常情況你能在返回中看到–secure-port=6443
1.4.2 端口監聽情況確認
查看端口監聽情況是否正常
sudo netstat -tnlp | grep kube-apiserver
正常你會看到kube-apiserver監聽:::6443,就是監聽的6443端口,看到:::*,就是所有來源的都收。
1.4.3 開通策略
runner機器-》k8s master節點,需要開通all-〉6443
因為runner機器與k8s master節點通信的端口是隨機的。所以這一側應該是要開通all.
1.4.4 端口策略開通測試
通過telnet命令測試端口開通情況。
# 將100.100.100.100替換為你的k8s集群地址
telnet 100.100.100.100 6443
# 返回-》
Trying 100.100.100.100...
Connected to 100.100.100.100
Escape character is '^]'.
但是,在中標麒麟7.4里默認沒有telnent,我選擇從外部下載telnet之后安裝,包也很簡單,不需要額外下載依賴。
直接從能聯網的centos7.9機器使用yumdownloader --resolve telnet就可以下載到。怎么安裝和下載,可以參照我: gitlab安裝指導里面的部分進行。
1.5 為執行器指引配置文件位置
在gitlab-ci.yml中編輯一行variables
variables: # 告訴 Runner kubeconfig 在哪KUBECONFIG: "<to your config flie path>/config"
具體位置改成你存放config文件的位置。
1.6 集成連通性測試
gitlab-ci.yml中編輯一行kubectl get nodes。
之后執行推送。
到gitlab流水線中查看deploy階段情況。
能正常展示你的幾個節點的列表那就是和k8s集群通常起來了。