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 实现最小权限集成,避免凭证泄露风险。
CI/CD 与 K8s 集成总体架构 CI/CD 与 K8s 集成总体架构 代码源层 GitLab / GitHub / Bitbucket 仓库 CI/CD 引擎层 Jenkins Master + Agent (K8s Plugin) GitLab Runner (K8s Executor) 镜像构建层 Docker-in-Docker (DinD) / Kaniko / BuildKit 镜像仓库层 Harbor / Docker Registry / GitLab Container Registry K8s 集群层(目标环境:Dev / Staging / Prod)

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 典型流水线流程

  1. 代码推送:开发者向 Git 仓库推送代码,Webhook 触发 Jenkins Job。
  2. Agent 调度:Jenkins Master 根据 Pod Template 定义,向 K8s API 请求创建 Agent Pod。
  3. 构建与测试:Agent Pod 拉取代码,执行编译、单元测试、代码扫描。
  4. 镜像构建:在 Agent Pod 内通过 DinD 或 Kaniko 构建容器镜像并推送至仓库。
  5. 部署:Agent 执行 kubectl apply 或 Helm 命令,将更新后的镜像部署到目标 K8s 集群。
  6. 清理:构建完成后,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 典型流水线流程

  1. 代码推送:开发者推送代码至 GitLab 仓库,自动触发 Pipeline。
  2. Runner 调度:GitLab Runner 检测到新 Job,通过 K8s Executor 创建 Job Pod。
  3. Job 执行:Pod 内运行 .gitlab-ci.yml 定义的 stages(build、test、deploy)。
  4. 镜像构建:使用 Docker-in-Docker 或 Kaniko 构建镜像,推送至 GitLab Container Registry。
  5. 部署:通过 kubectl 或 GitLab CI/CD 的 environments 功能,将应用部署至目标 K8s 集群。
  6. 环境清理:Job 完成后,Pod 自动删除,Runner 释放资源。
注意:GitLab Runner 的 K8s Executor 默认使用 alpine 作为基础镜像,若需 Docker 构建能力,必须配置 DinD 服务容器或使用 Kaniko。Kaniko 更安全,因为它不需要特权模式。
GitLab CI/CD 与 K8s 集成详细流程 GitLab CI/CD 与 K8s 集成详细流程 1. 代码推送 2. 触发 Pipeline 3. Runner 调度 4. 创建 Job Pod 5. 构建镜像 6. 推送镜像 7. 部署至 K8s 8. 环境清理 关键说明 GitLab Runner 通过 K8s Executor 为每个 Job 创建独立 Pod,Job 完成后自动删除。 镜像构建推荐使用 Kaniko(无需特权模式),避免 DinD 的安全风险。

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 关键字复用公共模板,降低迁移成本。