现代软件开发要求快速部署周期、可扩展性和弹性。 Kubernetes 已经成为首选编排平台,实现可扩展的容器化应用程序管理。当与 GitLab CI/CD 流水线结合时,Kubernetes 部署变得自动化、可重复和可靠。
本文探讨了使用 GitLab CI 为 Kubernetes 设置 CI/CD 流水线的技术细节。
先决条件
在配置 CI/CD 流水线之前,请确保满足以下要求:
- GitLab 账户:访问将配置 CI/CD 流水线的 GitLab 代码仓库。
- Kubernetes 集群:存在 Kubernetes 集群,如 Minikube(用于本地测试)或托管集群,如 Google Kubernetes Engine(GKE)、Amazon EKS 或 Azure AKS。
- kubectl:必须安装并配置 Kubernetes 命令行工具以进行集群交互。
- Helm(可选):用于部署和管理应用程序的 Kubernetes 软件包管理器。
- GitLab Runner:确保已安装 GitLab Runner 并已注册到您的项目以执行 CI/CD 作业。
- Docker:用于构建和推送容器镜像到容器注册表。
设置 Kubernetes 与 GitLab 的集成
连接 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