Application Blue Green Deployment
在现代软件开发中,部署应用的新版本是开发周期中的关键环节。然而,将更新推送到生产环境可能存在风险,因为即使是小问题也可能导致严重的停机和收入损失。蓝绿发布(Blue-Green Deployments)是一种部署策略,通过确保应用新版本能够实现零停机部署,从而降低这种风险。
蓝绿发布是一种部署策略,设置两个相同的环境,即“蓝色”环境和“绿色”环境。蓝色环境是当前运行应用的生产环境,绿色环境是非生产环境,用于部署应用的新版本。
当应用的新版本准备好部署时,会先部署到绿色环境。新版本部署并测试完成后,流量切换到绿色环境,使其成为新的生产环境。蓝色环境则变为非生产环境,用于部署未来的应用版本。
蓝绿发布的优势
- 零停机:蓝绿发布允许应用新版本实现零停机部署,因为流量会无缝切换从蓝色环境到绿色环境。
- 简单回滚:如果新版本出现问题,可以轻松回滚到之前的版本,因为蓝色环境仍然可用。
- 降低风险:通过蓝绿发布,可以显著降低部署新版本的风险。新版本先在绿色环境部署和测试,确保流量切换前经过充分验证,减少生产环境出现问题的可能。
- 提高可靠性:蓝绿发布提高了应用的可靠性,因为蓝色环境始终可用,绿色环境出现问题时可以快速发现并解决,不影响用户。
- 灵活性:蓝绿发布为部署过程提供灵活性,可以并行部署多个版本,方便测试和实验。
使用 Argo Rollouts 实现蓝绿发布
Argo Rollouts 是一个 Kubernetes 控制器和一组 CRD,提供蓝绿发布、金丝雀发布、金丝雀分析、实验和渐进式交付等高级部署功能。
Argo Rollouts(可选)集成了 ingress 控制器和服务网格,利用它们的流量控制能力,在更新过程中逐步切换流量到新版本。此外,Rollouts 可以查询和解析来自多种提供者的指标,验证关键 KPI,并在更新过程中驱动自动升级或回滚。
通过 Argo Rollouts,您可以在 Alauda Container Platform (ACP) 集群上自动化蓝绿发布。典型流程包括:
- 定义 Rollout 资源以管理不同的应用版本。
- 配置 Kubernetes 服务以在蓝色(当前)和绿色(新)环境之间路由流量。
- 将新版本部署到绿色环境。
- 验证和测试新版本。
- 通过切换流量将绿色环境提升为生产环境。
该方法最大限度减少停机时间,实现受控且安全的部署。
关键概念:
- Rollout:Kubernetes 中的自定义资源定义(CRD),替代标准 Deployment 资源,实现蓝绿、金丝雀等高级部署控制。
前提条件
- ACP(Alauda Container Platform)。
- 由 ACP 管理的 Kubernetes 集群。
- 集群中已安装 Argo Rollouts。
- 安装 Argo Rollouts 的 kubectl 插件。
- 一个用于创建命名空间的项目。
- 集群中用于部署应用的命名空间。
操作步骤
创建部署
首先定义应用的“蓝色”版本,即用户当前访问的版本。创建一个 Kubernetes Deployment,指定合适的副本数、容器镜像版本(例如 hello:1.23.1)以及合适的标签,如 app=web。
使用以下 YAML:
YAML 字段说明:
apiVersion:创建资源所用的 Kubernetes API 版本。kind:资源类型,这里是 Deployment。metadata.name:部署名称。spec.replicas:期望的 Pod 副本数。spec.selector.matchLabels:Deployment 用于管理 Pod 的标签选择器。template.metadata.labels:Pod 上应用的标签,Service 用于选择 Pod。spec.containers:Pod 中运行的容器列表。containers.name:容器名称。containers.image:容器镜像。containers.ports.containerPort:容器暴露的端口。
使用 kubectl 应用配置:
这将搭建生产环境。
也可以使用 Helm Chart 创建部署和服务。
创建蓝色服务
创建一个 Kubernetes Service,用于暴露蓝色部署。该服务根据标签选择器将流量转发到蓝色 Pod。初始时,服务选择器指向标签为 app=web 的 Pod。
YAML 字段说明:
apiVersion:创建 Service 所用的 Kubernetes API 版本。kind:资源类型,这里是 Service。metadata.name:Service 名称。spec.selector:用于选择接收流量的 Pod 标签。ports.protocol:使用的协议(TCP)。ports.port:Service 暴露的端口。ports.targetPort:容器接收流量的端口。
使用以下命令应用:
这允许外部访问蓝色部署。
验证蓝色部署
通过列出 Pod 确认蓝色部署运行正常:
检查所有预期副本(2 个)处于 Running 状态,确保应用已准备好提供服务。
验证流量路由到蓝色
确认 web 服务正确将流量转发到蓝色部署,执行:
输出应列出蓝色 Pod 的 IP 地址,这些即为接收流量的端点。
创建 Rollout
接下来,创建 Argo Rollouts 的 Rollout 资源,采用 BlueGreen 策略。
YAML 字段说明:
spec.selector:Pod 标签选择器。现有 ReplicaSet 中被此选择器选中的 Pod 将受此 Rollout 影响,必须与 Pod 模板标签匹配。workloadRef:指定工作负载引用及缩容策略。scaleDown:指定迁移到 Rollout 后是否缩减 Deployment,选项包括:"never":不缩减 Deployment。"onsuccess":Rollout 健康后缩减 Deployment。"progressively":Rollout 扩容时逐步缩减 Deployment,失败时恢复 Deployment。
strategy:部署策略,支持BlueGreen和Canary。blueGreen:蓝绿发布策略定义。activeService:指定升级时更新模板哈希的服务,蓝绿策略必填。autoPromotionEnabled:禁用自动升级,发布前暂停 Rollout。默认行为是 ReplicaSet 完全就绪后自动升级。可用命令kubectl argo rollouts promote ROLLOUT恢复。
使用以下命令应用:
这将为部署设置蓝绿策略的 Rollout。
验证 Rollout
创建 Rollout 后,Argo Rollouts 会创建一个与 Deployment 模板相同的新 ReplicaSet。当新 ReplicaSet 的 Pod 健康时,Deployment 会缩减到 0。
使用以下命令确认 Pod 正常运行:
web 服务将流量转发给 Rollouts 创建的 Pod。使用命令:
准备绿色部署
接下来,准备应用的新版本作为绿色部署。更新 web Deployment 的镜像版本(例如 hello:1.23.2)。
YAML 字段说明:
- 与原部署相同,唯一不同的是:
containers.image:更新为新镜像版本。
使用以下命令应用:
这将为测试准备新版本应用。
Rollouts 会创建新的 ReplicaSet 管理绿色 Pod,流量仍然转发到蓝色 Pod。使用以下命令验证:
当前有 4 个 Pod 运行,分别是蓝色和绿色版本。活跃服务指向蓝色版本,Rollout 处于暂停状态。
如果使用 Helm Chart 部署应用,可使用 Helm 工具升级到绿色版本。
升级 Rollout 到绿色版本
当绿色版本准备就绪,执行升级操作,将流量切换到绿色 Pod。使用命令:
验证升级是否完成:
如果活跃的 Images 更新为 hello:1.23.2,且蓝色 ReplicaSet 缩减为 0,表示升级完成。