Istio 流量管理(请求路由、流量转移、请求重试、流量镜像、故障注入、熔断等)介绍及使用
一、Istio 流量管理
Istio是一个开源的服务网格,它为分布式微服务架构提供了网络层的抽象。它使得服务之间的通信变得更为可靠、安全,并且提供了细粒度的流量管理、监控和策略实施功能。Istio通过在服务之间插入一个透明的代理(Envoy)来拦截所有网络通信,从而实现这些功能。这样,开发者就可以专注于业务逻辑,而不必处理服务发现、负载均衡、故障恢复、安全性等网络问题。
Istio和k8s之间的关系非常紧密。它可以利用k8s的强大功能来管理和部署服务网格。当Istio部署在k8s集群中时,它会自动检测到集群中的服务,并为它们提供网络层的抽象。这样,开发者就可以使用Istio来管理服务之间的通信,同时利用k8s来管理服务的部署和扩展。这种结合使得开发者可以更容易地构建、部署和管理复杂的微服务架构。
Istio 的流量路由规则可以让您很容易的控制服务之间的流量和 API 调用。 Istio 简化了服务级别属性的配置,比如熔断器、超时和重试,并且能轻松的设置重要的任务, 如 A/B 测试、金丝雀发布、基于流量百分比切分的分阶段发布等。它还提供了开箱即用的故障恢复特性, 有助于增强应用的健壮性,从而更好地应对被依赖的服务或网络发生故障的情况。
Istio的流量管理是其最核心的功能之一,它能够让网络层的操作变得更加简单和灵活。以下是Istio流量管理的核心组件和概念的详细介绍:
-
Envoy代理:
Envoy是一个高性能C++分布式代理,专为单个服务和应用程序设计,以及为大型微服务“服务网格”体系结构。它作为边车(sidecar)与服务容器一起部署,拦截所有出入流量,从而无需对服务代码进行任何更改。Envoy支持HTTP/2、gRPC等协议,并提供了断路器、异常值检测、速率限制等功能,以确保网络稳定性和可靠性。 -
Pilot:
Pilot为Istio提供了服务发现功能,它将服务目录中的服务配置转换为Envoy代理的配置,并确保这些配置在运行时动态地分发到所有的Envoy代理。Pilot抽象了各种服务发现系统,如Kubernetes、Consul等,允许Istio在不同的环境中运行。 -
Mixer:
Mixer负责在服务网格中实施访问控制和使用策略。它允许服务在执行操作之前验证请求的属性,并收集遥测数据(如日志、指标和配额)。Mixer通过适配器与后端的各种基础设施后端进行通信,如Prometheus、StatsD、MySQL等。 -
Citadel:
Citadel负责Istio的安全功能,包括证书管理、密钥管理以及服务之间的安全通信。它为服务网格中的工作负载提供了自动化的密钥和证书轮换,确保端到端通信的安全。 -
Virtual Service:
Virtual Service是一个Istio配置资源,它允许用户定义路由规则,以控制服务之间的流量路由。通过Virtual Service,用户可以设置条件匹配(如基于路径或HTTP头),并将流量重定向到不同的版本或服务。 -
Destination Rule:
Destination Rule与Virtual Service配合使用,用于定义服务版本之间的流量策略,例如负载均衡策略、连接池大小、熔断器设置等。 -
Gateway:
Gateway是一个Istio配置资源,用于管理进出服务网格的入口和出口流量。它允许用户为服务网格配置负载均衡器,以处理来自外部网络的流量。 -
Service Entry:
Service Entry用于将外部服务添加到Istio的服务目录中,使网格内的服务能够访问外部服务,同时仍然可以利用Istio的流量管理功能。

通过这些核心组件和概念,Istio提供了一种统一的方式来管理、保护和监控微服务之间的流量,从而使开发人员可以专注于业务逻辑,而不是网络问题。
官方介绍文档如下:
https://istio.io/latest/zh/docs/concepts/traffic-management/
1.1 Istio 环境安装
下载 istioctl 客户端工具:
curl -L https://istio.io/downloadIstio | sh -
将 istioctl 客户端工具添加到环境变量:
cd istio-1.21.2/
export PATH=$PWD/bin:$PATH
测试环境,查看 istioctl 的版本:
istioctl version

