DevOps篇之通过GitLab CI 流水线实现k8s集群中helm应用发布

一. 设计思路

构建一个 GitLab CI 流水线,并且要集成到 K8s 集群中的 Helm 应用发布流程。首先,需要了解 GitLab CI 的基本结构,比如.gitlab-ci.yml 文件的配置,包括 stages、jobs、变量设置等。然后,结合之前讨论的 Helm 和 K8s 的知识【参考https://blog.csdn.net/xu710263124/article/details/150959212?spm=1001.2014.3001.5501】,将 Helm 的操作(如 lint、template、install、upgrade)整合到流水线中,设计步骤如下:
1、首先,流水线的阶段应该包括哪些呢?通常会有校验(lint)、构建镜像、打包 Chart、测试部署、正式部署等阶段。需要确保每个阶段的依赖正确,比如只有校验通过后才能进行构建,测试部署成功后再正式部署。
2、接下来,考虑如何在 GitLab CI 中连接 K8s 集群。GitLab 提供了 Kubernetes 集成,可以通过配置 KUBECONFIG 变量或者使用 GitLab 的 Kubernetes 代理。另外,需要在 GitLab 项目的 CI/CD 变量中存储必要的凭证,比如 K8s 的 kubeconfig、容器仓库的认证信息(如 Harbor 或 Docker Hub 的账号密码)。
3、然后,Helm 的操作步骤:在校验阶段使用 helm lint 检查 Chart 的语法;构建阶段可能需要构建应用镜像并推送到仓库,同时更新 Chart 中的镜像标签;测试阶段使用 helm upgrade --dry-run 或者在测试集群中实际部署验证;正式部署阶段则根据环境(如 staging、production)进行 helm upgrade 或 install。
4、还要考虑环境分离,比如通过 GitLab 的环境变量和环境配置,区分开发、测试、生产环境,每个环境可能有不同的 values 文件和部署策略。另外,需要处理版本号,通常可以使用 Git 的 commit hash 或标签作为镜像和 Chart 的版本,确保可追溯。
5、安全方面,所有敏感信息(如 kubeconfig、仓库密码)都应该存储在 GitLab 的 CI/CD 变量中,避免明文出现在配置文件中。同时,权限控制方面,GitLab 的 Service Account 在 K8s 中应只授予必要的权限,遵循最小权限原则。
6、可能还需要集成测试步骤,比如部署后检查 Pod 状态、执行健康检查等,确保应用正常运行。如果部署失败,流水线应该能够捕获错误并通知相关人员,可能还需要自动回滚的机制,但初期可以先实现手动回滚或通知。
7、最后,编写.gitlab-ci.yml 文件时,要注意使用合适的镜像(如包含 helm、kubectl、docker 的镜像),定义变量,设置每个 job 的脚本,以及阶段之间的依赖关系。确保流水线能够自动执行从代码提交到应用部署的整个流程,并且每个步骤可监控、可追溯。

二. 实现方案

构建 GitLab CI 流水线并集成 K8s 集群的 Helm 应用发布流程,可实现从代码提交到应用部署的全自动化,核心是通过
.gitlab-ci.yml定义流水线阶段,结合 GitLab 与 K8s 的认证集成,完成 Helm Chart 的校验、构建、测试和部署。
在这里插入图片描述

三. 实现方案

以下是详细实现方案:

一. 环境准备

  1. 工具与依赖
  • GitLab Runner:需配置具有docker执行权限的 Runner(用于构建镜像和执行 Helm 命令)。【执行机器】
  • 基础镜像:Runner 使用包含helm、kubectl、docker的镜像(如alpine/helm:3.12.3 + 额外工具)。
  • K8s 集群访问:GitLab 项目需配置 K8s 集群访问凭证(通过 GitLab 集成或 CI 变量注入)。
  • 容器仓库:如 Harbor、Docker Hub,用于存储应用镜像。
  1. 凭证管理(GitLab CI/CD 变量)

在 GitLab 项目的「Settings → CI/CD → Variables」中配置以下敏感信息:

变量名说明类型
KUBECONFIGK8s 集群的 kubeconfig 内容File
REGISTRY_URL容器仓库地址(如harbor.example.com)Variable
REGISTRY_USER容器仓库用户名Variable
REGISTRY_PASSWORD容器仓库密码Variable
HELM_REPO_URLHelm 私有仓库地址(如需)Variable
HELM_REPO_USERHelm 仓库用户名Variable
HELM_REPO_PASSWORDHelm 仓库密码Variable

