微服务治理istio初探下
1913字约6分钟
2024-09-29
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个红色五角星 来显示评分信息
灰度发布:基于权重的路由
任务:
流量全部发送到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
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版本)
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开源的分布式追踪系统,用于微服务的监控 和全链路追踪。