企业级 K8s 容器化部署方案:Jenkins + Harbor + Helm/kubectl + Gitee + Jenkinsfile 自动化实践

本文档基于 jenkinsfileTest/cigroovy.jenkinsfile 及共享库 jenkinslib 编写,描述 Java 微服务从 Maven/Gradle 编译、Docker 镜像推送 Harbor,到 K8s 集群部署(kubectl 动态模板 / Helm Chart)、初始化与服务更新、版本回滚的完整 CI/CD 流程。


一、方案架构

1.1 组件说明

组件角色说明
Gitee代码仓库SSH 拉取,含 Dockerfile
Jenkins (K8s Agent Pod)CI/CDmvn/docker/kubectl/helm 容器内执行
Harbor镜像 / Chart 仓库Docker 镜像;Helm 模式存 Chart
Kubernetes运行环境Deployment / DaemonSet / StatefulSet
SkyWalking链路追踪skywalking 模板 initContainer 注入 Agent
jenkinslib共享库构建、Harbor、模板、K8s 部署、公共流水线

1.2 两条 CD 路径

路径deployMethod说明
kubectl(默认)kubectlJenkins 动态生成 YAML → kubectl apply
Helmhelm仓库 helm/ Chart → helm upgrade --install

构建阶段(CheckOut → Build → 镜像推送 Harbor)相同,差异在部署阶段。

1.3 流水线与共享库

文件说明
cigroovy.jenkinsfileK8s CI/CD 入口
vars/k8s.groovy + k8s.groovySlave Pod(mvn/docker/kubectl/helm)
pipeline.groovycheckout、发布门禁
build.groovycompile(mvn/gradle)
Harbor.groovydocker build/push(校验 Dockerfile)
template.groovyK8s YAML 模板生成
k8sdeploy.groovykubectl / Helm 部署与回滚
resources/k8s-skywalking-*.yamlSkyWalking 通用微服务模板
resources/k8s-basic-*.yaml基础精简模板

二、发布模式(publishMode)

publishMode行为
自动发布(默认)镜像推送后自动部署到 K8s
手动发布input 确认后部署
仅构建仅编译 + 推镜像,不生成 YAML、不部署
回滚kubectl rollout undo 或 Helm 回滚

回滚

其他

仅构建

自动/手动

kubectl

helm

publishMode

回滚阶段

CheckOut → Build

镜像构建并推送 Harbor

publishMode

结束

deployMethod

生成部署模板

跳过模板

发布到K8s

post 邮件


三、时序图

3.1 kubectl 自动发布

k8sdeploytemplateHarborbuildJenkins Podk8sdeploytemplateHarborbuildJenkins Podcompile(mvn/gradle)1BuildImage + push2generateWorkloadTemplate + Service(init时)3Deploy(kubectl apply + rollout)4

3.2 Helm 发布

  • 跳过「生成部署模板」
  • PackageAndPushCharthelm upgrade --install --atomic --wait
  • 注意:Helm 模式下 Jenkins 侧 deployConfigType/Template 参数不生效,由仓库 Chart 决定

3.3 初始化部署 vs 服务更新

deployAction生成 Servicekubectl apply
初始化部署工作负载 + Service
服务更新仅工作负载

四、部署配置

4.1 部署配置类型(deployConfigType)

参数值输出文件K8s 资源
使用deployment模板deployment.yamlDeployment
使用daemonset模板daemonset.yamlDaemonSet
使用statefulset模板statefulset.yamlStatefulSet

4.2 部署配置模板(deployConfigTemplate)

参数值资源前缀特性
通用微服务含skywalkingk8s-skywalking-*initContainer Agent、探针、JAVA_OPTS/APOLLO_OPTS
基础模板k8s-basic-*精简,无 SkyWalking/探针

占位符:{{PRONAME}} {{FULL_IMAGE_NAME}} {{NAMESPACE}} {{REPLICAS}} {{CONTAINER_PORT}} 及 CPU/Memory、Apollo、SkyWalking 等。


五、环境准备

5.1 Jenkins K8s 云

Slave Pod 容器:mvn、docker(挂载 docker.sock)、kubectl、helm。

5.2 Harbor

镜像:{HARBOR_URL}/{PROJECT_GROUP}/{imageName}:{imageTag}_{Tenv}_{BUILD_TIME}
示例:harbor.jdicity.local/registry/order-service:v1.0_prod_20250618_143022

5.3 K8s 凭据(config.K8S_CLUSTER_CREDENTIALS)

Tenv默认凭据 ID
prodk8s-prod-config
testk8s-test-config
devk8s-dev-config

可用 K8S_CREDENTIAL_ID 覆盖。