二. 流水线设计(.gitlab-ci.yml)

流水线分为 5 个核心阶段:校验(Lint)→ 构建镜像 → 打包 Chart → 测试部署 → 正式部署,支持多环境(测试、生产)分离
关键:GitLab CI集成Helm与K8s的发布流水线

vim .gitlab-ci.yml
stages:- lint               # 代码与Chart校验- build_image        # 构建应用镜像- package_chart      # 打包并推送Helm Chart- test_deploy        # 测试环境部署- prod_deploy        # 生产环境部署variables:# 应用与镜像信息APP_NAME: "myapp"IMAGE_NAME: "${REGISTRY_URL}/apps/${APP_NAME}"# 镜像标签:使用Git Commit短哈希+流水线ID(确保唯一)IMAGE_TAG: "${CI_COMMIT_SHORT_SHA}-${CI_PIPELINE_ID}"# Helm Chart目录(默认Chart名称与应用名一致)CHART_DIR: "./charts/${APP_NAME}"# 测试与生产环境的values文件TEST_VALUES: "./values/test.yaml"PROD_VALUES: "./values/prod.yaml"# 阶段1:代码与Helm Chart校验
lint:stage: lintimage: name: alpine/helm:3.12.3entrypoint: [""]  # 覆盖默认entrypoint,避免直接执行helmbefore_script:- apk add --no-cache git  # 安装git(用于依赖拉取)- helm dependency update ${CHART_DIR}  # 更新Chart依赖script:# 1. 校验Helm Chart语法- helm lint ${CHART_DIR}# 2. (可选)代码静态检查(如后端用sonar-scanner,前端用eslint)- echo "代码静态检查通过"# 阶段2:构建并推送应用镜像
build_image:stage: build_imageimage: docker:24.0.5services:- docker:24.0.5-dind  # Docker-in-Docker服务before_script:# 登录容器仓库- docker login -u ${REGISTRY_USER} -p ${REGISTRY_PASSWORD} ${REGISTRY_URL}script:# 构建镜像(示例为Dockerfile,根据项目调整)- docker build -t ${IMAGE_NAME}:${IMAGE_TAG} -t ${IMAGE_NAME}:latest .# 推送镜像到仓库- docker push ${IMAGE_NAME}:${IMAGE_TAG}- docker push ${IMAGE_NAME}:latestonly:- main  # 仅主分支触发镜像构建- merge_requests  # 合并请求时也构建(可选)# 阶段3:打包并推送Helm Chart到私有仓库
package_chart:stage: package_chartimage: alpine/helm:3.12.3before_script:- apk add --no-cache git# 登录Helm私有仓库(如Harbor的Chart仓库)- helm repo add --username ${HELM_REPO_USER} --password ${HELM_REPO_PASSWORD} myrepo ${HELM_REPO_URL}# 更新Chart中的镜像标签(替换values中的占位符)- sed -i "s|IMAGE_TAG_PLACEHOLDER|${IMAGE_TAG}|g" ${CHART_DIR}/values.yamlscript:# 打包Chart(版本号=Git Commit哈希)- helm package ${CHART_DIR} --version ${CI_COMMIT_SHORT_SHA}# 推送Chart到私有仓库- helm push ${APP_NAME}-${CI_COMMIT_SHORT_SHA}.tgz myrepoonly:- main# 阶段4:测试环境部署(自动执行)
test_deploy:stage: test_deployimage: name: alpine/helm:3.12.3entrypoint: [""]before_script:# 配置kubectl访问K8s集群(使用CI变量中的KUBECONFIG)- apk add --no-cache kubectl- export KUBECONFIG=${KUBECONFIG}  # KUBECONFIG为File类型变量,自动挂载为文件# 添加Helm仓库并更新- helm repo add --username ${HELM_REPO_USER} --password ${HELM_REPO_PASSWORD} myrepo ${HELM_REPO_URL}- helm repo updatescript:# 部署到测试环境(命名空间:test)- |if helm list -n test | grep -q ${APP_NAME}-test; then# 已部署则升级helm upgrade ${APP_NAME}-test myrepo/${APP_NAME} \--version ${CI_COMMIT_SHORT_SHA} \-n test \-f ${TEST_VALUES}else# 未部署则安装helm install ${APP_NAME}-test myrepo/${APP_NAME} \--version ${CI_COMMIT_SHORT_SHA} \-n test \--create-namespace \-f ${TEST_VALUES}fi# 等待部署完成并检查状态- kubectl rollout status deployment/${APP_NAME}-test -n test --timeout=5m# 执行健康检查(示例:访问/health接口)- kubectl run -n test curl --image=curlimages/curl:latest --rm -it -- curl -f ${APP_NAME}-test:8080/healthonly:- main# 阶段5:生产环境部署(手动触发)
prod_deploy:stage: prod_deployimage: name: alpine/helm:3.12.3entrypoint: [""]before_script:- apk add --no-cache kubectl- export KUBECONFIG=${KUBECONFIG}- helm repo add --username ${HELM_REPO_USER} --password ${HELM_REPO_PASSWORD} myrepo ${HELM_REPO_URL}- helm repo updatescript:# 部署到生产环境(命名空间:prod)- |if helm list -n prod | grep -q ${APP_NAME}-prod; thenhelm upgrade ${APP_NAME}-prod myrepo/${APP_NAME} \--version ${CI_COMMIT_SHORT_SHA} \-n prod \-f ${PROD_VALUES}elsehelm install ${APP_NAME}-prod myrepo/${APP_NAME} \--version ${CI_COMMIT_SHORT_SHA} \-n prod \--create-namespace \-f ${PROD_VALUES}fi# 等待部署完成并检查状态- kubectl rollout status deployment/${APP_NAME}-prod -n prod --timeout=10mwhen: manual  # 手动触发,避免误操作only:- mainenvironment:name: production  # GitLab环境跟踪,支持部署历史与回滚url: https://prod.example.com  # 生产环境访问地址

