我們昨天透過 AWS/EKS 建置了雲端的 Kubernetes 環境,接下來幾天會來介紹如何使用 GitLab CI 來建置 CI/CD pipeline,會用最簡單的 push 模式來實現 GitOps。
push 優點就是容易實現,但同步性較低,故 GitOps 主流的實踐方式仍是 pull 模式,會需要介紹額外組件,如 Argo CD, Flux CD,後面有篇幅在介紹。
途中有兩個主要 GitLab Repo 分別負責
Application Repo
:儲存應用程序原始碼,當原始碼調整要發布時,需透過此 Repo 觸發 CI pipeline,進行編譯跟 build image。
Manifest Repo
:儲存所有 Kubernetes 組件的 manifest file(yaml)。要異動 Kubernetes 時,需調整此 Repo 中的檔案後,觸發該 CD pipeline 透過 kubectl
deploy 至 Kubernetes。
"Application Repo 與 Manifest Repo 並不是專有名詞,只是筆者習慣的稱呼"
接下來會分為幾個階段來完成這套流程
Manifest Repo
與 gitlab-ci.yml
Application Repo
與 gitlab-ci.yml
GitLab agent 是運行在 Kubernetes cluster 中的服務,他可以用來執行 CI/CD 等任務自動化任務。
使用 GitLab agent 的好處是不需要將 Kubernetes 的連線資訊與憑證(如: kubeconfig)儲存在外部系統,就能對 Kubernetes 進行部署或操作,比一般的 GitLab runner 更安全,降低 kubeconfig 洩漏的風險。
kubeconfig 洩漏可能導致攻擊者能直接操作你的 Kubernetes cluster
建立 agent configuration file
在 repo 中預設分支(main or master),建立一個檔案 config.yaml
,檔案位置如下
.gitlab/agents/<agent-name>/config.yaml
<agent-name>
改為你想要的 agent 名稱
比如我的 agent 名稱為 eks-ithome-demo
,檔案位置則如下圖
授權 agent 能存取此 git project
編輯上一步的 config.yaml
,並填寫以下內容
ci_access:
groups:
- id: <path/to/group/subgroup>
<path/to/group/subgroup>
請改為你 GitLab project 的路徑。
例如我的 Project name 為 cicd-playground
,放置於 ithome2 Group,我的 config.yaml
內容如下
註冊 GitLab agent
於 GitLab project 中點選左側選單/Operate/Kubernetes clusters。
點選 Connect a cluster
選擇 agent configuration file,並點選 Register
這裡的名稱應該會跟 第一步-"建立 agent configuration file" 時,你配置的名稱一樣。
Install using Helm (recommended)
下方的指令內容複製下來。安裝 Gitlab agent 到 EKS Cluster,
先確認 kubectl 現在連的是 EKS
$ kubectl config current-context
luciferstut@ithome-demo.ap-northeast-1.eksctl.io
$ kubectl get node
NAME STATUS ROLES AGE VERSION
ip-192-168-6-52.ap-northeast-1.compute.internal Ready <none> 13h v1.25.12-eks-8ccc7ba
執行先前複製的 helm 指令
helm repo add gitlab https://charts.gitlab.io
helm repo update
helm upgrade --install eks-ithome-demo gitlab/gitlab-agent \
--namespace gitlab-agent-eks-ithome-demo \
--create-namespace \
--set image.tag=v16.4.0 \
--set config.token=glagent-AQ4CNs6enzZEvXNE6***************** \
--set config.kasAddress=wss://kas.gitlab.com
執行完成後,檢查是否安裝完成
$ kubectl get pod -n gitlab-agent-eks-ithome-demo
NAME READY STATUS RESTARTS AGE
eks-ithome-demo-gitlab-agent-v1-769c98c749-62xmx 1/1 Running 0 83s
eks-ithome-demo-gitlab-agent-v1-769c98c749-bcbj2 1/1 Running 0 94s
若能看到運行了兩個 GitLab Agent 的 Pod 在 EKS Cluster 中,就代表已經安裝成功了
.gitlab-ci.yml
,並填入以下內容
deploy:
image:
name: bitnami/kubectl:latest
entrypoint: ['']
script:
- kubectl config get-contexts
- kubectl config use-context <path/to/group/subgroup>:<agent-name>
- kubectl get pods
<path/to/group/subgroup>
: 改為 config.yaml
檔案中 ci_access.groups.id
的值<agent-name>
: 改為 config.yaml
上層目錄的名稱
.gitlab/agents/<agent-name>/config.yaml
這個腳本內容,會嘗試查詢 Kubernetes default namespace 的 Pod。deploy
taskkubectl get pods
,並收到 EKS Cluster 的 kubernetes API 回應 No resources found in default namespace.
,代表能使用 GitLab CI 來部署與操作 EKS Cluster 了今天,我們成功在 EKS Cluster 中安裝了 GitLab Agent,這樣我們就不必在 GitLab 系統中直接儲存 kubeconfig。現在,我們可以使用 GitLab CI 來呼叫 GitLab Agent,啟動 GitLab Runner,然後執行 pipeline script(比如 kubectl get pods)。這表示 GitLab 和 EKS Cluster 之間的通訊是順暢的。
明天,我們將開始實作 .gitlab-ci.yml
,以實現自動部署 YAML 到 EKS Cluster。