使用 istioctl 安装 istio 环境,前提当前机器中已经有了 k8s 环境。
istioctl install --set profile=demo -y
其中 profile 可选项如下:
default:根据IstioOperator API的默认设置启动组件。 建议用于生产部署和Multicluster Mesh中的Primary Cluster。您可以运行istioctl profile dump命令来查看默认设置。demo:这一配置具有适度的资源需求,旨在展示Istio的功能。 它适合运行Bookinfo应用程序和相关任务。 此配置文件启用了高级别的追踪和访问日志,因此不适合进行性能测试。minimal:与默认配置文件相同,但只安装了控制平面组件。 它允许您使用SeparateProfile配置控制平面和数据平面组件(例如Gateway)。remote:配置Multicluster Mesh的Remote Cluster。empty:不部署任何东西。可以作为自定义配置的基本配置文件。preview:预览文件包含的功能都是实验性。这是为了探索Istio的新功能。不确保稳定性、安全性和性能(使用风险需自负)。
安装成功后,查看 Istio 的 pod :
kubectl get pods -n istio-system

状态都为 Running 为正常,可以看到,安装了入口和出口网关。这两个网关实际都运行了一个 Envoy 代理实例,它们在网格的边缘作为负载均衡器运行。入口网关接收入站的连接,而出口网关接收从集群出去的连接。
创建一个命名空间,后面所有操作均在该命名空间下操作:
kubectl create ns test
给该命名空间添加标签,指示在部署应用的时候,自动注入 Envoy 边车代理:
kubectl label namespace test istio-injection=enabled
1.2 Istio 环境测试
在 Istio 服务网格中可以通过 VirtualService定义流量路由规则,通过 GateWay 接入流量,下面使用一个案例测试环境是否正常。
启动一个 Nginx 作为服务的目标,并构建了/、/buy、/order 、err 接口分别用于后面不同场景的测试:
vi nginx-v1.yml
apiVersion: v1
kind: Service
metadata:name: nginx-v1namespace: testlabels:app: nginx-v1
spec:type: ClusterIPports:- port: 80targetPort: 80selector:app: nginx-v1---
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-v1-confignamespace: test
data:nginx.conf: |-events {use epoll;worker_connections 65535;}http {include mime.types;server_tokens off;client_max_body_size 50m;server {listen 80;server_name localhost;proxy_buffering off;autoindex on;add_header Access-Control-Allow-Origin '*';proxy_connect_timeout 1800s;proxy_send_timeout 1800s;proxy_read_timeout 1800s;location / {return 200 "This is V1 Nginx.";}location /buy {return 200 "This is V1 Nginx, Current Uri /buy .";}location /order {return 200 "This is V1 Nginx, Current Uri /order .";}location /err {return 500 "This is V1 Nginx, Current Uri /err .";}}}
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-v1namespace: test
spec:selector:matchLabels:app: nginx-v1replicas: 1template:metadata:labels:app: nginx-v1name: nginxversion: v1spec:containers:- name: nginx-v1image: nginx:1.20.1ports:- containerPort: 80volumeMounts:- name: nginx-configmountPath: /etc/nginx/nginx.confsubPath: nginx.confvolumes:- name: nginx-configconfigMap:name: nginx-v1-config
kubectl apply -f nginx-v1.yml
查看 Pod :

这里有两个容器是因为一个是 sidecar 一个是 nginx 目标服务。
下面创建 Gateway 和 VirtualService 测试流量转发:
vi nginx-gwvs.yml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: nginx-gwnamespace: test
spec:selector:istio: ingressgateway # use istio default controllerservers:- port:number: 80name: httpprotocol: HTTPhosts:- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "*" gateways: #绑定 gateway- nginx-gwhttp:- route: #路由- destination:host: nginx-v1.test.svc.cluster.localport:number: 80
kubectl apply -f nginx-gwvs.yml
查看入口 gateway nodeport 的端口:
kubectl get svc -n istio-system

访问: http://{node ip}:30868/

通过下面指令可以查看 ingressgateway 的日志情况:
kubectl logs -f -n istio-system -l istio=ingressgateway