四. 核心流程解析

1. 流水线阶段说明

  • lint:通过helm lint检查 Chart 语法,更新依赖(如 Redis、MySQL 等),确保 Chart 结构合法。
  • build_image:基于代码构建 Docker 镜像,推送至私有仓库,标签包含 Git Commit 哈希和流水线 ID,确保版本唯一可追溯。
  • package_chart:替换 Chart 中镜像标签的占位符,打包 Chart 并推送到 Helm 私有仓库,实现 Chart 的版本化管理。
  • test_deploy:自动将 Chart 部署到测试环境,执行滚动更新检查和健康检查,验证应用可用性。
  • prod_deploy:手动触发生产环境部署,使用生产专属配置(prod.yaml),通过 GitLab 环境跟踪部署历史。

2. K8s 与 GitLab 集成关键点

  • K8s 认证:通过KUBECONFIG变量注入集群访问凭证,kubectl和helm自动使用该配置访问集群。
  • 环境隔离:测试环境使用test命名空间,生产环境使用prod命名空间,通过不同values文件区分配置(如副本数、资源限制)。
  • 安全控制:生产环境部署设为when: manual(手动触发),避免代码提交直接影响生产;所有敏感凭证通过 GitLab 变量管理,不暴露在代码中。

3. Helm 操作核心命令

场景命令示例作用
依赖更新helm dependency update ${CHART_DIR}拉取 Chart 依赖的子 Chart(如 Redis)
打包 Charthelm package ${CHART_DIR} --version x.x生成.tgz格式的 Chart 包
推送 Chart 到仓库helm push chart.tgz myrepo上传 Chart 到私有仓库
安装 / 升级 Releasehelm install/upgrade部署或更新应用到 K8s 集群
检查部署状态kubectl rollout status等待 Deployment 就绪,超时则失败

五. 扩展与最佳实践

1. 回滚机制

在生产环境部署失败时,可通过 GitLab CI 手动触发回滚 Job:

prod_rollback:stage: prod_deployimage: alpine/helm:3.12.3script:- helm rollback ${APP_NAME}-prod 1 -n prod  # 回滚到上一版本when: manualenvironment:name: production

2. 多集群部署

如需部署到多个生产集群,可通过变量区分 KUBECONFIG,例如:

prod_deploy_cluster1:script:- export KUBECONFIG=${KUBECONFIG_CLUSTER1}  # 集群1的kubeconfig- helm upgrade ...  # 部署到集群1prod_deploy_cluster2:script:- export KUBECONFIG=${KUBECONFIG_CLUSTER2}  # 集群2的kubeconfig- helm upgrade ...  # 部署到集群2

3. 集成测试报告

在test_deploy阶段后添加测试结果收集,如 JUnit 报告:

