3. 流水线基础:Jenkins/GitLab CI/CD 与 K8s 集成的典型架构
在 K8s 平台发布流水线中,CI/CD 工具与 Kubernetes 集群的集成深度决定了发布效率与稳定性。本章聚焦 Jenkins 与 GitLab CI/CD 两种主流方案,剖析其与 K8s 集成的典型架构、核心组件及适用场景。
3.1 集成架构总览
无论是 Jenkins 还是 GitLab CI/CD,与 K8s 集成的本质都是将 CI/CD 工具作为“控制平面”,通过 API 与 K8s 集群交互,实现构建、测试、部署的自动化。典型架构包含以下核心层:
- 代码源层:GitLab、GitHub、Bitbucket 等仓库触发流水线。
- CI/CD 引擎层:Jenkins Master/Agent 或 GitLab Runner,负责解析流水线定义并执行任务。
- 镜像构建层:通过 Docker-in-Docker (DinD) 或 Kaniko 在 K8s Pod 内构建容器镜像。
- 镜像仓库层:Harbor、Docker Registry、GitLab Container Registry 存储构建产物。
- K8s 集群层:目标集群接收部署清单,完成应用发布。
架构要点:CI/CD 工具不应直接操作生产集群的 kubeconfig 文件,而应通过 ServiceAccount + RBAC 实现最小权限集成,避免凭证泄露风险。
3.2 Jenkins 与 K8s 集成架构
Jenkins 通过 Kubernetes Plugin 实现动态 Agent 管理,每个构建任务在 K8s Pod 中启动临时 Agent,构建完成后自动销毁。这种“弹性 Agent”模式显著提升了资源利用率。
3.2.1 核心组件与角色
| 组件 | 角色 | 部署方式 |
|---|---|---|
| Jenkins Master | 调度任务、管理凭证、存储配置 | Deployment + Service + Ingress |
| Jenkins Agent | 执行构建、测试、部署命令 | K8s Pod(临时创建) |
| Kubernetes Plugin | 管理 Agent 生命周期、Pod 模板 | Master 内部插件 |
| Persistent Volume | 存储 Jenkins 主目录、构建缓存 | PVC + PV(NFS/Ceph) |
3.2.2 典型流水线流程
- 代码推送:开发者向 Git 仓库推送代码,Webhook 触发 Jenkins Job。
- Agent 调度:Jenkins Master 根据 Pod Template 定义,向 K8s API 请求创建 Agent Pod。
- 构建与测试:Agent Pod 拉取代码,执行编译、单元测试、代码扫描。
- 镜像构建:在 Agent Pod 内通过 DinD 或 Kaniko 构建容器镜像并推送至仓库。
- 部署:Agent 执行
kubectl apply或 Helm 命令,将更新后的镜像部署到目标 K8s 集群。 - 清理:构建完成后,Agent Pod 自动销毁,释放资源。
Jenkinsfile 示例(声明式流水线):
pipeline {
agent {
kubernetes {
yaml '''
apiVersion: v1
kind: Pod
spec:
containers:
- name: jnlp
image: jenkins/inbound-agent:latest
- name: docker
image: docker:20.10
command: ["cat"]
tty: true
- name: kubectl
image: bitnami/kubectl:latest
command: ["cat"]
tty: true
'''
}
}
stages {
stage('Build & Push Image') {
steps {
container('docker') {
sh 'docker build -t myapp:${BUILD_NUMBER} .'
sh 'docker push registry.example.com/myapp:${BUILD_NUMBER}'
}
}
}
stage('Deploy to K8s') {
steps {
container('kubectl') {
sh 'kubectl set image deployment/myapp myapp=registry.example.com/myapp:${BUILD_NUMBER}'
}
}
}
}
}
3.3 GitLab CI/CD 与 K8s 集成架构
GitLab CI/CD 原生支持 K8s 集成,通过 GitLab Runner 的 Kubernetes Executor 在集群内直接运行 CI Job。相比 Jenkins,GitLab CI/CD 的流水线定义(.gitlab-ci.yml)更简洁,且与代码仓库深度绑定。
3.3.1 核心组件与角色
| 组件 | 角色 | 部署方式 |
|---|---|---|
| GitLab Server | 代码托管、流水线触发、制品管理 | Omnibus 或 Helm Chart |
| GitLab Runner | 执行 CI Job,支持 K8s Executor | Deployment + ConfigMap |
| K8s Executor | 为每个 Job 创建临时 Pod | Runner 内部驱动 |
| Container Registry | 存储构建镜像(内置或外部) | GitLab 内置或 Harbor |
3.3.2 典型流水线流程
- 代码推送:开发者推送代码至 GitLab 仓库,自动触发 Pipeline。
- Runner 调度:GitLab Runner 检测到新 Job,通过 K8s Executor 创建 Job Pod。
- Job 执行:Pod 内运行
.gitlab-ci.yml定义的 stages(build、test、deploy)。 - 镜像构建:使用 Docker-in-Docker 或 Kaniko 构建镜像,推送至 GitLab Container Registry。
- 部署:通过
kubectl或 GitLab CI/CD 的environments功能,将应用部署至目标 K8s 集群。 - 环境清理:Job 完成后,Pod 自动删除,Runner 释放资源。
注意:GitLab Runner 的 K8s Executor 默认使用
alpine 作为基础镜像,若需 Docker 构建能力,必须配置 DinD 服务容器或使用 Kaniko。Kaniko 更安全,因为它不需要特权模式。
3.4 两种方案对比
| 对比维度 | Jenkins + K8s | GitLab CI/CD + K8s |
|---|---|---|
| 流水线定义 | Jenkinsfile(Groovy 语法) | .gitlab-ci.yml(YAML 语法) |
| Agent 管理 | Kubernetes Plugin 动态创建 Agent Pod | K8s Executor 自动创建 Job Pod |
| 镜像构建 | 需额外配置 DinD 或 Kaniko | 内置 Kaniko 支持,推荐使用 |
| 凭证管理 | Jenkins Credentials + K8s Secret | GitLab CI/CD Variables + K8s Secret |
| 多环境部署 | 通过参数化构建或多分支流水线 | 通过 environments + rules 原生支持 |
| 可观测性 | 需集成 Prometheus + 自定义 Dashboard | GitLab 内置 Pipeline 监控 + 日志 |
| 适用场景 | 复杂流水线、多工具链集成、已有 Jenkins 生态 | GitLab 原生用户、轻量级流水线、快速迭代 |
3.5 集成最佳实践
- 最小权限原则:为 CI/CD 工具创建独立的 ServiceAccount,仅授予目标命名空间的最小 RBAC 权限(如
edit角色)。 - 镜像构建安全:优先使用 Kaniko 或 BuildKit 替代 DinD,避免特权容器带来的安全风险。
- 缓存策略:利用 PVC 或分布式缓存(如 MinIO)加速依赖下载和镜像层复用,减少构建时间。
- 流水线幂等性:确保每次部署都是幂等的,避免因重试导致环境状态不一致。
- 回滚机制:在流水线中集成 Helm 或 Kustomize,利用 K8s 的
rollback能力实现快速回退。
迁移提示:若从 Jenkins 迁移至 GitLab CI/CD,建议先梳理现有流水线的 stages 和 steps,利用 GitLab CI/CD 的
include 关键字复用公共模板,降低迁移成本。