5.4 集群前置条件

  • Namespace 已创建
  • registry-secret imagePullSecrets
  • SkyWalking 模板:OAP、Apollo Meta 集群内可达
  • 应用暴露 /actuator/health/*(skywalking 模板探针)

5.5 Helm 额外要求

  • 仓库根目录 helm/Chart.yaml
  • Harbor Chart 仓库已启用

六、Jenkins 参数

6.1 基础参数

参数名说明
Tenvdev/test/prod(邮件标题含环境)
publishMode必配:自动发布/手动发布/仅构建/回滚
SrcURL / branchName仓库与分支
buildTypemvn / gradle
buildshell如 clean package -DskipTests
imageName / imageTag镜像名与 tag 前缀
k8s_nsNamespace
replicas / ContainerPort副本数、端口
waitMins / emailUser手动超时、邮件

6.2 部署参数

参数名说明
deployMethodkubectl(默认)/ helm
deployAction初始化部署 / 服务更新
deployConfigTypeDeployment/DaemonSet/StatefulSet 模板
deployConfigTemplateskywalking / 基础模板

6.3 SkyWalking 模板资源参数

containerCpuLimitscontainerMemoryLimitscontainerCpuRequestscontainerMemoryRequestsAPOLLO_*skywalkingAgentImageskywalkingCollectorJAVA_OPTSAPOLLO_OPTS

6.4 环境变量

变量默认
HARBOR_URLharbor.jdicity.local
PROJECT_GROUPregistry
K8S_CREDENTIAL_ID覆盖 kubeconfig

七、流水线阶段

阶段条件说明
CheckOutpublishMode ≠ 回滚pipeline.checkoutCode
Build同上container(mvn) → build.compile
镜像构建并推送同上打 tag + harbor.BuildImage(含 Dockerfile 校验)
生成部署模板auto/manual 且 kubectltemplate.generateWorkload/Service
发布到K8sauto/manualpipeline.runPublish → k8sdeploy.RunDeploy
回滚rollbackkubectl Rollback 或 HelmRollback
postalwayssendPost(notifyCtx 含 tenv)

八、Helm 在 CI/CD 中的作用

能力说明
Chart 版本化helm package,BUILD_NUMBER 为版本,推 Harbor
Release 管理helm upgrade --install {imageName}-{Tenv}
参数化–set image.repository/tag/replicas/containerPort
原子部署–atomic --wait
回滚helm history + upgrade --reuse-values

kubectl vs Helm 选型:

  • 动态 SkyWalking YAML、多工作负载类型 → kubectl
  • 稳定 Chart、Release 级管理 → Helm

九、共享库 API

pipeline.groovy

同前后端:checkoutCoderunPublishselectRollbackVersion

k8sdeploy.groovy

方法说明
RunDeploy(config)按 deployMethod 分发
Deploy(...)kubectl apply + rollout(含 DaemonSet)
PackageAndPushChart / HelmDeployHelm 路径
Rollback / HelmRollback回滚

build.groovy

build.compile(buildType, buildshell)  // mvn / gradle 统一入口

十、典型场景

场景publishMode其他
首次 SkyWalking 上线自动发布deployAction=初始化部署,deployConfigTemplate=skywalking
日常发版自动发布deployAction=服务更新
只打镜像不部署仅构建
DaemonSet 日志 agent自动发布deployConfigType=daemonset
Helm 发版自动发布deployMethod=helm,仓库含 helm/
kubectl 回滚回滚deployMethod=kubectl

十一、排错

现象处理
Dockerfile 不存在仓库根目录添加 Dockerfile
Gradle 构建失败buildType=gradle,Build 已统一支持
libraryResource 失败确认 jenkinslib/resources/k8s-*.yaml 已发布
探针失败改用基础模板或调整 actuator 路径
Helm 参数不生效deployConfigType 仅 kubectl 有效
仅构建仍部署publishMode 应为仅构建
邮件无环境已修复:notifyCtx.tenv

十二、快速检查清单

  • K8s 云 kubernetes 已配置,Slave Pod 正常
  • 凭据 HARBOR_ID、环境 kubeconfig 已创建
  • publishMode、deployMethod 已配置
  • kubectl 路径:SkyWalking OAP、registry-secret 就绪
  • helm 路径:helm/Chart.yaml 存在
  • SMTP、emailUser 已配置

附录:DevOps 三条路径对照

维度前端后端K8s
Jenkinsfilefront.jenkinsfilebackend.jenkinsfilecigroovy.jenkinsfile
制品tar.gzJARDocker 镜像
仓库MinIOMinIOHarbor
部署SSH 解压SSH + launch.shkubectl / Helm
保留策略artifactRetainCountMinIO + 目标机 JAR
发布模式publishModepublishModepublishMode
公共库pipeline.groovypipeline.groovypipeline.groovy

更多推荐