接上一篇rootless模式下istio ambient鉴权策略,本次测试管理流量的功能。
服务流量分割
Bookinfo应用程序有三个版本的reviews服务,接下来对这些版本进行分配流量控制测试。
longtds@ubuntu:~$ kubectl get pod |grep reviews
reviews-v1-746f96c9d4-2g9rq 1/1 Running 1 (23m ago) 3d2h
reviews-v2-97bdf5876-2djh9 1/1 Running 1 (23m ago) 3d2h
reviews-v3-77d9db6844-jmfxv 1/1 Running 1 (23m ago) 3d2h
longtds@ubuntu:~$
下面的配置将90%的请求发送到reviews v1,将10%的请求发送到reviews v2:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:name: reviews
spec:parentRefs:1. group: ""kind: Servicename: reviewsport: 9080rules:2. backendRefs:- name: reviews-v1port: 9080weight: 90- name: reviews-v2port: 9080weight: 10
因为上一篇我们把productpage授权只有sleep服务可以访问,执行下面的策略将productpage授权给gateway访问(也可以直接移除策略)
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:name: productpage-viewernamespace: default
spec:selector:matchLabels:app: productpageaction: ALLOWrules:3. from:- source:principals:- cluster.local/ns/default/sa/bookinfo-gateway-istio
应用上面的流量策略并启动客户端模拟请求:
while true;do curl -s http://192.168.1.15:30080/productpage;sleep 0.2;done
通过Kiali查看实际的流量分配情况:
从结果发现productpage服务对后端reviews v1和v2分别占比44.6%和5.4%,计算一下44.6/5.4约为8.26,接近设置的9。
造成这个问题的原因有下面几种可能(AI回答):
-
配置传播延迟:Istio 在 Kubernetes 上的实现使用最终一致性算法来确保所有 Envoy 边车(sidecar)都有正确的配置,包括所有的路由规则。配置更改需要一些时间来传播到所有的边车。在大型部署中,这种传播可能会需要更长的时间,可能会有几秒钟的延迟。
-
负载均衡算法:Istio 使用的负载均衡算法可能不是完全精确的,特别是当请求量不是很大时,实际的流量分配比例可能会因为统计波动而与配置的比例有所偏差。
-
服务实例健康状况:如果后端服务的实例健康状况不一,Istio 会根据健康检查结果进行流量分配,这可能会影响实际的流量分配比例。
-
重试和超时策略:Istio 支持重试和超时策略,这些策略可能会影响实际到达后端服务的流量比例。例如,如果一个服务的请求经常超时或失败,重试机制可能会导致流量重新分配,从而影响比例。
-
熔断机制:在 Istio 中,熔断机制可以防止服务故障扩散。如果某个服务实例触发了熔断,那么流向该实例的流量会被中断,这可能会影响流量分配的实际比例。
-
配置错误:可能存在配置错误,例如 VirtualService 或 DestinationRule 配置不正确,导致流量分配不符合预期。
总结
rootless模式下istio ambient的流量管理分配基本是符合预期的。