Istio 流量管理核心资源

核心资源:

  • VirtualService(虚拟服务)

  • DestinationRule(目标规则)

  • Gateway(网关)

  • ServiceEntry(服务入口)

VirtualService

VirtualService(虚拟服务):

  • 定义路由规则

  • 描述满足条件的请求去哪里

kubectl get vs # 查看已创建的虚拟服务

DestinationRule

DestinationRule(目标规则):定义虚拟服务路由目标地址的 真实地址,即子集(subset),支持多种负载均衡策略:

  • 随机

  • 权重

  • 最小请求数

Gateway

Gateway(网关):为网格内服务对外访问入口,管理进出网格的流量,根据流入流出方向分为:

  • IngressGateway:接收外部访问,并将流量转发到网格内的服务。

  • EgressGateway:网格内服务访问外部应用。

Gateway(网关)与Kubernetes Ingress有什么区别?

Kubernetes Ingress与Getaway都是用于为集群内服务提供访问入口, 但Ingress主要功能比较单一,不易于Istio现有流量管理功能集成。

目前Gateway支持的功能:

  • 支持L4-L7的负载均衡

  • 支持HTTPS和mTLS

  • 支持流量镜像、熔断等

ServiceEntry

ServiceEntry(服务入口):将网格外部服务添加到网格内, 像网格内其他服务一样管理。

Istio 流量管理案例(主流发布方案介绍,灰度发布,流量镜像)

主流发布方案介绍

主流发布方案:

  • 蓝绿发布

  • 滚动发布

  • 灰度发布(金丝雀发布)

  • A/B Test

蓝绿发布

项目逻辑上分为AB组,在项目升级时,首先把A组从负载均衡 中摘除,进行新版本的部署。B组仍然继续提供服务。A组升级 完成上线,B组从负载均衡中摘除。

特点:

  • 策略简单

  • 升级/回滚速度快

  • 用户无感知,平滑过渡

缺点:

  • 需要两倍以上服务器资源

  • 短时间内浪费一定资源成本

  • 有问题影响范围大

滚动发布

每次只升级一个或多个服务,升级完成后加入生产环境, 不断执行这个过程,直到集群中的全部旧版升级新版本。 Kubernetes的默认发布策略。

特点:

  • 用户无感知,平滑过渡

缺点:

  • 部署周期长

  • 发布策略较复杂

  • 不易回滚

  • 有影响范围较大

灰度发布(金丝雀发布)

只升级部分服务,即让一部分用户继续用老版本,一部分用户 开始用新版本,如果用户对新版本没有什么意见,那么逐步扩 大范围,把所有用户都迁移到新版本上面来。

特点:

  • 保证整体系统稳定性

  • 用户无感知,平滑过渡

缺点:

  • 自动化要求高

灰度发布

A/B Test

灰度发布的一种方式,主要对特定用户采样后,对收集到的反 馈数据做相关对比,然后根据比对结果作出决策。用来测试应 用功能表现的方法,侧重应用的可用性,受欢迎程度等,最后 决定是否升级。

灰度发布:部署Bookinfo微服务项目

Bookinfo 是官方提供一个图书评测系统微服务项目示例,

分为四个微服务:

1、创建命名空间并开启自动注入

kubectl create ns bookinfo
kubectl label namespace bookinfo istio-injection=enabled

2、部署应用YAML

cd istio-1.8.2/samples/bookinfo
kubectl apply -f platform/kube/bookinfo.yaml -n bookinfo
kubectl get pod -n bookinfo

3、创建Ingress网关

kubectl apply -f networking/bookinfo-gateway.yaml -n bookinfo

4、确认网关和访问地址,访问应用页面

kubectl get pod,svc -n istio-system 

访问地址:http://192.168.1.11:31265/productpage

reviews 微服务部署 3 个版本,用于测试灰度发布效果:

  • v1 版本不会调用 ratings 服务

  • v2 版本会调用 ratings 服务,并使用 5个黑色五角星来显示评分信息

  • v3 版本会调用 ratings 服务,并使用5个红色五角星 来显示评分信息

灰度发布:基于权重的路由

