很多同学在跟着教程搭完 Jenkins + Kubernetes + 镜像构建 + 自动部署这套流水线后,普遍有个感觉:
“步骤我都背下来了,点哪里我也知道,但这玩意儿到底是怎么连起来的?为什么 Jenkins 挂了,K8s 还在跑?为什么镜像推送不是 Jenkins 干的?”
脑子里一团乱,只知其然,不知其所以然。
别慌,今天我们一起来“洗脑”——把 Jenkins 在整个流程中的前后关系和职责边界彻底焊死在自己的认知里。
很多人有个致命误区:
更精确的定义是:
👉 Jenkins = CI/CD 流程的“编排器 + 调度总司令”
它老人家本身不负责“搬砖”,它只负责三件事:
结合之前的实验,整个权力架构是这样的:
开发小哥提交代码
↓
Git仓库(敲了敲门:Webhook)
↓
【Jenkins 总指挥中心】
↓
K8s 工地(临时搭建一个 Agent Pod 工棚)
↓
Kaniko 工头(在工棚里干活:构建镜像)
↓
Harbor 仓库(存成品镜像)
↓
kubectl 传令兵(喊一句:更新 Deployment!)
↓
K8s 集群(真正执行滚动更新、拉镜像、起 Pod)
接下来,我们一层层扒开看,到底谁在指挥谁。
开发小哥刚敲完 git push,GitLab/GitHub 立刻通过 Webhook给 Jenkins 打了个电话:
“喂?老 Jenkins,代码变了,起来干活!”
Jenkins 拿起剧本(Jenkinsfile)一看:
pipeline {
stages {
stage("Build") { ... }
stage("Push") { ... }
stage("Deploy") { ... }
}
}
关键点来了:Jenkins 读完剧本,自己不去演,而是拿起对讲机开始叫人。
流程其实是这样:
Jenkins Master(指挥官)
↓ 调用 K8s API
K8s 集群(包工头)
↓ 创建资源
一个崭新的 Pod(临时工棚)
↓
所有 Pipeline 步骤在这个临时工棚里执行
记住这句话:
👉 Jenkins 只是画大饼的,K8s Pod 才是真正和面的。
因为在 K8s 这个现代化工地里,不允许你搞特权模式(DinD 安全问题太多)。所以换了个不需要特权的狠角色——Kaniko。
Pod 里的 Kaniko 读取代码
↓
看 Dockerfile 图纸
↓
吭哧吭哧生成镜像层
Jenkins 在这里干嘛? 👉 只在旁边看着表喊:“Kaniko,赶紧的,下一个环节要开始了!”
构建完的镜像还在工棚里,得送到仓库(Harbor)存起来。
本地临时镜像(Pod内) → 推送到 Harbor
这里涉及两个细节:
Jenkins 的角色依然是那个监工:
最后一步,执行:
kubectl set image deployment/app app=xxx:v2
这行命令背后发生了什么?
新镜像地址 → 修改 Deployment 定义
↓
创建新的 ReplicaSet
↓
一个一个替换旧 Pod(滚动更新)
↓
业务零中断
Jenkins 的终极职责:
👉 它就是喊出那句 kubectl apply命令的嘴替。真正的排兵布阵、滚动更新、负载均衡,全是 Kubernetes 自己干的。
别光看步骤,要看数据是怎么流动的:
数据流类型 | 流动路径 | 核心含义 |
|---|---|---|
代码流 | Git→ Jenkins→ Pod | Jenkins 只负责把代码搬到工棚 |
镜像流 | Pod→ Harbor | Jenkins 管不着,是 Kaniko 和 Harbor 的事 |
指令流 | Jenkins→ K8s API | Jenkins 唯一的实权:调用 API |
状态流 | K8s→ Jenkins | K8s 告诉 Jenkins 干没干完 |
这套架构牛逼在哪?三个字:高内聚,低耦合。
如果你已经搞懂了上面这套逻辑,恭喜你,你已经超越了 80% 的“只会搭环境”的运维。
接下来别做重复实验了,往这三个方向升级:
kubectl了,改为直接改 Git 仓库,让 ArgoCD 自动同步。更安全,可审计。dev→ test→ prod,中间加个手动审批按钮。最后送大家一句话带走:
👉 Jenkins 是大脑,K8s 是躯干,工具是四肢。大脑负责想,四肢负责干。别指望大脑去搬砖。