企业级 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/CD |
mvn/docker/kubectl/helm 容器内执行 |
| Harbor |
镜像 / Chart 仓库 |
Docker 镜像;Helm 模式存 Chart |
| Kubernetes |
运行环境 |
Deployment / DaemonSet / StatefulSet |
| SkyWalking |
链路追踪 |
skywalking 模板 initContainer 注入 Agent |
| jenkinslib |
共享库 |
构建、Harbor、模板、K8s 部署、公共流水线 |
1.2 两条 CD 路径
| 路径 |
deployMethod |
说明 |
| kubectl(默认) |
kubectl |
Jenkins 动态生成 YAML → kubectl apply |
| Helm |
helm |
仓库 helm/ Chart → helm upgrade --install |
构建阶段(CheckOut → Build → 镜像推送 Harbor)相同,差异在部署阶段。
1.3 流水线与共享库
| 文件 |
说明 |
cigroovy.jenkinsfile |
K8s CI/CD 入口 |
vars/k8s.groovy + k8s.groovy |
Slave Pod(mvn/docker/kubectl/helm) |
pipeline.groovy |
checkout、发布门禁 |
build.groovy |
compile(mvn/gradle) |
Harbor.groovy |
docker build/push(校验 Dockerfile) |
template.groovy |
K8s YAML 模板生成 |
k8sdeploy.groovy |
kubectl / Helm 部署与回滚 |
resources/k8s-skywalking-*.yaml |
SkyWalking 通用微服务模板 |
resources/k8s-basic-*.yaml |
基础精简模板 |
二、发布模式(publishMode)
| publishMode |
行为 |
| 自动发布(默认) |
镜像推送后自动部署到 K8s |
| 手动发布 |
input 确认后部署 |
| 仅构建 |
仅编译 + 推镜像,不生成 YAML、不部署 |
| 回滚 |
kubectl rollout undo 或 Helm 回滚 |
三、时序图
3.1 kubectl 自动发布
3.2 Helm 发布
- 跳过「生成部署模板」
PackageAndPushChart → helm upgrade --install --atomic --wait
- 注意:Helm 模式下 Jenkins 侧
deployConfigType/Template 参数不生效,由仓库 Chart 决定
3.3 初始化部署 vs 服务更新
| deployAction |
生成 Service |
kubectl apply |
| 初始化部署 |
是 |
工作负载 + Service |
| 服务更新 |
否 |
仅工作负载 |
四、部署配置
4.1 部署配置类型(deployConfigType)
| 参数值 |
输出文件 |
K8s 资源 |
| 使用deployment模板 |
deployment.yaml |
Deployment |
| 使用daemonset模板 |
daemonset.yaml |
DaemonSet |
| 使用statefulset模板 |
statefulset.yaml |
StatefulSet |
4.2 部署配置模板(deployConfigTemplate)
| 参数值 |
资源前缀 |
特性 |
| 通用微服务含skywalking |
k8s-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 |
| prod |
k8s-prod-config |
| test |
k8s-test-config |
| dev |
k8s-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 基础参数
| 参数名 |
说明 |
Tenv |
dev/test/prod(邮件标题含环境) |
publishMode |
必配:自动发布/手动发布/仅构建/回滚 |
SrcURL / branchName |
仓库与分支 |
buildType |
mvn / gradle |
buildshell |
如 clean package -DskipTests |
imageName / imageTag |
镜像名与 tag 前缀 |
k8s_ns |
Namespace |
replicas / ContainerPort |
副本数、端口 |
waitMins / emailUser |
手动超时、邮件 |
6.2 部署参数
| 参数名 |
说明 |
deployMethod |
kubectl(默认)/ helm |
deployAction |
初始化部署 / 服务更新 |
deployConfigType |
Deployment/DaemonSet/StatefulSet 模板 |
deployConfigTemplate |
skywalking / 基础模板 |
6.3 SkyWalking 模板资源参数
containerCpuLimits、containerMemoryLimits、containerCpuRequests、containerMemoryRequests、APOLLO_*、skywalkingAgentImage、skywalkingCollector、JAVA_OPTS、APOLLO_OPTS
6.4 环境变量
| 变量 |
默认 |
HARBOR_URL |
harbor.jdicity.local |
PROJECT_GROUP |
registry |
K8S_CREDENTIAL_ID |
覆盖 kubeconfig |
七、流水线阶段
| 阶段 |
条件 |
说明 |
| CheckOut |
publishMode ≠ 回滚 |
pipeline.checkoutCode |
| Build |
同上 |
container(mvn) → build.compile |
| 镜像构建并推送 |
同上 |
打 tag + harbor.BuildImage(含 Dockerfile 校验) |
| 生成部署模板 |
auto/manual 且 kubectl |
template.generateWorkload/Service |
| 发布到K8s |
auto/manual |
pipeline.runPublish → k8sdeploy.RunDeploy |
| 回滚 |
rollback |
kubectl Rollback 或 HelmRollback |
| post |
always |
sendPost(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
同前后端:checkoutCode、runPublish、selectRollbackVersion
k8sdeploy.groovy
| 方法 |
说明 |
RunDeploy(config) |
按 deployMethod 分发 |
Deploy(...) |
kubectl apply + rollout(含 DaemonSet) |
PackageAndPushChart / HelmDeploy |
Helm 路径 |
Rollback / HelmRollback |
回滚 |
build.groovy
build.compile(buildType, buildshell)
十、典型场景
| 场景 |
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 |
十二、快速检查清单
附录:DevOps 三条路径对照
| 维度 |
前端 |
后端 |
K8s |
| Jenkinsfile |
front.jenkinsfile |
backend.jenkinsfile |
cigroovy.jenkinsfile |
| 制品 |
tar.gz |
JAR |
Docker 镜像 |
| 仓库 |
MinIO |
MinIO |
Harbor |
| 部署 |
SSH 解压 |
SSH + launch.sh |
kubectl / Helm |
| 保留策略 |
artifactRetainCount |
MinIO + 目标机 JAR |
— |
| 发布模式 |
publishMode |
publishMode |
publishMode |
| 公共库 |
pipeline.groovy |
pipeline.groovy |
pipeline.groovy |
所有评论(0)