Kubernetes 集群中如何实现灰度发布

阅读时长 6 分钟读完

前言

随着应用程序的更新迭代,我们需要不断地发布新版本以适应业务需求或修复一些 bug。然而,直接在生产环境中发布新版本面临着一定的危险,这就让灰度发布成为了越来越受欢迎的一种部署方式。本文将介绍在 Kubernetes 集群中如何实现灰度发布。

什么是灰度发布

灰度发布,又称金丝雀发布,是指将新版本的程序逐步地推送给一部分用户使用,同时保留旧版本的用户群,将新旧版本用户交替切换,直到全部用户完成版本的升级。

相比全量发布,灰度发布可以最小化影响范围,降低线上事故风险,保证线上业务的稳定性,并可以快速回滚。因此灰度发布在实际应用中非常实用。

Kubernetes 中如何实现灰度发布

下面是一个 Kubernetes 中实现灰度发布的一般流程:

Kubernetes 中有很多种灰度发布的实现方案,这里介绍两种。

方案一:使用 Istio 实现轻量级灰度发布

Istio 是 Kubernetes 中一个非常流行的服务网格框架,并且支持流量管理和灰度发布等特性。下面是一个使用 Istio 来实现轻量级灰度发布的流程图:

具体步骤如下:

  1. 在集群中安装 Istio 服务网格。
  2. 通过 Istio 进行流量切分,将一部分流量导入到新版本的服务中。
  3. 新版本服务验证无误后,逐步提高流量比例,最终全部流量都导入到新版本服务中。

注意:使用 Istio 进行灰度发布需要对 Istio 特性进行了解,配置环境,熟练掌握 K8S 命令等操作。

方案二:使用 Kubernetes 的原生实现搭建灰度发布平台

在没有 Istio 的情况下,可以使用 Kubernetes 的原生实现来搭建灰度发布平台。为了方便演示,我们使用一个基于 Spring Boot 的 Web 应用来进行灰度发布,具体步骤如下:

  1. 创建 deployment 和 service
-- -------------------- ---- -------
----------- -------
----- ----------
---------
  -------
    ---- ------
  ----- ---------
-----
  --------- -
  ---------
    ------------
      ---- ------
  ---------
    ---------
      -------
        ---- ------
        -------- --
    -----
      -----------
      - ----- ------
        ------ ------------------------------
        ---------------- ------
        ------
        - -------------- ----
---
----------- --
----- -------
---------
  ----- ------
-----
  ---------
    ---- ------
  ------
    - --------- ---
      ----- --
      ----------- ----
展开代码
  1. 创建 ingress
-- -------------------- ---- -------
----------- -------------------------
----- -------
---------
  ----- ------
-----
  ------
  - -----
      ------
      - ----- -------
        --------
          ------------ ------
          ------------ --
展开代码
  1. 安装 Nginx Ingress 和 Cert-Manager

Kubernetes 集群可能包含多个 node 节点,Nginx Ingress 可以帮助我们将外部访问负载均衡到多个 Pod 中。而 Cert-Manager 则能够为我们生成证书。

开发者可以简单通过 helm 安装:

  1. 配置灰度发布规则

这里我们使用 nginx-ingress-controller 实现基于 cookie 的灰度发布规则。

通过 Ingress 规则,将请求根据 cookie 值导入到 v1 或 v2 版本的应用中。

-- -------------------- ---- -------
----------- --------------------
----- -------
---------
  ----- ----------------
  ------------
    ------------------------------------------- -
    ------------------------------------- ------
    ------------------------------------------ ----------
-----
  ------
  - -----
      ------
      - ----- -------
        --------
          ------------ ----------------
          ------------ ----
  ---------
    -------
      ----- --------------
      ------ --
  --------
    - --------
        ----- ---------
        -----
          ----- ------
      ------- --
    - --------
        ----- ---------
        -----
          ----- ------
      ------- --
展开代码
  1. 更新版本并验证

我们模拟发布 v2 版本,演示如何逐步切换,使用 Scaling 来增加 v2 应用的流量。

可以通过浏览器 cookie 来观察版本的变化:

更多细节可以参见官方示例

结语

通过本文的介绍,我们了解了在 Kubernetes 中如何实现灰度发布。虽然 Kubernetes 并没有一个通用的方案,但是我们可以通过 Istio 和原生实现的方式来实现。大家可以考虑根据实际情况来选择最优的方案。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6792287c504e4ea9bd5faf29

纠错
反馈

纠错反馈