1. OpenShift持续交付体系总览

在OpenShift上做应用发布,最容易混淆的不是命令,而是三个词:持续集成、持续交付、持续部署。它们经常被并列使用,但边界完全不同。理解这条边界,是理解OpenShift整个发布链路的前提。

三个概念的边界

持续集成(CI)解决的是“代码合进去之后能不能构建出可信产物”。它的核心动作是拉取源码、编译、跑测试、构建镜像,并把镜像推入镜像仓库。CI的终点是一个带唯一标识的镜像,而不是一个正在运行的应用。

持续交付(CD)解决的是“这个镜像能不能随时安全地进入某个环境”。它把镜像部署到测试、预发等环境,并保证部署过程可重复、可回滚。持续交付的关键特征是:到生产环境之前的每一步都自动化,但生产发布保留人工批准。

持续部署是持续交付的延伸:连生产环境的发布也自动完成,只要流水线通过,镜像就直接进入生产。两者的差别不在工具,而在“最后一道门是否由人把守”。

判断一个团队处于哪个阶段,看一个问题即可:镜像构建成功后,进入生产环境是否需要人工点击批准?需要,是持续交付;不需要,是持续部署。

OpenShift在发布链路中的角色

OpenShift不是单纯的容器运行平台,它把发布链路中的多个环节内建为平台能力。源码到镜像的构建、镜像的版本追踪、应用的滚动发布、外部流量的接入,都可以由OpenShift自身的资源对象完成,而不必全部依赖外部CI系统。

这意味着在OpenShift上,发布链路有两种典型形态:一种是“平台内闭环”,用BuildConfig和Pipeline完成构建与部署;另一种是“外部CI + 平台部署”,由Jenkins、GitLab CI等在集群外构建镜像,OpenShift只负责部署与流量。理解核心组件,就是理解这两种形态各自用到哪些对象。

核心组件与整体发布流程

下面这张图把OpenShift发布链路中的核心组件按数据流方向串起来,同时标出每个组件承担的职责边界。

源码阶段 构建阶段 镜像阶段 部署阶段 接入阶段 Git 仓库 源码 / Dockerfile BuildConfig 定义构建策略与触发 Pipeline 编排构建与部署步骤 ImageStream 追踪镜像标签与版本 内部镜像仓库 存储构建产物 DeploymentConfig / Deployment 管理 Pod 副本与滚动更新 Pod 副本 运行中的应用实例 Route 外部访问入口 触发 输出镜像 引用 拉取镜像 创建 暴露服务 编排部署 关键边界说明 • BuildConfig 与 Pipeline 属于 CI 范畴:产出带唯一标签的镜像,不负责运行态。 • ImageStream 是 OpenShift 特有的镜像版本追踪层,让 DeploymentConfig 可以引用“最新镜像”而不写死 tag。 • DeploymentConfig / Deployment 与 Route 属于 CD 范畴:决定镜像以什么方式、什么节奏进入运行态并对外服务。 图例 数据/镜像流 Pipeline 编排控制流 构建/部署对象 运行态对象 流量入口

沿着图中的箭头走一遍,就是一次完整的发布:代码提交触发BuildConfig,构建出的镜像被推入内部仓库并由ImageStream记录版本;DeploymentConfig或Deployment从ImageStream拉取指定镜像,创建新的Pod副本;Route把Service暴露到集群外部,外部请求由此进入。Pipeline则横跨构建与部署两个阶段,把原本需要手动串联的步骤编排成一条可重复执行的流水线。

BuildConfig与Pipeline的分工

BuildConfig负责“把源码变成镜像”,它支持Source-to-Image、Docker构建、Pipeline构建等策略。其中Pipeline策略会把构建过程交给Jenkins,此时BuildConfig本身只是一个触发器,真正的构建逻辑写在Jenkinsfile里。

Pipeline的价值在于它可以跨越构建和部署两个阶段。一个典型的Jenkinsfile会依次执行:拉取源码、运行单元测试、构建镜像、推送镜像、更新DeploymentConfig的镜像触发滚动发布。这样,CI和CD被同一条流水线串起来,而不是两个割裂的系统。

ImageStream为什么重要

在原生Kubernetes中,Deployment直接引用镜像地址,例如registry.example.com/myapp:v1.2.3。OpenShift引入ImageStream作为中间层,DeploymentConfig引用的是ImageStreamTag,例如myapp:latest。当BuildConfig构建出新镜像时,ImageStream的latest标签自动指向新镜像,DeploymentConfig可以配置为监听该标签变化并自动触发滚动更新。

这个机制的实际意义是:构建和部署解耦了。构建流水线不需要知道部署配置在哪里,部署配置也不需要知道镜像的具体哈希值,两者通过ImageStream这个“版本指针”连接。

DeploymentConfig与Deployment的选择

OpenShift同时支持原生的Deployment和自有的DeploymentConfig。DeploymentConfig提供了Deployment没有的能力:镜像变化自动触发、生命周期钩子、自定义滚动策略。但Deployment是Kubernetes社区标准,生态兼容性更好。新项目通常优先选择Deployment配合ImageStreamTrigger,老项目或需要精细发布控制的场景仍在使用DeploymentConfig。

一次发布的完整判断依据

发布是否成功,不能只看流水线是否变绿。在OpenShift中,至少需要确认三件事:

  • 镜像是否就绪:oc get is myapp -o yaml查看ImageStream的latest标签是否指向新构建的镜像摘要。
  • 副本是否可用:oc get dc myapp或oc get deploy myapp查看READY列是否达到期望副本数,滚动更新是否完成。
  • 路由是否可达:oc get route myapp确认Route已分配host,并通过curl或浏览器验证外部请求能返回预期响应。
常见误区:把Pipeline成功等同于发布成功。Pipeline只证明构建和部署指令执行完毕,不证明新Pod已经通过就绪探针、不证明Route已经生效。生产发布必须独立验证运行态。