K8s 不部署源代码、不构建应用

一、CI/CD 到底是什么?

CI/CD 是「代码 → 容器镜像 → 部署到 K8s 运行」的完整流程,分 3 个核心阶段:

1. CI(持续集成,Continuous Integration):代码 → 容器镜像

  • 做的事:
    1. 从 Git 仓库拉取最新的源代码
    2. 编译 / 打包代码(比如 Java 项目mvn package、Go 项目go build
    3. 编写 Dockerfile,把编译好的程序打包成容器镜像
    4. 把镜像推送到镜像仓库(比如 Harbor、Docker Hub、阿里云镜像服务)
  • 常用工具:Jenkins、GitLab CI、GitHub Actions、GitLab Runner、Argo Workflows 等

2. CD(持续交付 / 部署,Continuous Delivery/Deployment):镜像 → 部署到 K8s

  • 做的事:
    1. 从镜像仓库拉取最新的镜像
    2. 更新 K8s 的 Deployment/StatefulSet 等资源的镜像版本
    3. 触发 K8s 滚动更新,把旧 Pod 替换成新镜像的 Pod
    4. 验证服务正常运行

二、K8s 在这个流程里,管什么、不管什么?

K8s 只负责:最终的「部署运行」环节

K8s 的核心工作,是运行已经打包好的容器镜像

  • 你给 K8s 一个 Deployment YAML,里面写了image: nginx:1.25.3,K8s 就会:
    1. 拉取这个镜像
    2. 创建 Pod 运行容器
    3. 维护 Pod 的状态(挂了自动重启、数量不够自动扩容)
    4. 完成滚动更新、回滚等操作
  • 简单说:K8s 只认「容器镜像」,不认「源代码」

K8s 完全不管:「代码 → 镜像」的 CI 过程

K8s 不会参与、也不会干涉代码变成镜像的任何步骤:

  • 不管你用什么工具做 CI:Jenkins、GitLab CI、GitHub Actions、甚至手动docker build,K8s 都不关心
  • 不管你用什么构建流程:是每次提交代码自动构建,还是手动触发构建,K8s 都不干涉
  • 不管你用什么镜像仓库:Harbor、Docker Hub、私有仓库,K8s 只负责拉取,不负责镜像的构建和推送
  • 不管你用什么语言 / 框架:Java、Go、Python、Node.js,K8s 都不参与编译打包,只运行最终的容器

三、实际例子

场景:把一个 Java Web 项目部署到 K8s

1. CI 阶段(K8s 完全不参与,企业自己做)
  • 开发提交代码到 GitLab
  • GitLab CI 自动触发流水线:
    1. 拉取代码 → mvn clean package 编译打包成 jar 包
    2. 编写 Dockerfile,把 jar 包打包成镜像 my-app:v1.0.0
    3. 把镜像推送到 Harbor 私有仓库
  • 这个过程和 K8s 没有任何关系,K8s 完全不知道代码的存在。
2. CD 阶段(K8s 只负责最后一步)
  • CD 工具(比如 Argo CD、Jenkins)从 Harbor 拉取my-app:v1.0.0
  • 更新 K8s 的 Deployment YAML,把镜像版本改成my-app:v1.0.0
  • K8s 收到更新请求后,执行滚动更新
    1. 拉取新镜像
    2. 创建新 Pod,启动容器
    3. 销毁旧 Pod
    4. 确保最终运行的 Pod 数量符合期望
  • 这里 K8s 只做「运行容器」的事,完全不关心镜像怎么来的。

四、为什么 K8s 要这么设计?

  1. 解耦:把「构建流程」和「运行平台」彻底分开,企业可以自由选择适合自己的 CI/CD 工具和流程,不用被 K8s 绑定。
  2. 通用性:K8s 只需要支持容器运行,就能适配所有语言、所有构建流程的应用,不用为不同语言做适配。
  3. 职责清晰:K8s 专注做「容器编排」,CI/CD 工具专注做「代码构建」,各司其职,系统更稳定、更易维护。

五、常见误区纠正

  • 误区:K8s 可以直接部署源代码 纠正:K8s 不能直接运行源代码,必须先把代码打包成容器镜像,K8s 才能运行。
  • 误区:K8s 自带 CI/CD 功能 纠正:K8s 本身没有 CI/CD 能力,需要配合 Jenkins、GitLab CI 等工具使用,K8s 只负责最终的部署环节。
  • 误区:K8s 会干涉 CI/CD 流程 纠正:K8s 完全不干涉 CI/CD 的流程设计,企业可以根据自己的需求自定义流程,K8s 只执行最终的部署操作。

六、总结

K8s 是「容器的运行平台」,不是「代码的构建平台」。它只负责运行已经打包好的容器,不负责把代码变成容器的过程。

相关推荐
江华森10 小时前
K8s集群部署实验笔记:4节点Kubernetes v1.32.13 + Calico v3.29.3
kubernetes·k8s
古城小栈11 小时前
k8s 存储练习
云原生·容器·kubernetes
无级程序员11 小时前
记一次K8S增加新节点
云原生·容器·kubernetes
仙柒41519 小时前
控制平面组件和节点组件
运维·容器·kubernetes
wb1891 天前
Kubernetes服务优化
云原生·容器·kubernetes
码点滴1 天前
Workload 自动化进化论:从手动运维到 AI 驱动的 Kubernetes 智能管控
运维·人工智能·kubernetes·自动化·workload
Waay1 天前
图文详解|K8s Pod内部结构
docker·云原生·kubernetes
码点滴1 天前
CRI-O选型与容器运行时标准
开发语言·人工智能·架构·kubernetes·cri-o
牛奶咖啡131 天前
k8s容器编排技术实践——OpenEuler安装部署k8s
kubernetes·信创·containerd配置加速器·openeuler安装k8s·k8s的常见安装方式·彻底关闭swap·工作节点使用kubectl
老码观察1 天前
K8s 容器化部署的宿主机资源规划的踩坑实录
docker·容器·kubernetes