3. 发布窗口定义

发布窗口(Release Window)是平台工程中用于约束变更生效时间段的策略模型。它规定了“什么时间可以发布”、“发布持续多久”、“影响范围多大”三个核心维度。在 K8s 平台发布流水线中,发布窗口是上线前防护验证的第一道逻辑闸口——窗口之外的所有发布请求将被自动拦截或排队。

3.1 什么是发布窗口

发布窗口是一组时间与范围规则的组合,用于控制变更操作在集群环境中的执行时机与生效边界。其本质是将“可发布”的权限从人工判断转化为策略驱动的自动化决策。

核心公式: 发布窗口 = 时间约束 ∩ 范围约束 ∩ 准入策略

一个完整的发布窗口定义包含以下要素:

要素 说明 示例
窗口标识 唯一名称,用于流水线引用 prod-weekday-window
时间规则 允许发布的日期与时刻 周一至周五 14:00-16:00
生效范围 窗口适用的资源层级 集群: prod-cn, 命名空间: payment
最大持续时长 单次发布允许的最长执行时间 120 分钟
冷却期 两次发布之间的最小间隔 30 分钟
黑/白名单 例外日期或紧急发布通道 排除法定节假日

3.2 窗口的时间粒度

时间粒度决定了发布窗口的精细程度。根据团队发布节奏和风险容忍度,通常分为三个层级:

3.2.1 周级窗口

以“周”为最小时间单位,适用于低频、高风险的核心业务发布。通常固定为每周某几天,例如“每周二、周四”。周级窗口的优点是计划性强,便于跨团队协调;缺点是灵活性差,紧急修复需走例外流程。

3.2.2 天级窗口

以“天”为粒度,指定每天的可发布时段。例如“每天 10:00-11:30 和 14:00-16:00”。天级窗口是生产环境最常用的粒度,兼顾了日常迭代节奏与风险控制。

3.2.3 小时级窗口

以“小时”甚至“分钟”为粒度,精确控制发布窗口的起止时刻。适用于高频发布的微服务或离线计算任务。小时级窗口通常与自动化流水线深度绑定,窗口开启时自动触发部署。

粒度 最小单位 典型场景 风险等级 示例表达式
周级 周 核心交易、数据库变更 高 weekday: Tue,Thu
天级 天 常规服务发布、配置更新 中 daily: 10:00-12:00
小时级 小时/分钟 离线计算、A/B 测试 低 cron: 0 14 * * 1-5
实践建议: 生产环境推荐使用“天级窗口 + 小时级冷却期”的组合。既保证每天有固定的发布时段,又通过冷却期防止连续发布导致的问题叠加。
发布窗口时间粒度对比 周级窗口 最小单位:周 允许日期:周二、周四 窗口时长:全天 冷却期:48 小时 适用:核心交易、DB变更 天级窗口 最小单位:天 允许时段:10:00-12:00 窗口时长:120 分钟 冷却期:30 分钟 适用:常规服务、配置更新 小时级窗口 最小单位:小时/分钟 允许时刻:14:00-14:30 窗口时长:30 分钟 冷却期:10 分钟 适用:离线计算、A/B测试 粒度越细 → 发布频率越高 → 单次影响面越小 → 风险越低

3.3 窗口的生效范围

生效范围定义了发布窗口在 K8s 平台中的资源作用域。合理的范围设计可以避免“一刀切”式的全局封锁,实现精细化管控。生效范围通常分为三个层级:

3.3.1 集群级范围

窗口规则对整个集群的所有命名空间生效。适用于基础设施变更、集群升级、节点维护等全局操作。集群级窗口通常由平台 SRE 团队定义,变更频率极低。

3.3.2 命名空间级范围

窗口规则仅对指定命名空间生效。这是生产环境中最常用的范围粒度。不同命名空间可以配置不同的窗口策略,例如:

  • production 命名空间:仅周二、周四 14:00-16:00
  • staging 命名空间:每天 09:00-18:00
  • canary 命名空间:全天开放(用于灰度验证)

3.3.3 应用级范围

窗口规则仅对特定应用(Deployment / StatefulSet / DaemonSet)生效。适用于关键业务应用的单独管控。应用级范围通常与命名空间级范围叠加使用,形成更精细的管控矩阵。

生效范围 作用对象 管控粒度 典型场景 定义方
集群级 整个集群 粗 集群升级、节点维护 平台 SRE
命名空间级 指定命名空间 中 环境隔离、业务域管控 业务运维
应用级 指定 Workload 细 核心服务、敏感应用 应用 Owner
范围冲突处理原则: 当多个层级的窗口规则同时生效时,遵循“最严约束优先”原则。例如:集群级窗口允许周二发布,但应用级窗口禁止周二发布,则最终结果为禁止发布。

3.4 窗口定义示例(YAML 配置)

以下是一个基于 K8s CRD 的发布窗口定义示例,展示了如何将时间粒度与生效范围组合为一个可执行的策略对象:

apiVersion: release-window.example.com/v1
kind: ReleaseWindow
metadata:
  name: prod-payment-window
  namespace: payment
spec:
  description: "支付核心服务生产发布窗口"
  # 时间规则:天级窗口 + 小时级时段
  schedule:
    daysOfWeek: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
    startTime: "14:00"
    endTime: "16:00"
    timezone: "Asia/Shanghai"
  # 窗口约束
  constraints:
    maxDurationMinutes: 120
    cooldownMinutes: 30
    blackoutDates:
      - "2025-01-01"   # 元旦
      - "2025-01-28"   # 春节
  # 生效范围:命名空间级 + 应用级
  scope:
    level: "application"
    clusterSelector:
      matchLabels:
        env: production
        region: cn-east
    namespaceSelector:
      matchNames:
        - payment
        - payment-backup
    workloadSelector:
      matchLabels:
        app.kubernetes.io/component: payment-core
  # 准入策略
  admission:
    requireApproval: true
    approverGroup: "payment-sre"
    emergencyBypass: false
关键设计点: 上述配置中 scope.level: "application" 表示窗口精确到应用级;workloadSelector 通过标签选择器匹配目标 Workload,避免硬编码应用名,提升策略的灵活性和可维护性。

3.5 窗口生效逻辑与决策流程

发布流水线在执行部署前,会调用窗口防护模块进行校验。校验流程如下:

  1. 获取当前时间:读取请求发起时刻的 UTC 时间,转换为窗口配置的时区。
  2. 匹配生效范围:根据请求的目标集群、命名空间、应用标签,查找所有匹配的窗口规则。
  3. 合并规则:按“最严约束优先”原则合并多条规则,生成最终的有效窗口。
  4. 时间校验:判断当前时间是否在有效窗口内,是否处于冷却期,是否命中黑名单日期。
  5. 返回决策:通过则放行;拒绝则返回拒绝原因及下次可用窗口时间。
发布窗口校验决策流程 1. 接收发布请求 2. 匹配生效范围 3. 合并窗口规则 4. 时间校验 ✅ 通过 → 放行部署 ❌ 拒绝 → 返回原因
工程落地要点:
  • 窗口规则建议存储在 ConfigMap 或 CRD 中,支持热更新,避免重启防护模块。
  • 时间校验使用 cron 表达式或 ISO 8601 重复时间间隔 标准,便于跨语言解析。
  • 拒绝原因应包含“下次可用窗口时间”,帮助开发者快速调整发布计划。
  • 所有窗口校验结果需记录审计日志,用于事后追溯和窗口利用率分析。