Shipper API参考手册:Application、Release、CapacityTarget等核心对象详解
Shipper是一个Kubernetes原生的多集群蓝绿部署和金丝雀发布工具,它通过扩展Kubernetes API提供了高级的发布策略和多集群编排能力。🚀 本文将详细介绍Shipper的核心API对象,帮助您快速掌握这个强大的Kubernetes发布管理工具。
什么是Shipper?
Shipper是一个Kubernetes扩展,专门用于实现复杂的发布策略和多集群编排。它让您能够使用kubectl来操作代表各种发布策略的对象,如蓝绿部署或金丝雀发布。这些策略可以部署到单个集群,也可以部署到全球多个集群。Shipper通过提供更高级别的API来简化CI/CD流水线脚本,让开发团队专注于应用程序特有的部分。
Application对象:应用管理的核心
Application对象是Shipper管理的核心,代表一个应用程序。在Shipper中,"应用程序"指的是由一个Helm Chart安装的Kubernetes对象集合。
Application规范(Spec)
.spec.revisionHistoryLimit
- 可选字段,表示
.status.history中关联的Release对象数量 - 开发环境可以设置为较小值(如1),生产环境建议设置为较大值(如10或20)
.spec.template
- 必需字段,作为Release对象的模板
- 与Release对象的
.spec.environment具有相同模式 - 支持SemVer约束或特定Chart版本
Application状态(Status)
.status.history
- 属于此Application的Release序列
- 按生成顺序排列:最旧的Release在列表开头,最新的Release(竞争者)在末尾
条件(Conditions)
Aborting:表示是否正在进行中止操作ReleaseSynced:表示竞争者Release是否反映了当前Application状态RollingOut:表示发布是否正在进行中ValidHistory:表示历史记录是否形成有效序列
Release对象:发布过程的管理者
Release对象包含Shipper运行特定版本应用程序所需的所有信息。每个Release都有独特的标签来帮助识别相关资源。
Release规范(Spec)
.spec.targetStep
- 定义此Release应尝试完成的策略步骤
- 用户推进或回滚发布的主要接口
.spec.environment
- 包含应用程序部署所需的所有信息
- 包含Chart定义、集群要求和发布策略
环境配置详解
Chart配置
chart:
name: reviews-api
version: 0.0.1
repoUrl: localhost
集群要求
clusterRequirements:
regions:
- name: foo
- name: bar
capabilities:
- gpu
- pci
发布策略
strategy:
steps:
- name: staging
capacity:
incumbent: 100
contender: 1
traffic:
incumbent: 100
contender: 0
CapacityTarget对象:容量管理的关键
CapacityTarget是Release Controller用于改变应用程序在集群集合中副本数量的接口。它由Capacity Controller处理。
CapacityTarget规范(Spec)
.spec.clusters
- 关联Release对象所在的集群列表
- 每个条目包含集群名称和百分比
- 百分比定义了Release在该集群中相对于最终副本数量的容量
CapacityTarget状态(Status)
.status.clusters
- 表示所有需要安装关联Release对象的集群的容量状态
- 包含可用副本数、实现百分比等信息
条件状态
Operational:集群是否可操作Ready:是否正确数量的Pod正在运行且全部就绪
InstallationTarget对象:安装目标的定义
InstallationTarget描述了应该安装Release的具体集群集合。它由Release Controller的调度器在根据clusterRequirements选择具体集群后创建。
InstallationTarget规范(Spec)
.spec.clusters
- 关联Release应该安装的集群名称列表
- 安装意味着渲染Chart中的所有对象并将其插入集群
InstallationTarget状态(Status)
.status.clusters
- 表示所有需要安装关联Release对象的集群的安装状态
- 包含状态(失败或已安装)和消息信息
条件状态
Operational:集群是否可操作Ready:Kubernetes是否已达到与InstallationTarget对象相关的期望状态
TrafficTarget对象:流量控制的核心
TrafficTarget是基于权重在不同Release之间转移流量的接口。目前仅支持原生Kubernetes流量转移:Pod标签和Service对象。
TrafficTarget规范(Spec)
.spec.clusters
- 集群条目列表以及此Release在该集群中的期望流量权重
- Traffic Controller通过汇总所有可用TrafficTarget对象的权重来计算正确的流量比例
TrafficTarget状态(Status)
.status.clusters
- 表示所有需要安装关联Release对象的集群的流量状态
- 包含实现流量权重等信息
条件状态
Operational:集群是否可操作Ready:是否成功实现了期望的流量权重
Cluster对象:集群配置的基础
Cluster对象代表Shipper可以部署到的Kubernetes集群。它是一个管理接口,用于启用Shipper连接到集群进行管理,并允许管理员影响Release如何调度到此集群。
Cluster规范(Spec)
.spec.apiMaster
- Kubernetes集群API服务器的URL
- Shipper使用此URL连接到集群进行管理
.spec.capabilities
- 必需字段,列出集群具有的能力
- 能力是可用于在发布时选择集群的任意标签
.spec.region
- 必需字段,指定集群所属的区域
.spec.scheduler
unschedulable:可选字段,导致在发布集群选择期间忽略集群weight:可选字段,为集群分配权重,影响发布集群选择期间的优先级identity:可选字段,为集群分配不同于.metadata.name值的身份
实际应用示例
创建Application对象
apiVersion: shipper.booking.com/v1alpha1
kind: Application
metadata:
name: reviewsapi
namespace: default
spec:
revisionHistoryLimit: 10
template:
clusterRequirements:
regions:
- name: eu-west
capabilities: []
chart:
name: nginx
version: 0.1.0
repoUrl: https://chartmuseum.local/charts
values:
replicaCount: 10
strategy:
steps:
- name: staging
capacity:
incumbent: 100
contender: 1
traffic:
incumbent: 100
contender: 0
- name: 50/50
capacity:
incumbent: 50
contender: 50
traffic:
incumbent: 50
contender: 50
- name: full on
capacity:
incumbent: 0
contender: 100
traffic:
incumbent: 0
contender: 100
发布策略详解
Shipper的发布策略允许您定义复杂的发布流程:
-
暂存阶段(Staging)
- 现有版本(incumbent)保持100%容量和流量
- 新版本(contender)仅获得1%容量,0%流量
- 用于验证新版本的基本功能
-
50/50阶段
- 两个版本各获得50%容量和流量
- 用于A/B测试和性能比较
-
完全上线阶段(Full on)
- 新版本获得100%容量和流量
- 旧版本完全下线
核心工作流程
1. 创建Application
用户创建Application对象,定义应用程序的基本配置和发布策略模板。
2. 生成Release
当Application的.spec.template发生变化时,Shipper会自动创建一个新的Release对象。
3. 调度集群
Release Controller根据clusterRequirements选择目标集群,并创建InstallationTarget。
4. 安装应用程序
Installation Controller在目标集群中安装Chart。
5. 调整容量
Capacity Controller根据策略步骤调整每个集群中的副本数量。
6. 转移流量
Traffic Controller根据策略步骤调整流量权重。
7. 完成发布
当所有策略步骤都完成后,发布完成。
最佳实践建议
1. 版本控制
- 使用SemVer约束来指定Chart版本范围
- 保留足够的发布历史以便回滚
2. 集群管理
- 为集群定义清晰的能力标签
- 使用区域标签进行地理分布管理
3. 发布策略
- 从小规模开始,逐步扩大
- 在每个阶段都设置适当的监控和验证
- 确保有完整的回滚计划
4. 监控和调试
- 定期检查各对象的
.status字段 - 关注条件(Conditions)状态变化
- 使用标签进行资源追踪
常见问题解决
发布卡住
检查Release的.status.conditions,查看是否有Blocked条件为True,这可能表示存在发布阻塞。
容量不匹配
检查CapacityTarget的.status.clusters,确认每个集群的achievedPercent是否达到期望值。
流量转移失败
检查TrafficTarget的.status.clusters,确认achievedTraffic是否匹配期望权重。
安装失败
检查InstallationTarget的.status.clusters,查看失败的具体原因和错误消息。
总结
Shipper通过提供一组精心设计的API对象,为Kubernetes带来了强大的多集群发布管理能力。Application、Release、CapacityTarget、InstallationTarget和TrafficTarget等核心对象共同构成了一个完整的发布管理系统。🎯
掌握这些API对象的使用方法,您将能够:
- 实现复杂的蓝绿部署和金丝雀发布策略
- 管理跨多个集群的应用程序部署
- 精确控制容量和流量转移
- 实现安全的回滚机制
- 构建可靠的CI/CD流水线
通过合理配置这些对象,您可以构建出既灵活又可靠的发布流程,确保应用程序的平稳部署和更新。💪
了解更多Shipper的详细信息,请参考官方文档:docs/api-reference/
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