任务:

  1. 流量全部发送到reviews v1版本(不带五角星)

  2. 将90%的流量发送到reviews v1版本,另外10%的流量发送到reviews v2版本(5个黑色五角星), 最后完全切换到v2版本

  3. 将50%的流量发送到v2版本,另外50%的流量发送到v3版本(5个红色五角星)

kubectl apply -f networking/virtual-service-all-v1.yaml -n bookinfo
kubectl apply -f networking/destination-rule-all.yaml -n bookinfo
kubectl apply -f networking/virtual-service-reviews-90-10.yaml -n bookinfo
kubectl apply -f networking/virtual-service-reviews-v2-v3.yaml -n bookinfo

灰度发布:基于请求内容的路由

任务:将特定用户的请求发送到reviews v2版本(5个黑色五角星),其他用户则不受影响(v3)

kubectl apply -f networking/virtual-service-reviews-jason-v2-v3.yaml -n bookinfo

灰度发布:工作流程

1.将部署应用的deployment里pod标签增加一个"version :v1"

2.部署deployment接入istio

3.目标规则关联服务版本标签

4.虚拟服务实现灰度发布

流量镜像

流量镜像:将请求复制一份,并根据策略来处理这个请求,不会影响真实请求。

应用场景:

  • 线上问题排查

  • 用真实的流量验证应用功能是否正常

  • 对镜像环境压力测试

  • 收集真实流量数据进行分析

验证模拟测试:(访问nginx-v1版本的流量复制到nginx-v2版本)

azhe.zip

kubectl label namespaces default istio-injection=enabled
cd azhe/
kubectl apply -f .
kubectl logs nginx-v1-7fcbd8f56f-s9s4m -c nginx -f
kubectl logs nginx-v2-596b8cbb66-lcnnc -c nginx -f
kubectl get svc -n istio-system

访问页面验证,访问nginx-v1版本的流量复制到nginx-v2版本

nodeport暴露的端口:http://192.168.0.12:31994/

将应用暴露到互联网

在实际部署中,K8s集群一般部署在内网,为了将暴露到互联 网,会在前面加一层负载均衡器(公有云LB产品、Nginx、 LVS等),用于流量入口,将用户访问的域名传递给 IngressGateway,IngressGateway再转发到不同应用。

1.安装nginx并配置

server {
listen 80;
server_name localhost;
....
location / {
proxy_http_version 1.1; #必须指定不然会出现422,默认只支持1.1,upstream默认支持1.0
proxy_set_header Host $host;
proxy_pass http://192.168.0.11:31994;
}

2.在Gateway和VirtualService添加接收流量入口的域名

3.宿主机绑定nginx负载均衡ip关联的hosts解析,然后访问nginx.ctnrs.com

可视化监控

Istio集成了多维度监控系统:

  • 使用Kiali观测应用

  • 使用Prometheus+Grafana查看系统状态

  • 使用Jaeger进行链路追踪

kubectl apply -f samples/addons/prometheus.yaml -n istio-system
kubectl apply -f samples/addons/grafana.yaml -n istio-system
kubectl apply -f samples/addons/jaeger.yaml -n istio-system
kubectl apply -f samples/addons/kiali.yaml -n istio-system

注:service默认使用ClusterIP,浏览器访问需要改成NodePort后再apply

使用Kiali观测应用

Kiali是一款Isito服务网格可视化工具,提供以下功能:

  • Istio 的可观察性控制台

  • 通过服务拓扑帮助你理解服务网格的结构

  • 提供网格的健康状态视图

  • 具有服务网格配置功能

使用Prometheus+Grafana查看系统状态

Prometheus用于收集Isito指标,通过Grafana可视化展示。

仪表盘:

  • Istio Control Plane Dashboard:控制面板仪表盘

  • Istio Mesh Dashboard:网格仪表盘,查看应用(服务)数据

  • Istio Performance Dashboard:查看Istio 自身(各组件)数据

  • Istio Service Dashboard:服务仪表盘

  • Istio Workload Dashboard:工作负载仪表盘

  • Istio Wasm Extension Dashboard

使用Jaeger进行链路追踪

Jaeger是Uber开源的分布式追踪系统,用于微服务的监控 和全链路追踪。