前言
随着应用程序的更新迭代,我们需要不断地发布新版本以适应业务需求或修复一些 bug。然而,直接在生产环境中发布新版本面临着一定的危险,这就让灰度发布成为了越来越受欢迎的一种部署方式。本文将介绍在 Kubernetes 集群中如何实现灰度发布。
什么是灰度发布
灰度发布,又称金丝雀发布,是指将新版本的程序逐步地推送给一部分用户使用,同时保留旧版本的用户群,将新旧版本用户交替切换,直到全部用户完成版本的升级。
相比全量发布,灰度发布可以最小化影响范围,降低线上事故风险,保证线上业务的稳定性,并可以快速回滚。因此灰度发布在实际应用中非常实用。
Kubernetes 中如何实现灰度发布
下面是一个 Kubernetes 中实现灰度发布的一般流程:
Kubernetes 中有很多种灰度发布的实现方案,这里介绍两种。
方案一:使用 Istio 实现轻量级灰度发布
Istio 是 Kubernetes 中一个非常流行的服务网格框架,并且支持流量管理和灰度发布等特性。下面是一个使用 Istio 来实现轻量级灰度发布的流程图:
具体步骤如下:
- 在集群中安装 Istio 服务网格。
- 通过 Istio 进行流量切分,将一部分流量导入到新版本的服务中。
- 新版本服务验证无误后,逐步提高流量比例,最终全部流量都导入到新版本服务中。
注意:使用 Istio 进行灰度发布需要对 Istio 特性进行了解,配置环境,熟练掌握 K8S 命令等操作。
方案二:使用 Kubernetes 的原生实现搭建灰度发布平台
在没有 Istio 的情况下,可以使用 Kubernetes 的原生实现来搭建灰度发布平台。为了方便演示,我们使用一个基于 Spring Boot 的 Web 应用来进行灰度发布,具体步骤如下:
- 创建 deployment 和 service
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ------- ---- ------ ----- --------- ----- --------- - --------- ------------ ---- ------ --------- --------- ------- ---- ------ -------- -- ----- ----------- - ----- ------ ------ ------------------------------ ---------------- ------ ------ - -------------- ---- --- ----------- -- ----- ------- --------- ----- ------ ----- --------- ---- ------ ------ - --------- --- ----- -- ----------- ----展开代码
- 创建 ingress
-- -------------------- ---- ------- ----------- ------------------------- ----- ------- --------- ----- ------ ----- ------ - ----- ------ - ----- ------- -------- ------------ ------ ------------ --展开代码
- 安装 Nginx Ingress 和 Cert-Manager
Kubernetes 集群可能包含多个 node 节点,Nginx Ingress 可以帮助我们将外部访问负载均衡到多个 Pod 中。而 Cert-Manager 则能够为我们生成证书。
开发者可以简单通过 helm
安装:
helm install nginx-ingress stable/nginx-ingress -n ingress-nginx -f values.yaml helm install cert-manager jetstack/cert-manager -n cert-manager --create-namespace --set installCRDs=true
- 配置灰度发布规则
这里我们使用 nginx-ingress-controller 实现基于 cookie 的灰度发布规则。
通过 Ingress 规则,将请求根据 cookie 值导入到 v1 或 v2 版本的应用中。
-- -------------------- ---- ------- ----------- -------------------- ----- ------- --------- ----- ---------------- ------------ ------------------------------------------- - ------------------------------------- ------ ------------------------------------------ ---------- ----- ------ - ----- ------ - ----- ------- -------- ------------ ---------------- ------------ ---- --------- ------- ----- -------------- ------ -- -------- - -------- ----- --------- ----- ----- ------ ------- -- - -------- ----- --------- ----- ----- ------ ------- --展开代码
- 更新版本并验证
我们模拟发布 v2 版本,演示如何逐步切换,使用 Scaling 来增加 v2 应用的流量。
kubectl apply -f webapp-v2-deployment.yaml kubectl scale deployment webapp-v2 --replicas=3
可以通过浏览器 cookie 来观察版本的变化:
更多细节可以参见官方示例。
结语
通过本文的介绍,我们了解了在 Kubernetes 中如何实现灰度发布。虽然 Kubernetes 并没有一个通用的方案,但是我们可以通过 Istio 和原生实现的方式来实现。大家可以考虑根据实际情况来选择最优的方案。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6792287c504e4ea9bd5faf29