微服务治理istio初探下
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 |
2、部署应用YAML
cd istio-1.8.2/samples/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个红色五角星 来显示评分信息
灰度发布:基于权重的路由
任务:
-
流量全部发送到reviews v1版本(不带五角星)
-
将90%的流量发送到reviews v1版本,另外10%的流量发送到reviews v2版本(5个黑色五角星), 最后完全切换到v2版本
-
将50%的流量发送到v2版本,另外50%的流量发送到v3版本(5个红色五角星)
kubectl apply -f networking/virtual-service-all-v1.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版本)
kubectl label namespaces default istio-injection=enabled |
访问页面验证,访问nginx-v1版本的流量复制到nginx-v2版本
nodeport暴露的端口:http://192.168.0.12:31994/
将应用暴露到互联网
在实际部署中,K8s集群一般部署在内网,为了将暴露到互联 网,会在前面加一层负载均衡器(公有云LB产品、Nginx、 LVS等),用于流量入口,将用户访问的域名传递给 IngressGateway,IngressGateway再转发到不同应用。
1.安装nginx并配置
server { |
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 |
注: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开源的分布式追踪系统,用于微服务的监控 和全链路追踪。