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 |
3.3 窗口的生效范围
生效范围定义了发布窗口在 K8s 平台中的资源作用域。合理的范围设计可以避免“一刀切”式的全局封锁,实现精细化管控。生效范围通常分为三个层级:
3.3.1 集群级范围
窗口规则对整个集群的所有命名空间生效。适用于基础设施变更、集群升级、节点维护等全局操作。集群级窗口通常由平台 SRE 团队定义,变更频率极低。
3.3.2 命名空间级范围
窗口规则仅对指定命名空间生效。这是生产环境中最常用的范围粒度。不同命名空间可以配置不同的窗口策略,例如:
production命名空间:仅周二、周四 14:00-16:00staging命名空间:每天 09:00-18:00canary命名空间:全天开放(用于灰度验证)
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 窗口生效逻辑与决策流程
发布流水线在执行部署前,会调用窗口防护模块进行校验。校验流程如下:
- 获取当前时间:读取请求发起时刻的 UTC 时间,转换为窗口配置的时区。
- 匹配生效范围:根据请求的目标集群、命名空间、应用标签,查找所有匹配的窗口规则。
- 合并规则:按“最严约束优先”原则合并多条规则,生成最终的有效窗口。
- 时间校验:判断当前时间是否在有效窗口内,是否处于冷却期,是否命中黑名单日期。
- 返回决策:通过则放行;拒绝则返回拒绝原因及下次可用窗口时间。
- 窗口规则建议存储在 ConfigMap 或 CRD 中,支持热更新,避免重启防护模块。
- 时间校验使用
cron表达式或ISO 8601 重复时间间隔标准,便于跨语言解析。 - 拒绝原因应包含“下次可用窗口时间”,帮助开发者快速调整发布计划。
- 所有窗口校验结果需记录审计日志,用于事后追溯和窗口利用率分析。