微服务治理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=enabled2、部署应用YAML
cd istio-1.8.2/samples/bookinfo
kubectl apply -f platform/kube/bookinfo.yaml -n bookinfo
kubectl get pod -n bookinfo3、创建Ingress网关
kubectl apply -f networking/bookinfo-gateway.yaml -n bookinfo4、确认网关和访问地址,访问应用页面
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开源的分布式追踪系统,用于微服务的监控 和全链路追踪。