test_deploy:script:# ... 部署步骤 ...- kubectl cp -n test <pod-name>:/app/test-results ./reports  # 复制测试报告artifacts:reports:junit: ./reports/*.xml  # GitLab显示测试结果

4. 镜像扫描

在build_image阶段添加镜像安全扫描(如 Trivy),检测漏洞:

build_image:script:# ... 构建推送镜像 ...- apk add trivy- trivy image ${IMAGE_NAME}:${IMAGE_TAG} --exit-code 1  # 发现高危漏洞则失败

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95534.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详尽 | Deeplabv3+结构理解

https://arxiv.org/pdf/1802.02611.pdf https://link.springer.com/chapter/10.1007/978-3-319-10578-9_23 目录 Deeplabv3 Encoder部分 Decoder部分 补充摘要 SPP 空间金字塔池化层模块 Dilated/Atrous Conv 空洞卷积 Deeplabv3 deeplab-v3是语义分割网络&#xff0c;组…

【51单片机】【protues仿真】基于51单片机音乐盒(8首歌曲)系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、数码管显示当前歌曲序号 2、按键切换歌曲和播放暂停​ 3、内置8首音乐 二、使用步骤 基于51单片机的音乐盒是一种能够存储和播放多首歌曲的电子设备&#xff0c;通过定时器产…

@ZooKeeper 详细介绍部署与使用详细指南

文章目录 **ZooKeeper 详细介绍、部署与使用** 1. 概述 & 核心介绍 1.1 什么是 ZooKeeper? 1.2 核心特性 1.3 核心概念 1.4 典型应用场景 2. 部署 (以 3 节点集群为例) 2.1 环境准备 2.2 安装步骤 (在所有节点执行) 2.3 启动与停止集群 2.4 防火墙配置 (如果开启) 3. 基本…

腾讯Hunyuan-MT-7B翻译模型完全指南:2025年开源AI翻译的新标杆

&#x1f3af; 核心要点 (TL;DR) 突破性成就&#xff1a;腾讯混元MT-7B在WMT25全球翻译竞赛中获得30/31项第一名双模型架构&#xff1a;Hunyuan-MT-7B基础翻译模型 Hunyuan-MT-Chimera-7B集成优化模型广泛语言支持&#xff1a;支持33种语言互译&#xff0c;包括5种中国少数民…

Web 集群高可用全方案:Keepalived+LVS (DR) 负载均衡 + Apache 服务 + NFS 共享存储搭建指南

文章目录Keepalived LVS&#xff08;DR&#xff09; Apache NFS项目背景业务场景与核心需求传统架构的痛点与局限技术方案的选型逻辑项目价值与预期目标项目实践项目环境基础配置配置 router配置免密登录-可选配置 nfs配置 web配置 LVS-RS配置 HA 和 LVS-DS配置 ha1配置 ha2测…

Prometheus监控预警系统深度解析:架构、优劣、成本与竞品

目录 一、Prometheus是什么&#xff1f;核心定位与架构 二、竞品分析&#xff08;Prometheus vs. Zabbix vs. Nagios vs. Commercial SaaS&#xff09; 三、部署成本分析 四、服务器资源消耗分析 五、给您的最终建议 一、Prometheus是什么&#xff1f;核心定位与架构 Prom…

Nginx反向代理及配置

Nginx反向代理 二级域名系统 顾名思义&#xff0c;我们有很多的这个不同的二级域名的用户来访问我们&#xff0c;比如说微博。它有一个主域名weibo.com。如果我叫一鸣,申请了一个微博&#xff0c;然后我就可以在微博这个主系统上申请一个二级域名来访问我微博的主页&#xff0…

嵌入式系统通信总线全景探秘:从板内到云端

引言 在嵌入式系统设计中&#xff0c;选择合适的通信总线是决定系统性能、成本和可靠性的关键因素。从简单的芯片间通信到复杂的工业网络&#xff0c;不同的总线技术各司其职&#xff0c;形成了嵌入式世界的"交通网络"。本文将深入探讨五种经典且重要的通信技术&…

2022版Unity创建时没有2D灯光(2D Light),没有Global LIght2D怎么办?

简单来说就是你的渲染管线没有升级到URP管线&#xff0c;所以才没有这些2D灯光 如果你的创建灯光和我一样&#xff0c;没有红线划掉的部分&#xff0c;说明你和我的问题一样&#xff0c;看下面的教程可以解决。 1. 确保Unity版本 确保你的Unity版本至少为2019.4或更高版本&…

