GitOps实践指南:GitLab CI/CD + ArgoCD 实现 Kubernetes 自动化部署
文章目录
在实现 Kubernetes 自动化运维和持续交付的过程中,GitLab CI/CD 是非常核心的工具链之一。本节将详细介绍如何部署 GitLab Runner,编写 .gitlab-ci.yml 自动构建并推送 Docker 镜像,结合 ArgoCD 实现自动部署。
一、部署 GitLab Runner(共享模式)
1. 下载并安装 GitLab Runner
# 下载地址
官网地址:https://gitlab.cn/docs/runner/install/bleeding-edge.html
二进制文件地址:https://s3.amazonaws.com/gitlab-runner-downloads/main/binaries/gitlab-runner-linux-amd64
# 上传服务器并移动
mkdir -p /usr/local/gitlab-runner
chmod +x gitlab-runner-linux-amd64
mv gitlab-runner-linux-amd64 /usr/local/gitlab-runner/
# 注册shared-runner
/usr/local/gitlab-runner/gitlab-runner-linux-amd64 register \
--non-interactive \ #非交互模式
--url http://192.168.101.11/ \ #指定gitlab的地址,根据自己的情况进行替换
--registration-token 1pfynmj564wKXsVaXiWD \ #验证 Runner 注册的令牌,也就是我下图框起来的位置
--executor "shell" \ #指定执行器为 shell
--docker-image maven:latest \
--description gitlab-runner \ #设置描述信息
--maintenance-note hwj \ #添加维护备注
--tag-list docker \ #为 Runner 设置标签,这里设置为 docker,也是根据自己情况修改
--run-untagged="true" \ #允许 Runner 运行没有标签的作业
--locked="false" \ #设置 Runner 是否锁定到当前项目
--access-level="not_protected" #设置 Runner 的保护级别
2. 配置Runner参数:config.toml
vim /etc/gitlab-runner/config.toml
concurrent = 10 #流水线并发数量默认为1,修改为10
check_interval = 0
connection_max_age = "15m0s"
shutdown_timeout = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "gitlab-runner"
url = "http://192.168.101.11/" #git仓库地址
id = 13 #gitlab-runner的id
token = "Jse57-spnafPstju5Y2n" #注册runner时生成的认证token
token_obtained_at = 2025-03-27T07:20:50Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "shell" #直接在宿主机上执行任务,不涉及docker
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker] #若使用 docker 执行器需启用此配置
tls_verify = false
image = "maven:latest"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
network_mtu = 0
3. 配置 Systemd 启动服务
mkdir -p /usr/local/gitlab-runner/work #创建工作目录
vim /usr/lib/systemd/system/gitlab-runner.service
[Unit]
Description=GitLab Runner
ConditionFileIsExecutable=/usr/local/gitlab-runner/gitlab-runner-linux-amd64
After=syslog.target network.target
[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/local/gitlab-runner/gitlab-runner-linux-amd64 "run" "--working-directory" "/usr/local/gitlab-runner/work" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--user" "root"
Restart=always
RestartSec=120
EnvironmentFile=-/etc/sysconfig/gitlab-runner
[Install]
WantedBy=multi-user.target
# 启动gitlab-runner
systemctl daemon-reload
systemctl restart gitlab-runner.service && systemctl status gitlab-runner.service
ln -s /usr/local/gitlab-runner/gitlab-runner-linux-amd64 ./gitlab-runner
二、 配置 GitLab 仓库与 CI/CD 流程
1. 拉取测试仓库代码并配置Git凭据
git clone http://192.168.101.11/yw/hwj.git
2. 编写.gitlab-ci.yml并推送仓库
vim .gitlab-ci.yml
stages:
- package # 定义 CI/CD 任务的阶段,只有一个 package 阶段
variables:
GIT_DEPTH: 0 # 禁用 Git 的 shallow clone,完整拉取 Git 仓库,确保获取完整的提交历史
IMAGE_NAME: "harbor.local/k8s/zhsy" # 设定 Docker 镜像的名称
IMAGE_TAG: "${CI_COMMIT_TAG}" # 设定 Docker 镜像的标签,使用 GitLab 的提交 Tag 作为版本号
package:
stage: package # 指定该 Job 属于 package 阶段
tags:
- docker # 这个docker标签需与上面注册shared-runner时候配置时一致
only:
- tags #只在tag被push时触发
script:
- mvn package -Dmaven.test.skip=true # 执行 Maven 打包,并跳过测试,提高构建速度
- echo "Harbor12345" | docker login -u "admin" --password-stdin harbor.local # 使用密码管道方式登录 Harbor 镜像仓库
- docker build -t $IMAGE_NAME:$IMAGE_TAG . # 构建 Docker 镜像,使用变量设置镜像名称和 Tag
- docker push $IMAGE_NAME:$IMAGE_TAG
- 'sed -i "s|image: harbor.local/k8s/zhsy:.*|image: ${IMAGE_NAME}:${IMAGE_TAG}|" k8s/zhsy/zhsy-deploy.yaml'
# Git 配置
- git config --global user.email "hwj@hwj.com"
- git config --global user.name "hwj"
# 使用凭据方式推送(避免交互)
- git remote set-url origin http://${GIT_USERNAME}:${GIT_PASSWORD}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git
- git add k8s/zhsy/zhsy-deploy.yaml
- git commit -m "Update image version to $IMAGE_TAG" || echo "No changes"
- git push origin HEAD:master
# 推送git仓库
git add .
git commit -am '上传.gitlab-ci.yml'
git push origin master
此时仓库如图所示,我这里还做了集成 Argocd
自动更新 pod 的操作,有感兴趣的详见我另一篇文章,基于k8s的Jenkins CI/CD平台部署实践(三):集成ArgoCD实现持续部署
3. 验证Ci流程
git tag -a v1.0.1 -m 'test'
git push origin v1.0.1
此时,将触发 GitLab CI 自动执行如下流程:
- 编译项目并打包
- 构建并推送镜像到 Harbor 仓库
- 修改 K8s 部署 YAML 文件中的镜像版本
- 提交变更到 Git 仓库
- ArgoCD 监听到仓库变化,自动更新部署
总结
🚀 本篇文章详细介绍了 GitLab CI/CD 的完整流程,从部署 Runner 到自动构建镜像、推送 Harbor、修改 K8s 配置再到 ArgoCD 自动更新,形成了一个标准的 GitOps 流水线。