k8s 灰度发布

概念

KubeSphere 服务网格基于开源项目 Istio 构建,可以控制应用程序不同部分之间的通信方式。其中,灰度发布策略为用户在不影响微服务之间通信的情况下测试和发布新的应用版本发挥了重要作用。

服务网格

服务网格基于 Istio,将微服务治理和流量管理可视化。它拥有强大的工具包,包括熔断机制、蓝绿部署、金丝雀发布、流量镜像、链路追踪、可观测性和流量控制等。

istio

架构

Istio 服务网格从逻辑上分为数据平面控制平面

  • 数据平面 由一组智能代理(Envoy)组成,被部署为 Sidecar。这些代理负责协调和控制微服务之间的所有网络通信。它们还收集和报告所有网格流量的遥测数据。

    组件一: Envoy 特性动态服务发现、负载均衡、TLS 终端、HTTP/2 与 gRPC 代理、熔断器、健康检查、基于百分比流量分割的分阶段发布、故障注入、丰富的指标。

  • 控制平面 管理并配置代理来进行流量路由。

    组件二:Istiod 提供服务发现、配置和证书管理。

部署模型
  • 集群模型:单一/多集群
  • 网络模型:单一/多网络
  • 控制平面模型
  • 身份和信任模型:网格内/网格之间信任
  • 网格模型:单一/多网格
  • 租户模型:命名空间租赁/集群租户模型
Ingress

控制 Istio 服务网格的入口流量。

Egress

控制 Istio 服务网格的出口流量。

灰度发布策略

当您在 KubeSphere 中升级应用至新版本时,灰度发布可以确保平稳过渡。采用的具体策略可能不同,但最终目标相同,即提前识别潜在问题,避免影响在生产环境中运行的应用。这样不仅可以将版本升级的风险降到最低,还能测试应用新构建版本的性能。

蓝绿部署

蓝绿发布提供零宕机部署,即在保留旧版本的同时部署新版本。在任何时候,只有其中一个版本处于活跃状态,接收所有流量,另一个版本保持空闲状态。如果运行出现问题,您可以快速回滚到旧版本。

  • 特点:任何时刻只有一个环境接收流量。

金丝雀发布

控制一部分流量到新的环境,待确认没问题,便可把所有流量转移到新环境。

  • 特点:流量逐步转移,风险降到最低。

流量镜像

复制实时产生的流量推送至新部署的镜像环境。

  • 特点:可以对比新旧环境流量处理的效率,测试集群,测试数据库。

实战

部署Bookinfo示例应用

  1. 启用服务组件Istio

  2. 创建一个项目

  3. 为新建的项目设置网关: 项目设置-->高级设置-->设置网关-->NodePort/LoadBalancer

  4. 应用负载-->应用模版-->如何使用应用治理--部署示例应用然后一路下一步即可

  5. 应用负载-->自制应用-->bookinfo-->点击访问进行访问应用

    访问地址http://productpage.exxk-lab.10.25.24.12.nip.io:31612/分析:

    productpage.exxk-lab.10.25.24.12.nip.io:31612是dns泛域名,nip.io是一个免费域名解析服务,会自动指向10.25.24.12不需要配置hosts映射文件。

给部署的服务添加网关,并设置统一的前缀

  1. 为新建的项目设置网关: 项目设置-->高级设置-->设置网关-->NodePort

  2. 添加路由:应用负载-->应用路由-->创建

    指定域名:server-name.10.255.242.18.nip.io

    指定路径(统一前缀):/前缀(/|$)(.*)

    指定路径(不加前缀):/

    添加注解(统一前缀):nginx.ingress.kubernetes.io/app-root=/前缀nginx.ingress.kubernetes.io/rewrite-target=/$2

    对应的配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    kind: Ingress
    apiVersion: extensions/v1beta1
    metadata:
    name: transport-server
    namespace: transport-server
    annotations:
    kubesphere.io/creator: '81003863'
    nginx.ingress.kubernetes.io/app-root: /transport
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    spec:
    rules:
    - host: transport-server.10.255.242.18.nip.io
    http:
    paths:
    - path: /transport(/|$)(.*)
    pathType: ImplementationSpecific
    backend:
    serviceName: transport-manage
    servicePort: 8088

参考

ingress-nginx 中 Rewrite 的使用