技术小白如何快速的了解opentenbase?--把握四大特色

1.基本介绍 作为一名计算机专业相关背景的学生&#xff0c;我们或多或者接触过一些数据库&#xff0c;对于数据库肯定是有所了解的&#xff1b; 你可能学习的是和微软的sql server这样的数据库&#xff1b; 你可能接触的更多的是企业级项目开发里面使用的这个mysql数据库&#…

企业微信AI落地:如何选择企业微信服务商?

现在企业用企业微信做客户运营&#xff0c;最怕的不是“没AI工具”&#xff0c;而是“AI用不起来”——要么功能不贴业务场景&#xff0c;员工嫌麻烦不用&#xff1b;要么回复不专业&#xff0c;客户体验差&#xff1b;要么数据不同步&#xff0c;管理者看不到效果。其实解决这…

【学Python自动化】 11 标准库简介 —— 第二部分

一、格式化输出 reprlib 模块 提供定制版 repr()&#xff0c;缩略显示大型或深层嵌套对象import reprlib reprlib.repr(set(supercalifragilisticexpialidocious)) # "{a, c, d, e, f, g, ...}"pprint 模块 美化输出&#xff0c;添加换行和缩进显示复杂数据结构impor…

【Kubernetes】知识点2

15. 什么是Pod的根容器&#xff1f;答&#xff1a;Pod 的根容器是每个 Pod 中默认存在的一个特殊容器pause容器&#xff0c;有时也称为infra容器&#xff0c;它是Pod 启动时创建的第一个容器&#xff0c;也是整个 Pod中所有容器的 “父容器”。其核心作用是为 Pod 内的所有容器…

视频增强AI哪个效果好?实战对比帮你找到最适合的工具

hitpaw 牛小影hitpaw 牛小影在处理低质量视频时&#xff0c;我们经常会遇到画面模糊、噪点过多、分辨率不足等问题&#xff0c;比如老旧视频资料修复、监控录像清晰化、手机拍摄视频画质提升等。这时候&#xff0c;一款好用的视频增强AI软件就成了刚需。下面就为大家盘点几款效…

C#工作流示例(WorkflowCore)

using Microsoft.Extensions.DependencyInjection; using WorkflowCore.Interface; using WorkflowCore.Models;namespace LeaveRequestWorkflow {// 请假申请单public class LeaveBill{/// <summary>/// 申请人/// </summary>public string EmployeeName { get; s…

两个子进程之间使用命名pipe

两个子进程间可以使用命名管道&#xff0c;非常简单。管道如果文件一样存在硬盘中&#xff0c;使用ls可以查看&#xff0c;管道文件0字节。使用fork函数分别创建两个子进程。 一个负责读数据&#xff0c;一个负责写数据。 #define _GNU_SOURCE #include <stdio.h> #inclu…

第一讲、Kafka 初识与环境搭建

一、Kafka 是什么&#xff1f; Apache Kafka 是一个分布式的消息队列&#xff08;Message Queue&#xff09;与流处理平台。 它最早由 LinkedIn 开发&#xff0c;后来捐赠给 Apache 基金会&#xff0c;现已广泛应用于日志收集、实时数据管道和大数据处理。 Kafka 的特点&…

Conda相关的用法

1、背景 此文主要记录conda的一些用法&#xff0c;大部分命令来自ai搜索以及自己的理解。 2、安装conda 2.1 选择 conda 版本 2.1.1 Anaconda 含有 Conda 大量科学计算包&#xff08;NumPy、Pandas、Matplotlib 等&#xff09;适合数据科学、机器学习初学者下载地址&…

数据库选择有讲究?SQLite、PostgreSQL还是MySQL?

不同规模的项目&#xff0c;数据库选择有讲究。大家好&#xff0c;我是技术支持彼得&#xff0c;每天两眼一睁就是为客户解决问题。在日常使用我们的视频平台时&#xff0c;很多用户会问到数据库选择的问题。今天就来详细说说EasyGBS、EasyNVR和EasyCVR三大平台该如何选择数据库…

在VMware的Win10虚拟机中安装使用ENSP

VMware安装Windows10 安装ENSP及相关软件 把安装ENSP所使用的相关复制到已安装好的Windows10虚拟机中&#xff0c;如下图所示。 安装VirtualBox 安装时请确保路径为英文目录&#xff0c;并在出现"安装设备软件"或"Oracle USB设备"提示时选择安装选项。具…