- 后端
- DevOps
- 云原生
- 微服务
【免费下载链接】spinnaker
Spinnaker is an open source, multi-cloud continuous delivery platform for releasing software changes with high velocity and confidence.
Deployment Monitor(部署监控器)是 Spinnaker Orca 中「受监控部署(Monitored Deploy)」策略的核心外部组件:它由第三方服务实现,在部署进行的关键节点接收 Orca 发来的 HTTP 回调,并依据对新实例健康状态的分析结果来决定部署是继续、暂停等待、直接完成还是中止回滚。本文以 orca-deploymentmonitor/readme.md 为骨架,结合模块源码,完整说明部署监控器的三端点接口、请求/响应数据结构、orca.yml注册配置,以及 Orca 内部的调用链路,读者读完后可以独立实现一个符合规范的 Deployment Monitor 并接入 Orca。
一、背景:Monitored Deploy 策略与 Deployment Monitor 的定位
在 Spinnaker 的部署流程中,monitored是一种特殊的高阶部署策略:部署不是按固定的容量百分比盲推进,而是每完成一个部署步骤后暂停,交由外部的健康评估服务判断新实例是否健康、能否继续。这一策略由 MonitoredDeployStrategy.groovy 实现(类上标注了@ConditionalOnProperty(value = "monitored-deploy.enabled"),即只有启用该配置时策略才生效),其中:
- 部署前会将容量(
capacity)置为min: 0, max: 0, desired: 0,先创建空的新服务器组; - 随后按照
deploySteps(如 10%、20%、……、100%)逐步扩容,每一步之间都插入健康评估环节; - 部署过程中会动态编排
NotifyDeployStartingStage、EvaluateDeploymentHealthStage、NotifyDeployCompletedStage等合成阶段,分别对应下文介绍的三个回调端点。
Deployment Monitor 的职责:它由第三方(如日志监控、金丝雀分析、自定义健康评分服务)实现,为受监控部署提供「新实例健康/状态」这一输入。Orca 本身不评判健康,只负责在正确的时机把部署上下文发给监控器,并根据监控器的指令决定下一步动作。
二、Deployment Monitor 接口:三个必须暴露的 HTTP 端点
监控器必须以POST方式暴露三个端点。Orca 侧的接口定义见 DeploymentMonitorService.java,这是用 Retrofit 声明的客户端契约:
public interface DeploymentMonitorService { @POST("deployment/starting") Call<EvaluateHealthResponse> notifyStarting(@Body RequestBase request); @POST("deployment/completed") Call<ResponseBody> notifyCompleted(@Body DeploymentCompletedRequest request); @POST("deployment/evaluateHealth") Call<EvaluateHealthResponse> evaluateHealth(@Body EvaluateHealthRequest request); }三个端点相对于baseUrl拼接,具体语义如下:
1.POST /deployment/starting—— 部署启动通知
Orca 在受监控部署开始时调用此端点。此时监控器可以中止整个部署——例如,当它发现自身并没有被配置为监控当前应用时,可以返回abort让部署立即终止,避免出现「无人监控却继续灰度」的危险局面。
2.POST /deployment/completed—— 部署完成通知
Orca 在部署流程结束(无论成功或失败)时调用此端点。它纯粹是信息性通知:监控器的响应会被忽略,不会影响流程。请求中携带部署结果状态,见下文数据结构。
3.POST /deployment/evaluateHealth—— 部署步骤健康评估
Orca 每完成一个部署步骤(例如扩到 10%)后调用此端点。这是受监控部署中最关键的决策点,监控器可以在此时返回四种指令之一(对应 EvaluateHealthResponse.java 中的NextStepDirective枚举):
| 指令(JSON 值) | 含义 | 效果 |
|---|---|---|
wait | 健康尚无法确定,需要更多时间评估(例如约需 10 分钟观察新实例日志) | Orca 等待一段时间后重试(代码注释给出的重试间隔约为 30 秒),重试总时长受maxAnalysisMinutes约束 |
abort | 健康状态差 | 终止部署;如果用户在阶段配置中请求了回滚,将触发回滚 |
continue | 健康良好 | 按默认逻辑继续下一步部署 |
complete | 健康极佳(或策略要求) | 跳过中间步骤,直接部署到 100% |
注:
UNSPECIFIED是内部占位值,监控器不应返回;如果未指定,Orca 会走常规异常处理路径。
每次evaluateHealth调用还携带currentProgress(当前已部署百分比),监控器可以据此判断当前处于哪个部署步骤。
三、请求与响应的数据结构
3.1 通用请求字段(RequestBase)
所有三个端点的请求都包含部署上下文,字段定义见 RequestBase.java:
| 字段 | 含义 | 来源说明 |
|---|---|---|
application | 正在部署的应用名 | 取自执行(execution)的应用 |
executionId | 本次流水线执行的 ID | 同一流水线内多次调用(starting / completed / evaluateHealth)保持不变;例如一条流水线中用受监控策略部署 3 个集群,它们的executionId相同 |
stageId | 阶段 ID,始终唯一 | notifyStarting与evaluateHealth对同一集群部署的stageId不同;但对同一部署步骤(同一百分比)的多次evaluateHealth重试,stageId保持不变 |
deploymentId | 部署 ID | 对给定集群部署的所有监控调用保持不变(源码中取父阶段 ID) |
oldServerGroup | 旧服务器组名称 | 来自内部阶段数据 |
newServerGroup | 新服务器组名称 | 同上 |
account | 新服务器组所属账户 | 同上 |
region | 新服务器组所在区域 | 同上 |
cloudProvider | 使用的云提供商 | 同上 |
parameters | 用户在流水线阶段配置中指定的参数 | 不透明 Map,Spinnaker 本身不使用,直接透传给监控器 |
一个POST /deployment/starting的请求体示例(JSON 序列化后):
{ "application": "myapp", "executionId": "exec-12345", "stageId": "stage-67890", "deploymentId": "deploy-24680", "oldServerGroup": "myapp-v001", "newServerGroup": "myapp-v002", "account": "prod", "region": "us-west-2", "cloudProvider": "aws", "parameters": { "allowedErrorRate": "0.5", "warmupMinutes": "10" } }3.2evaluateHealth的专属字段(EvaluateHealthRequest)
在RequestBase基础上增加两个字段,见 EvaluateHealthRequest.java:
newInstances:新实例 ID 列表(源码中标注了TODO(mvulfson),说明当前实现尚未填充该字段);currentProgress:当前已部署百分比(取自内部阶段数据currentProgress)。
3.3completed的专属字段(DeploymentCompletedRequest)
见 DeploymentCompletedRequest.java,在RequestBase基础上增加:
status:部署状态,取值为success/failure/not_performed(枚举DeploymentStatus);rollback:回滚操作的状态,取值同上(若用户未请求回滚则为not_performed)。
示例:
{ "application": "myapp", "executionId": "exec-12345", "stageId": "stage-67890", "deploymentId": "deploy-24680", "oldServerGroup": "myapp-v001", "newServerGroup": "myapp-v002", "account": "prod", "region": "us-west-2", "cloudProvider": "aws", "parameters": {}, "status": "success", "rollback": "not_performed" }3.4evaluateHealth的响应结构(EvaluateHealthResponse)
监控器对/deployment/starting与/deployment/evaluateHealth均返回EvaluateHealthResponse,包含两个字段(见 EvaluateHealthResponse.java):
nextStep:类型为DeploymentStep(见 DeploymentStep.java),包含percent(希望下一步部署到的百分比)、instanceCount(实例数)、directive(abort/complete/continue/wait);statusReason:类型为StatusReason,用于说明决策原因(见下文)。
响应示例(健康未就绪,请求稍后重试):
{ "nextStep": { "percent": 10, "instanceCount": 3, "directive": "wait" }, "statusReason": { "message": "New instances are still warming up, re-evaluating in ~30s", "logSummary": [ "3/3 instances in service", "error rate within threshold" ], "additionalData": [ { "key": "dashboard", "text": "View deployment dashboard", "link": "http://logmonitor.example.com/dashboards/myapp-v002" } ] } }3.5 决策原因说明(StatusReason)
监控器应当(尤其是在失败场景下)在响应中携带决策原因,见 StatusReason.java:
message:人类可读的原因描述;logSummary:日志摘要列表,帮助用户理解评估依据;additionalData:附加数据列表,每项包含key、text、link(见 StatusAdditionalData.java),可携带指向监控面板的超链接。
这些信息会展示在 Deck(Spinnaker UI)中,让用户清楚理解部署为何按当前方式推进——例如「因错误率超标而中止」而非看起来毫无理由的失败。
四、监控器注册:orca.yml中的白名单机制
部署监控器必须先注册到orca.yml中才会被使用。这是一种安全机制:Orca 不希望部署过程中随意请求未知 URL。配置绑定类为 MonitoredDeployConfigurationProperties.java,前缀为monitored-deploy(Spring Boot 松绑定下,文档中的monitoredDeploy写法同样可解析)。
完整的注册示例(继承自原文档):
monitoredDeploy: enabled: true deploymentMonitors: - id: id1 name: LiveLogMonitor baseUrl: http://logmonitor.aws.com/spinnaker failOnError: false maxAnalysisMinutes: 40 - id: id2 name: LocalTestMonitore baseUrl: http://localhost:8080/v1 failOnError: true maxAnalysisMinutes: 10参数说明(结合 DeploymentMonitorDefinition.java 补充源码确认的默认值与额外字段):
| 参数 | 含义 | 备注 / 默认值 |
|---|---|---|
id | 监控器唯一 ID,在阶段 JSON 中通过该 ID 引用 | 必填;未注册的 ID 会导致UserException: Deployment monitor not configured, ID: xxx |
name | 用户友好名称,展示在 Deck UI 中 | 必填 |
baseUrl | 监控器 API 的基础 URL | 三个端点拼接在其后,如http://host/v1/deployment/starting |
failOnError | 与监控器通信失败时是否视为部署失败(并中止部署) | 源码默认值为true;原文档建议该值始终为true,避免健康评估静默失效 |
maxAnalysisMinutes | 允许健康评估的最长时间(分钟) | 默认值为 30(DEFAULT_MAX_ANALYSIS_MINUTES = 30);超时未得到有效响应将导致部署失败;该参数同时约束/starting与/evaluateHealth两个端点的响应时限 |
除上述字段外,DeploymentMonitorDefinition.java 还定义了源码级的两个可选字段:
supportContact:支持/联系信息链接(展示在 UI 中,便于用户在部署失败时快速找到监控器负责人);stable:标记监控器是否稳定;stable = false的监控器不会出现在 Deck UI 的下拉列表中,但仍可在阶段 JSON 中直接引用(相当于灰度准入机制)。
五、Orca 内部调用链路与验证
5.1 客户端工厂:DeploymentMonitorServiceProvider
DeploymentMonitorServiceProvider.java 负责按注册表创建并缓存监控器客户端:
- 启动时打印所有已注册监控器的名称日志;
getDefinitionById(id)按 ID 查找定义,找不到时抛出用户异常,防止阶段引用未注册监控器;getServiceByDefinition通过ServiceClientProvider基于baseUrl创建 Retrofit 服务实例,并以id为键缓存(serviceCache),同一监控器复用同一客户端连接。
在 MonitoredDeployStrategy.groovy 的composeBeforeStages中可以看到:部署真正开始前,Orca 会先调用deploymentMonitorServiceProvider.getDefinitionById(stageData.deploymentMonitor.id)校验阶段引用的监控器是否已注册——校验失败则提前中止,这正是注册白名单机制的落地实现。
5.2 阶段级参数与覆盖
监控器不仅可以在全局orca.yml注册,还可以在单个部署阶段的 JSON 中携带实例级配置,见 DeploymentMonitorStageConfig.java:
id:引用已注册监控器的 ID;parameters:不透明参数 Map,随每个请求透传给监控器(见RequestBase.parameters);maxAnalysisMinutesOverride:针对本次部署覆盖全局maxAnalysisMinutes;failOnErrorOverride:针对本次部署覆盖全局failOnError。
这为不同应用/不同流水线使用不同评估策略提供了灵活性。
5.3 超时与重试行为
从代码注释可以确认完整的等待语义:
- 监控器返回
wait后,Orca 大约等待30 秒(~30s)后重新调用evaluateHealth; - 重试不能无限进行:对于每个监控器,健康评估的总时长上限是
maxAnalysisMinutes(未配置时默认30 分钟); - 若监控器在时限内持续以 HTTP 错误响应或干脆不响应,且
failOnError = true,部署将被判定失败并终止。
这意味着监控器实现应把「评估中」的状态尽快以wait返回,而不是长时间阻塞 HTTP 请求,从而把超时控制权留给 Orca 侧。
5.4 测试佐证
模块内包含单元测试 DeploymentMonitorCapabilitiesSpec.groovy,用于验证监控器定义/能力解析等逻辑,可作为实现同类功能时的参考。
六、最小可运行实现要点(实战清单)
基于以上契约,实现一个 Deployment Monitor 的最小清单如下:
- 实现三个
POST端点:/deployment/starting、/deployment/evaluateHealth、/deployment/completed,路径拼在注册时的baseUrl之后; - 正确解析请求 JSON:三个端点共享
RequestBase中的部署上下文字段;evaluateHealth额外有currentProgress与newInstances(当前为空列表);completed额外有status与rollback; - 在
evaluateHealth中返回四选一指令:wait(评估中)、continue(健康,继续)、complete(直接 100%)、abort(不健康,终止); - 总是携带
statusReason:给出message与可选的logSummary/additionalData,让 Deck UI 能向用户解释部署决策; - 评估耗时不要超过
maxAnalysisMinutes:评估过程通过wait+ 快速重试表达,超时由 Orca 兜底判定失败; - 在
orca.yml中注册并启用:配置monitoredDeploy.enabled: true,为每个监控器分配唯一id、baseUrl,按需设置failOnError(建议true)与maxAnalysisMinutes; - 在部署阶段 JSON 中按
id引用监控器:可通过阶段级parameters、maxAnalysisMinutesOverride、failOnErrorOverride做单次部署的定制。
七、总结
Deployment Monitor 是 Spinnaker Orca 受监控部署策略与外部健康评估能力之间的标准接口:Orca 负责节奏控制与超时兜底,第三方监控器负责真正的健康判断,二者通过三个明确的 HTTP 端点和一套完整的 JSON 数据结构解耦协作。接入方只需实现端点、返回合规指令,并在orca.yml完成注册,即可让 Spinnaker 的部署流程具备「按真实健康状态驱动灰度推进、必要时自动中止或直达 100%」的能力。更多细节可继续阅读 orca-deploymentmonitor/readme.md 及其同目录下的源码与测试。
- 后端
- DevOps
- 云原生
- 微服务
【免费下载链接】spinnaker
Spinnaker is an open source, multi-cloud continuous delivery platform for releasing software changes with high velocity and confidence.
相关推荐
Magic Resume部署监控:健康检查与自动回滚机制
Magic Resume部署监控:健康检查与自动回滚机制 ? 引言:为什么需要专业的部署监控? 在现代Web应用部署中,简历编辑器这类关键业务系统对稳定性和可用
前端AI 应用开发工具Tortoise-TTS模型部署监控:健康检查与自动恢复机制
Tortoise TTS模型部署监控:健康检查与自动恢复机制 在Tortoise TTS(文本转语音)模型的实际部署中,服务稳定性直接影响用户体验。本文将从健康
人工智能语音音频Voyager 資料夾管理指南:為 Gemini 與 AI Studio 的 AI 對話打造真正的「檔案系統」
Voyager 資料夾管理指南:為 Gemini 與 AI Studio 的 AI 對話打造真正的「檔案系統」 整理 AI 聊天記錄,以前為什麼那麼難?Voya
AI 应用前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考