下面开始更详细的使用介绍。
二、VirtualService 流量管理
Istio 中的 VirtualService 是一个核心的配置资源,它允许用户通过定义一组流量路由规则来控制服务网格中的数据流。这些规则可以根据请求的属性(如路径、标头、查询参数等)将流量路由到不同的服务版本或目的地,同时支持重定向、重写、故障注入、超时、重试策略、流量镜像等功能。通过这些特性,`可以使得在复杂的微服务环境中实现细粒度的流量管理变得简单而灵活。
下面是 VirtualService 中的重要的配置项说明:
| 配置项 | 说明 |
|---|---|
| spec.hosts | 定义路由规则关联一组的 hosts,可以是带有通配符的 DNS 名称或者 IP 地址。 |
| spec.gateways | 定义应用路由规则的来源流量,可以是一个或多个网关,或网格内部的 sidecar,指定方式为 <gateway namespace>/<gateway name> |
| spec.http.match | 定义路由的匹配规则列表,单个匹配规则项内所有条件是且关系,列表中多个匹配规则之间为或关系 |
| spec.http.route | 定义路由转发目的地列表,一条 HTTP 路由可以是重定向或转发(默认),转发的目的地可以是一个或多个服务(服务版本)。同时也可以配置权重、header 操作等行为 |
| spec.http.redirect | 定义路由重定向,一条 HTTP 路由可以是重定向或转发(默认) |
| spec.http.rewrite | 定义重写,不能与重定向同时配置,重写操作会在转发前执行 |
| spec.http.timeout | 定义 HTTP 请求的超时时间 |
| spec.http.retries | 定义 HTTP 请求的重试策略 |
| spec.http.fault | 定义 HTTP 流量的故障注入策略,开启时超时和重试策略不会开启 |
| spec.http.mirror | 定义将 HTTP 流量复制到另一个指定的目的端 |
| spec.http.mirrorPercent | 定义流量镜像的复制百分比,缺省时复制100%的流量。最大值为100 |
| spec.http.corsPolicy | 定义 CORS 策略 |
| spec.http.headers | 定义 header 操作规则,可以更新 request 和 response 的 header,进行增加,移除操作 |
2.1 限制请求域名
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: nginx-gwnamespace: test
spec:selector:istio: ingressgateway # use istio default controllerservers:- port:number: 80name: httpprotocol: HTTPhosts:- "www.xbc.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com" gateways: #绑定 gateway- nginx-gwhttp:- route: #路由- destination:host: nginx-v1.test.svc.cluster.localport:number: 80
更新配置:
kubectl apply -f nginx-gwvs.yml
再次使用 http://{node ip}:30868/ 访问:

此时返回 404 了,在 hosts 中添加域名映射:
11.0.1.144 www.xbc.com
使用域名后,可以访问成功:

2.2 match 规则匹配
支持对 uri、scheme、method、authority 类型的操作,每种类型都支持 exact、prefix和regex三种模式的匹配 。
例如:
2.2.1 根据 uri 前缀路由
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com" gateways: - nginx-gwhttp:- match:- uri:prefix: /buyroute:- destination:host: nginx-v1.test.svc.cluster.localport:number: 80
当 uri 以 buy 为前缀时,可以正常访问:

如果访问 order 接口,此时访问不通:

2.2.2 根据 header 参数路由
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com" gateways: - nginx-gwhttp:- match:- headers:userid:exact: testroute:- destination:host: nginx-v1.test.svc.cluster.localport:number: 80
只有 header 中带有 userid=test 的请求才可以访问,如果不加 header 参数访问,会返回 404 :

带上 header 参数访问,可以正常访问:

2.2.3 同时混合使用多种规则
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com" gateways: - nginx-gwhttp:- match:- headers:userid:exact: testuri:prefix: /buy- headers:userid:exact: adminroute:- destination:host: nginx-v1.test.svc.cluster.localport:number: 80
上面意思表示,header 中 userid 的值为 test 并且 uri 的前缀是 buy 可以访问,或者是 header 中 userid 的值为 admin 也可以访问。
当uri以buy为前缀,但headr中userid 的值是其他时,访问为 404 :

当uri以buy为前缀,但headr中userid 的值是test时,正常访问 :

当 uri 以 order 为前缀, header中的值是 test 时,访问为 404 :

当 uri 以 order 为前缀, header中的值是 admin 时,正常访问 :

2.3 route 流量转移
上面已经简单使用 route 指定目标服务了,在 route 还有更多功能,例如实现负载均衡、灰度发布、流量转移等等,主要有三个配置:destination(请求目标)、weight(权重)、和 headers,其中 destination 是必须的。
这里为了方便测试目标路由,再部署一个 nginx v2 版本:
vi nginx-v2.yml
apiVersion: v1
kind: Service
metadata:name: nginx-v2namespace: testlabels:app: nginx-v2
spec:type: ClusterIPports:- port: 80targetPort: 80selector:app: nginx-v2---
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-v2-confignamespace: test
data:nginx.conf: |-events {use epoll;worker_connections 65535;}http {include mime.types;server_tokens off;client_max_body_size 50m;server {listen 80;server_name localhost;proxy_buffering off;autoindex on;add_header Access-Control-Allow-Origin '*';proxy_connect_timeout 1800s;proxy_send_timeout 1800s;proxy_read_timeout 1800s;location / {return 200 "This is V2 Nginx.";}location /buy {return 200 "This is V2 Nginx, Current Uri /buy .";}location /order {return 200 "This is V2 Nginx, Current Uri /order .";}location /err {return 500 "This is V2 Nginx, Current Uri /err .";}}}---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-v2namespace: test
spec:selector:matchLabels:app: nginx-v2replicas: 1template:metadata:labels:app: nginx-v2name: nginxversion: v2spec:containers:- name: nginx-v2image: nginx:1.20.1ports:- containerPort: 80volumeMounts:- name: nginx-configmountPath: /etc/nginx/nginx.confsubPath: nginx.confvolumes:- name: nginx-configconfigMap:name: nginx-v2-config
kubectl apply -f nginx-v2.yml
2.3.1 基于权重的流量转移
通过配置 weight 参数,将流量按比例分配到不同的目标服务中。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com" gateways: - nginx-gwhttp:- match:- uri:prefix: /route:- destination:host: nginx-v1.test.svc.cluster.localport:number: 80weight: 50- destination:host: nginx-v2.test.svc.cluster.localport:number: 80weight: 50
上面两个版本服务各分配 50% 的流量,访问应该可以感觉出负载均衡轮训的效果:


2.3.2 添加/修改 header
可以添加或修改 request 或 response 中的 header 信息:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com" gateways: - nginx-gwhttp:- match:- uri:prefix: /route:- destination:host: nginx-v1.test.svc.cluster.localport:number: 80headers:response:add:test: xbcset:content-type: application/json
发起请求后,可以在返回的 header 中看到添加和修改的参数:

2.4 redirect 重定向
可以从一个uri重定向到另一个 uri,返回服务调用方 302 状态码,以及 header 中 location 重定向后的地址。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com" gateways: - nginx-gwhttp:- match:- uri:prefix: /buy-v2redirect:uri: /buyroute:- destination:host: nginx-v1.test.svc.cluster.localport:number: 80
上面配置了访问 /buy-v2 的话,自动重定向到 /buy 接口 :

2.5 rewrite 重写
和重定向配置类似,但重写对用户不可见,在服务端进行。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com" gateways: - nginx-gwhttp:- match:- uri:prefix: /buy-v2rewrite:uri: /buyroute:- destination:host: nginx-v1.test.svc.cluster.localport:number: 80
上面配置了访问 /buy-v2 的话,自动重写到 /buy 接口 ,对服务调用者无感知:

2.5 retries 请求重试
当请求失败时,可以通过重试策略,重新发起尝试,以提高服务的质量。
主要包括三个参数:attempts、perTryTimeout、retryOn :
- attempts:重试的次数,比需的参数。
- perTryTimeout:重试超时时间(
ms、s、m、h) - retryOn:重试策略,多个以逗号分隔
策略包括:- 5xx:服务返回
5xx状态码或没有返回时。 - gateway-error:类似于
5xx异常,但只针对对502、503、504。 - connect-failure:在连接目标服务失败时 。
- retriable-4xx:在目标服务返回
4xx时。 - refused-stream:在目标服务使用
REFUSED_STREAM错误码重置时。 - cancelled:
gRPC应答的Header中状态码是cancelled时。 - deadline-exceeded:
gRPC应答的Header中状态码是deadline-exceeded时。 - internal:
gRPC应答的Header中状态码是internal时。 - resource-exhausted:
gRPC应答的Header中状态码是resource-exhausted时。 - unavailable:
gRPC应答的Header中状态码是unavailable时。
- 5xx:服务返回
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com" gateways: - nginx-gwhttp:- match:- uri:prefix: /route:- destination:host: nginx-v1.test.svc.cluster.localport:number: 80 retries:attempts: 3perTryTimeout: 3sretryOn: 5xx,connect-failure
上面定义了当目标服务返回 5xx 或 连接失败时进行重试,一共重试3次,每次重试的超时时间 3s 。
这里可以提前查看下 nginx-v1 的日志:
kubectl logs -f nginx-v1-dbf758949-bhbdr -n test
下面访问 /err 接口一次,会返回 500 错误码:

通过 nginx-v1 的日志可以看到,被访问了4次,其中包括重试的 3 次 。

2.6 mirror 流量镜像
流量镜像可以将流量转发到目标服务的同时,也将流量给到另外一个服务,非常利于新版本环境的上线前测试,其配置的参数和 destination 相同:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com" gateways: - nginx-gwhttp:- match:- uri:prefix: /route:- destination:host: nginx-v1.test.svc.cluster.localport:number: 80 mirror:host: nginx-v2.test.svc.cluster.localport: number: 80
上面将请求同时转发到 nginx v1 的同时也向 nginx-v2 服务发送一份请求:
这里可以提前查看下 nginx-v2 的日志:
kubectl logs -f nginx-v1-dbf758949-bhbdr -n test

从 nginx-v2 的日志中可以看出也被请求了:

2.7 故障注入
故障注入是一种服务网格中的测试手段,它允许在系统中引入特定的故障,以模拟网络延迟或服务中断的情况。这样做的目的是测试和提高微服务架构的弹性和稳定性,确保系统能够在遇到真实世界的各种问题时仍能正确处理请求。
注意:故障注入应该谨慎使用,尽量在测试环境中进行,以避免对生产环境造成不必要的影响。
故障注入主要包括 delay 和 abort 两种类型:
- delay:用于模拟网络延迟或服务响应延迟。通过引入延迟,可以测试服务或系统的超时处理、重试机制和整体性能。
- abort:用于模拟服务中断,通过返回特定的
HTTP状态码来模拟服务失败。这可以用来测试服务的错误处理能力、断路器和其他故障恢复机制。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com" gateways: - nginx-gwhttp:- match:- uri:prefix: /route:- destination:host: nginx-v1.test.svc.cluster.localport:number: 80 fault:delay: percentage:value: 10fixedDelay: 5sabort:percentage:value: 10httpStatus: 500
上面配置了 10% 的请求产生 5 秒的延时,10% 的请求直接中止返回 500 状态码:


2.8 跨域配置
VirtualService 提供了 allowOrigin、allowMethods、allowHeader、exposeHeader、maxAge、allowCredentials 参数来允许我们灵活的配置跨域。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com" gateways: - nginx-gwhttp:- match:- uri:prefix: /route:- destination:host: nginx-v1.test.svc.cluster.localport:number: 80 corsPolicy:allowOrigin: - www.xbc.comallowMethods:- "GET"- "POST"- "PUT"- "DELETE"maxAge: "24h"
三、 DestinationRule 流量管理策略
DestinationRule 是 Istio 服务网格中的一种配置资源,它用于定义到达特定服务时的路由规则,以及与该服务通信时的流量策略。DestinationRule 通常与 VirtualService 一起使用,当 VirtualService 和 DestinationRule 都指定了相同的主机名和子集时生效。
下面是 DestinationRule 中的重要的配置项说明:
| 配置项 | 说明 |
|---|---|
| spec.host | 关联 destination.host 服务名称 |
| spec.subsets | 服务子集 |
| spec.trafficPolicy | 流量策略,包括负载均衡、连接池、健康检查、TLS 策略 |
| spec.trafficPolicy.loadBalancer | 负载均衡算法,支持轮训、最小连接、随机等 |
| spec.trafficPolicy.connectionPool | 连接池配置 |
| spec.trafficPolicy.outlierDetection | 熔断配置 |
下面我们将 Gateway 和 VirtualService 的配置保持指定为下面内容,后面主要配置DestinationRule 的信息:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: nginx-gwnamespace: test
spec:selector:istio: ingressgateway # use istio default controllerservers:- port:number: 80name: httpprotocol: HTTPhosts:- "www.xbc.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com"gateways: - nginx-gwhttp:- match:- uri:prefix: /route:- destination:host: nginx.test.svc.cluster.localport:number: 80
3.1 流量转移 - 负载均衡
在 k8s 中 Service 本身也提供了一种负载均衡机制,而 DestinationRule 提供了更高级的负载均衡功能和流量控制方法,允许对一个服务的多个版本进行流量的划分,比如负载均衡中的轮询算法、最少连接算法、随机等等,还可以针对不同版本转移不同权重的流量。
这里再创建一个 Service ,指向 nginx-v1 和 nginx-v2 两个版本的 Pod :
vi nginx-svc.yml
apiVersion: v1
kind: Service
metadata:name: nginxnamespace: testlabels:app: nginx
spec:type: ClusterIPports:- port: 80targetPort: 80selector:name: nginx
kubectl apply -f nginx-svc.yml
配置负载均衡主要有两种选择 simple(简单负载均衡) 和 consistentHash(一致性Hash 算法):
simple 包括:
- ROUND_ROBIN: 轮询,默认的策略。
- LEAST_CONN:最少连接,选择一个活动请求数相对少的目标服务。
- RANDOM: 随机选择一个。
- PASSTHROUGH:直接转发到目标服务,不做任何策略。
consistentHash 包括:
- httpHeaderName: 基于 Header 计算 Hash。
- httpCookie: 基于Cookie 计算 Hash。
- useSourceIp:基于IP地址计算 Hash。
- minimumRingSize: 哈希环上虚拟节点数的最小值,节点数越多则分布越均衡。
新建一个 DestinationRule 配置:
vi nginx-dr.yml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: nginx-drnamespace: test
spec:host: nginx.test.svc.cluster.localtrafficPolicy:loadBalancer:simple: ROUND_ROBIN #负载均衡算法subsets:- name: v1labels:version: v1- name: v2labels:version: v2
kubectl apply -f nginx-dr.yml
通过测试可以感觉出负载均衡的效果:


3.2 流量转移 - 同一服务不同版本流量转移
上面在 VirtualService 中介绍了基于权重的流量分发,但是针对不同的 host 的,结合DestinationRule 可以针对一个 host 中多个版本更细力度的控制分发,比如控制 80% 的流量到 v1, 20% 的流量到 v2 。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: nginx-drnamespace: test
spec:host: nginx.test.svc.cluster.localsubsets:- name: v1labels:version: v1- name: v2labels:version: v2
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: nginx-vsnamespace: test
spec:hosts:- "www.xbc.com" gateways: - nginx-gwhttp:- match:- uri:prefix: /route:- destination:host: nginx.test.svc.cluster.localport:number: 80subset: v1weight: 80- destination:host: nginx.test.svc.cluster.localport:number: 80subset: v2weight: 20
可以在控制台循环10次请求:
for /l %i in (1,1,10) do curl http://www.xbc.com:30868/
通过结果可以看出,v1 服务获得了 80% 的流量。

3.3 连接池
连接池可以用于控制发送到目标服务的连接数量,包括 TCP 连接和 HTTP 连接两种。
TCP 连接参数:
-
maxConnections: 最大连接数,默认是
1024,也适用HTTP/1.1,HTTP/2会对每个主机都使用单个连接。 -
connectTimeout: 连接超时时间。
-
tcpKeepalive:
Istio1.1后新支持的配置,定期给对目标服务发送一个keepalive探测包,判断连接是否可用。
HTTP 连接参数:
- http1MaxPendingRequests: 最大等待请求数,默认值是
1024,只适用于HTTP/1.1的服务。 - http2MaxRequests: 最大请求数,默认是
1024。只适用于HTTP/2服务。 - maxRequestsPerConnection: 每个连接的最大请求数。
HTTP/1.1和HTTP/2都遵循此参数。如果没有设置,表示没有限制。设置为1表示每个连接只处理一个请求,也就是禁用了Keep-alive。 - maxRetries:最大重试次数,默认是
3。 - idleTimeout: 空闲超时,在这个时间内没有活动,该请求将关闭连接。
trafficPolicy 控制可以具体到某个子集:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: nginx-drnamespace: test
spec:host: nginx.test.svc.cluster.localtrafficPolicy: connectionPool: tcp:maxConnections: 1024connectTimeout: 30stcpKeepalive:probes: 5time: "3600"interval: 60shttp: http1MaxPendingRequests: 2048http2MaxRequests: 2048maxRequestsPerConnection: 10maxRetries: 3idleTimeout: 60ssubsets:- name: v1labels:version: v1trafficPolicy: connectionPool: http: http1MaxPendingRequests: 1024http2MaxRequests: 1024maxRequestsPerConnection: 10maxRetries: 3idleTimeout: 60s- name: v2labels:version: v2trafficPolicy: connectionPool: http: http1MaxPendingRequests: 1024http2MaxRequests: 1024maxRequestsPerConnection: 10maxRetries: 3idleTimeout: 60s
3.2 熔断
熔断是服务网格Istio中的一种保护机制,用于防止系统雪崩和确保服务稳定性。Istio熔断机制通过对服务进行实时监控,当检测到某个服务出现连续失败、延迟过高或异常响应时,会自动触发熔断,阻止进一步的请求发送到该服务。这样,可以避免无效的请求占用系统资源,同时给故障服务留出恢复的时间和空间。
Istio 的熔断功能主要通过 DestinationRule 中的 outlierDetection 配置项来实现,主要包括如下配置:
- consecutiveErrors:表示在
interval时间内,如果一个服务实例连续返回错误的次数达到或超过这个值,该实例将被认为是异常的,并触发熔断。默认值为5。 - interval:用于定义
consecutiveErrors的统计时间窗口。在这个时间窗口内,如果服务实例的失败次数达到consecutiveErrors的阈值,实例将被标记为异常。默认值为10秒。 - baseEjectionTime:表示一个异常实例被驱逐的最短时间。实例被驱逐后,即使它变得可用,也必须等待至少这个时间才能重新加入负载均衡池。默认值为
30秒。 - maxEjectionPercent:用于限制在同一时间内可以被驱逐的最大实例比例。这个配置可以防止所有实例同时被驱逐,从而保证服务有一定的可用性。默认值为
10%。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: nginx-drnamespace: test
spec:host: nginx.test.svc.cluster.localtrafficPolicy: connectionPool: tcp:maxConnections: 100http: http1MaxPendingRequests: 100http2MaxRequests: 100outlierDetection: consecutiveErrors: 5interval: 1mbaseEjectionTime: 1mmaxEjectionPercent: 100subsets:- name: v1labels:version: v1- name: v2labels:version: v2
上面配置了当在 1分钟内,如何发生异常出现 5 次,将进行熔断,熔断时长 1分钟,并且允许驱逐到全部的服务。
下面使用控制台,并发访问 20次 /err 接口:
for /l %i in (1,1,20) do start curl http://www.xbc.com:30868/err
执行之后,通过 PostMan 访问 /err 接口测试:

如果此时访问其他接口,/buy 也是访问不通的,因为整个目标服务都被驱逐了:

等待 1 分钟后,再次访问,接口返回正常:

相关文章:
Istio 流量管理(请求路由、流量转移、请求重试、流量镜像、故障注入、熔断等)介绍及使用
一、Istio 流量管理 Istio是一个开源的服务网格,它为分布式微服务架构提供了网络层的抽象。它使得服务之间的通信变得更为可靠、安全,并且提供了细粒度的流量管理、监控和策略实施功能。Istio通过在服务之间插入一个透明的代理(Envoy&#x…...
Transformers中加载预训练模型的过程剖析
使用HuggingFace的Transformers库加载预训练模型来处理下游深度学习任务很是方便,然而加载预训练模型的方法多种多样且过程比较隐蔽,这在一定程度上会给人带来困惑。因此,本篇文章主要讲一下使用不同方法加载本地预训练模型的区别、加载预训练模型及其配置的过程,藉此做个记…...
使用MCU的 GPIO口 模拟SDIO时序读写TF/SD卡的可能性。
SD2.0协议详解:命令格式、初始化/读取/写入 - WangXuan的文章 - 知乎 https://zhuanlan.zhihu.com/p/610495260 参考上述与其它理解,若使用GPIO口模拟,重点与难点: 1. 时钟线问题: 在SD准备期间,需不间断…...
SSM【Spring SpringMVC Mybatis】——Mybatis(二)
如果对一些基础理论感兴趣可以看这一期👇 SSM【Spring SpringMVC Mybatis】——Mybatis 目录 1、Mybatis中参数传递问题 1.1 单个普通参数 1.2 多个普通参数 1.3 命名参数 1.4 POJO参数 1.5 Map参数 1.6 Collection|List|Array等参数 2、Mybatis参数传递【#与…...
在线教育系统在线网校报价,培训机构是怎样招聘老师的?流程是什么?
招生是培训机构的一大难题,但招不来老师,招不到好老师却也是培训机构面临的一个更为严峻的问题,没有老师,教学工作就展不开,没有老师,学生就留不住。培训学校的人员招聘不要等缺失时才去招聘,要…...
您的文件和驱动器上的“密码保护”有多安全?
某些行业(例如医疗保健、法律和公司)的人们在通过电子邮件发送文件时通常依赖密码保护,认为它可以提供足够的安全性来防止窥探。然而,对 PDF 或 Excel 文件进行简单的密码保护并不像看起来那样万无一失。 使用密码保护文件而不加…...
4000字超详解Linux权限
各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 在Linux当中权限的体现主要有两种 普通用户 超…...
SearXNG - 一个注重隐私的互联网元搜索引擎
引言 在数字监控和数据货币化的时代,对于许多用户而言,在线保护个人信息变得至关重要。隐私问题特别突出的一个领域是搜索引擎,它们经常收集用户数据以定制个性化广告或构建用户档案。SearXNG 是一个开源的元搜索引擎,它汇集了各…...
(第15天)【leetcode题解】459、重复的子字符串
目录 459、重复的子字符串题目描述暴力匹配思路代码 字符串匹配思路代码与暴力匹配的不同 KMP解法思路代码KMP算法的核心和用途 459、重复的子字符串 题目描述 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 暴力匹配 思路 推理 如果…...
PostgreSQL的学习心得和知识总结(一百四十二)|深入理解PostgreSQL数据库数据库之 Continuous Integration
目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…...
【外币兑换,简单贪心】
小明刚从美国回来,发现手上还有一些未用完的美金,于是想去银行兑换成人民币。可是听说最近人民币将会升值,并从金融机构得到了接下来十二个月可能的美元对人民币汇率,现在,小明想要在接下来一年中把美金都兑换成人民币…...
数据库入门(sql文档+命令行)
一.基础知识 1.SQL(Structured Query Language)结构化查询语言分类: DDL数据定义语言用来定义数据库对象:数据库、表、字段DML数据操作语言对数据库进行增删改查DQL数据查询语言查询数据库中表的信息DCL数据控制语言用来创建数据…...
【机器学习300问】84、AdaGrad算法是为了解决什么问题?
神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为最优化。因为参数空间非常复杂,无法轻易找到最优解,而且在深度神经网络中,参数的数量非常庞大,导致最优化问…...
Java算法-力扣leetcode-14. 最长公共前缀
14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入: strs ["flower","flow","flight"] 输出: "fl"示…...
视频拼接融合产品的产品与架构设计(二)
视频拼接融合产品的产品与架构设计一 以上是第一期,以前思考的时候还是比较着急,现在思考的更多了,现实世界的拼接更加需要我们沉下心来做,尤其是对于更多画面,画面更加清晰怎么做 本篇章不在于其他功能,在…...
【docker 】push 镜像到私服
查看镜像 docker images把这个hello-world 推送到私服 docker push hello-world:latest 报错了。不能推送。需要标记镜像 标记Docker镜像 docker tag hello-world:latest 192.168.2.1:5000/hello-world:latest 将Docker镜像推送到私服 docker push 192.168.2.1:5000/hello…...
Java框架精品项目【用于个人学习】
源码获取:私聊回复【项目关键字】获取 更多选题参考: Java练手项目 & 个人学习等选题参考 推荐菜鸟教程Java学习、Javatpoint学习 前言 大家好,我是二哈喇子,此博文整理了各种项目需求 此文下的项目用于博主自己学习&#x…...
每周一算法:无向图的最小环
题目链接 观光之旅 题目描述 给定一张无向图,求图中一个至少包含 3 3 3 个点的环,环上的节点不重复,并且环上的边的长度之和最小。 该问题称为无向图的最小环问题。 你需要输出最小环的方案,若最小环不唯一,输出…...
分布式websocket IM即时通讯聊天开源项目如何启动
前言 自己之前分享了分布式websocket的视频有同学去fork项目了,自己启动一下更方便理解项目嘛。然后把项目启动需要的东西全部梳理出来。支持群聊单聊,表情包以及发送图片。 支持消息可靠,消息防重,消息有序。同时基础架构有分布式权限&…...
tensorflow学习笔记(1)环境准备写个简单例子(小白手册)-20240506
一、安装python、tensorflow 1、Mac上默认python已经安装,自带pip 2、pip3 install tensorflow 如果报错,提示pip3版本较低,可以根据提示来更新pip3:/Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip 3、然后再使用pip3来安装tensor…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
