Kubernetes 本身是否支持 "blue-green" 之类的部署?

Does Kubernetes natively support "blue-green"-like deployments?

我有一个单页应用程序。它由具有 2 个副本的 Kubernetes 部署中的 API 服务器 运行 提供服务(并与之通信)。我添加了一个 X-API-Version header,我的 API 会在每次请求时发送,我的客户端可以与之比较,以确定是否需要通知用户他们的客户端代码已过时。

然而,我面临的一个问题是,当我部署时,我想确保 API 只有一个版本是 运行。我不希望出现客户端可以在循环中多次刷新的情况,因为它接收到不同的 API 版本。

我基本上希望它从 2 个副本 运行 版本 A 到 2 个副本 运行 版本 A,2 运行 版本 B。然后将流量切换到版本 B 一次健康检查通过,那就拆掉老版本A的。

Kubernetes 是否支持使用 RollingDeploy 策略?

我最近开始使用 Kubernetes。我的经验是,是的,K8s 开箱即用。如果我有例如两个 pods 运行 并且我执行部署,K8s 将创建两个新的 pods 然后,只有当这两个 pods 健康时,K8s 才会终止原来的两个 pods.

对于 Kubernetes 中的蓝绿部署,我建议使用一些第三方解决方案,如 Argo Rollouts, NGINX, Istio 等。它们可以让您在应用程序的各个版本之间拆分流量。

但是,Kubernentes 正在引入 Gateway API which has built-in support for traffic splitting

你问的不是真正的 blue/green 部署。如果您在升级期间需要两个 pods 或更多 运行,出于性能问题,您将得到一个重叠,其中版本 A 的一些 pods 响应和版本 B 的一些响应。

您可以对其进行微调,例如您可以将其配置为立即启动所有新的 pods,并且对于从 运行ning->ready 之一转向的每个旧的将被删除。如果您的 pods 启动速度快,或者至少同样快,那么重叠将非常短。

或者,如果您可以接受临时停机,则有一种部署策略可以在推出新的之前完全停用所有旧的 pods。根据您的服务启动速度,这可能会导致停机时间很短或很长。

当然,如果您不介意一点额外的工作,您可以将版本 B 与版本 A 并行部署,并将该版本添加到标签集中。

然后,在您的服务中,确保版本标签是选择器的一部分,一旦版本 B 的 pods 为 运行ning,您将服务选择器从版本 A 更改为版本B,它将立即开始使用这些。