現代軟體開發要求快速部署周期、可擴展性和彈性。Kubernetes已經成為首選的調度平台,可以實現可擴展的容器化應用管理。當結合GitLab CI/CD流水線時,Kubernetes部署變得自動化、可重複和可靠。
本文探討了使用GitLab CI為Kubernetes設置CI/CD流水線的技術細節。
先決條件
在配置CI/CD流水線之前,請確保滿足以下要求:
- GitLab帳戶:能夠訪問GitLab存儲庫,用於配置CI/CD流水線。
- Kubernetes集群:已經存在的Kubernetes集群,如Minikube(用於本地測試)或像Google Kubernetes Engine(GKE)、Amazon EKS或Azure AKS這樣的托管集群。
- kubectl:必須安裝並配置Kubernetes命令行工具以進行集群交互。
- Helm(可選):用於部署和管理應用程序的Kubernetes套件管理器。
- GitLab Runner:確保已安裝並註冊GitLab Runner以執行CI/CD作業。
- Docker:用於構建和推送容器映像至容器註冊表。
設置與GitLab的Kubernetes集成
連接Kubernetes集群
整合 Kubernetes 與 GitLab 允許您直接從管道進行無縫部署和資源管理。請遵循以下步驟:
- 前往您的 GitLab 專案儀表板。
- 導航至 基礎設施 > Kubernetes 集群。
- 點擊 新增 Kubernetes 集群,並連接現有的集群或使用雲端服務提供商創建新的集群。
- 使用基於角色的存取控制 (RBAC) 指定 GitLab 的適當權限。
RBAC 配置
RBAC 定義 Kubernetes 資源的存取權限。以下是設定 RBAC 的 YAML 配置示例:
apiVersion v1
kind ServiceAccount
metadata
name gitlab-sa
namespace default
---
apiVersion rbac.authorization.k8s.io/v1
kind ClusterRoleBinding
metadata
name gitlab-cluster-admin
roleRef
apiGroup rbac.authorization.k8s.io
kind ClusterRole
name cluster-admin
subjects
kind ServiceAccount
name gitlab-sa
namespace default
應用配置
使用 kubectl
應用 YAML 文件:
kubectl apply -f gitlab-rbac.yaml
生成身份驗證的令牌
提取 GitLab 所需的服務帳戶令牌:
kubectl -n default get secret $(kubectl -n default get sa/gitlab-sa -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode
將此令牌粘貼到 GitLab 的 Kubernetes 配置設置中。
配置 GitLab CI/CD 管道
定義 .gitlab-ci.yml
GitLab CI 配置文件定義管道階段、變數和命令。以下是配置範例:
image docker20.10
stages
build
test
deploy
variables
KUBE_NAMESPACE default
KUBECONFIG"/root/.kube/config"
IMAGE_TAG $CI_COMMIT_SHA
REGISTRY registry.gitlab.com/username/project
services
docker:dind
before_script
apk add --no-cache curl jq bash git
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.22.0/bin/linux/amd64/kubectl
chmod +x ./kubectl && mv ./kubectl /usr/local/bin/kubectl
"$KUBE_CONFIG" | base64 -d > $KUBECONFIG echo
chmod 600 $KUBECONFIG
build
stage build
script
docker build -t $REGISTRY:$IMAGE_TAG .
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
docker push $REGISTRY:$IMAGE_TAG
unit-test
stage test
script
"Running tests..." echo
./run-tests.sh
deploy
stage deploy
script
kubectl set image deployment/my-app my-app=$REGISTRY:$IMAGE_TAG -n $KUBE_NAMESPACE
only
main
配置說明
- 階段: 管道被分為建構、測試和部署階段,以便模組化執行。
- 變數: 環境變數如映像標籤和命名空間簡化了配置管理。
- before_script: 安裝依賴並設置 Kubernetes 認證。
- 映像標籤: 使用提交 SHA 唯一識別每個映像版本。
- 部署: 通過設置容器映像來更新 Kubernetes 部署。
秘密管理
GitLab CI 支持使用變數的安全秘密管理:
- 導航到 設定 > CI/CD > 變數。
- 添加所需的變數,如
KUBE_CONFIG
、CI_REGISTRY_USER
和CI_REGISTRY_PASSWORD
。
在將 kubeconfig
添加為變數之前進行編碼:
cat ~/.kube/config | base64 | tr -d '\n'
將結果作為 KUBE_CONFIG
添加到 GitLab。
Helm 部署
Helm 通過可重用的圖表簡化 Kubernetes 部署。示例 Helm 配置:
apiVersion v2
name my-app
version1.0.0
appVersion1.0.0
image
repository registry.gitlab.com/username/project
tag latest
service
type ClusterIP
port80
將 Helm 命令添加到管道:
deploy
stage deploy
script
helm upgrade --install my-app ./helm-chart --set image.tag=$IMAGE_TAG
監控和除錯工具
在 GitLab 的 CI/CD > 管道 中監控管道狀態。使用以下工具:
- Prometheus 和 Grafana: 用於指標和可視化。
- Kubernetes 控制面板: 集群管理。
- kubectl logs: 獲取部署日誌。
kubectl logs -f deployment/my-app
結論
本文概述了如何使用 GitLab CI 配置 Kubernetes 的 CI/CD 管道。內容包括先決條件、YAML 配置、秘密管理、Helm 部署和監控工具。通過這個設置,開發人員可以高效且可靠地構建、測試和部署容器化應用程序。
Source:
https://dzone.com/articles/cicd-pipelines-for-kubernetes-using-gitlab-ci