如何通过Istio实现流量控制与服务间高效调用?

2026-05-19 21:291阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计772个文字,预计阅读时间需要4分钟。

如何通过Istio实现流量控制与服务间高效调用?

前言:在上一篇文章中,我们介绍了通过Istio应用部署,利用VirtualService组件实现流量控制,并通过客户端进行服务调用实例。以下是具体步骤:

1. 修改VirtualService组件,实现权重控制,访问不同版本服务(v1版本70%,v2版本30%)。

前言:接上一篇istio应用部署,本文介绍通过virtualservice实现流量控制,并通过部署client端进行服务调用实例 1. 修改virtualservice组件,实现权重占比访问不同版本服务(v1版本70%,v2版本30%)
  • 拆分流量使用weight关键字来设置,70%的流量走v1版本,30%的流量走v2版本
  • 输入命令,重新应用一下virtualservice组件

    sudo kubectl apply -f springbootapp-vs-v1.yaml -n springistiodemo

  • 通过istio-ingressgateway对外访问的地址,进行服务访问(ip:31380/hello)
  • 通过kiali管理界面,查看服务调用详情,可以看到v1版本访问占比大概达到70%左右
2. 超时时间设置,timeout:0.002s
  • 修改virtualservice的yaml文件,添加timeout属性,数值改小一些,方便测试
  • 访问服务,不断刷新,发现有一部分服务已超时,访问不到
  • 通过kiali管理界面,查看服务调用详情,发现v2版本已100% error
3. 服务间调用:运行busybox容器客户端,访问springbootapp应用服务
  • 新建一个busybox的客户端资源,与应用不在同一命名空间中,当然也可以在同一命名空间中;创建命名空间istioclient,并设置istio自动注入

    sudo kubectl create namespace istioclient sudo kubectl label namespace istioclient istio-injection=enabled sudo kubectl get ns istioclient --show-labels # 查看注入状态

  • client文件busybox-client.yaml内容

    apiVersion: apps/v1 kind: Deployment metadata: name: busyclient # namespace: istioclient spec: replicas: 1 selector: matchLabels: app: busyclient strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: busyclient version: v1 spec: containers: - name: busybox image: busybox imagePullPolicy: IfNotPresent # 不存在才拉取镜像,默认值 command: [ "/bin/sh", "-c", "sleep 3600" ]

    如何通过Istio实现流量控制与服务间高效调用?

  • 执行命令,创建Deployment:

    sudo kubectl apply -f busybox-client.yaml -n istioclient

  • 查看pod

    sudo kubectl get pods -n istioclient

  • 进入客户端容器中,访问springbootapp服务

    sudo kubectl exec -it busyclient-5f6b7b954d-9wq5q /bin/sh -n istioclient

  • 访问springbootapp服务

    wget -q -O - springbootapp-svc.springistiodemo:8080/hello

    说明:

    1.上述服务格式[servicename].[namespace]:[port]/[action] 客户端与服务不在同一命名空间下,使用上述格式访问服务,参考k8s的namespace隔离机制 2.如在同一命名空间下,则直接使用[servicename]:[port]/[action]访问 for i in `seq 10`;do wget -q -O - springbootapp-svc:8080/hello;done 3.此处的port对应的是k8s的service(svc)节点的port端口值,不是nodePort端口设置值; port是service端口,即k8s中服务之间的访问端口 targetport是pod(也就是容器)的端口 nodeport是容器所在node节点的端口,即外部机器可访问的端口。(通过nodeport类型的service暴露给集群节点) 4.busybox client客户端也必须经过 Istio 注入,因为只有客户端被 Istio 注入才可以接收到来自 Pilot 有关 Virtual Service 和 Destination Rule 的配置信息,才可以保证流量接管生效。

  • 可以通过命令运行busybox,退出后pod自动删除释放

    sudo kubectl run --namespace=springistiodemo busybox --rm -ti --image busybox /bin/sh

本文共计772个文字,预计阅读时间需要4分钟。

如何通过Istio实现流量控制与服务间高效调用?

前言:在上一篇文章中,我们介绍了通过Istio应用部署,利用VirtualService组件实现流量控制,并通过客户端进行服务调用实例。以下是具体步骤:

1. 修改VirtualService组件,实现权重控制,访问不同版本服务(v1版本70%,v2版本30%)。

前言:接上一篇istio应用部署,本文介绍通过virtualservice实现流量控制,并通过部署client端进行服务调用实例 1. 修改virtualservice组件,实现权重占比访问不同版本服务(v1版本70%,v2版本30%)
  • 拆分流量使用weight关键字来设置,70%的流量走v1版本,30%的流量走v2版本
  • 输入命令,重新应用一下virtualservice组件

    sudo kubectl apply -f springbootapp-vs-v1.yaml -n springistiodemo

  • 通过istio-ingressgateway对外访问的地址,进行服务访问(ip:31380/hello)
  • 通过kiali管理界面,查看服务调用详情,可以看到v1版本访问占比大概达到70%左右
2. 超时时间设置,timeout:0.002s
  • 修改virtualservice的yaml文件,添加timeout属性,数值改小一些,方便测试
  • 访问服务,不断刷新,发现有一部分服务已超时,访问不到
  • 通过kiali管理界面,查看服务调用详情,发现v2版本已100% error
3. 服务间调用:运行busybox容器客户端,访问springbootapp应用服务
  • 新建一个busybox的客户端资源,与应用不在同一命名空间中,当然也可以在同一命名空间中;创建命名空间istioclient,并设置istio自动注入

    sudo kubectl create namespace istioclient sudo kubectl label namespace istioclient istio-injection=enabled sudo kubectl get ns istioclient --show-labels # 查看注入状态

  • client文件busybox-client.yaml内容

    apiVersion: apps/v1 kind: Deployment metadata: name: busyclient # namespace: istioclient spec: replicas: 1 selector: matchLabels: app: busyclient strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: busyclient version: v1 spec: containers: - name: busybox image: busybox imagePullPolicy: IfNotPresent # 不存在才拉取镜像,默认值 command: [ "/bin/sh", "-c", "sleep 3600" ]

    如何通过Istio实现流量控制与服务间高效调用?

  • 执行命令,创建Deployment:

    sudo kubectl apply -f busybox-client.yaml -n istioclient

  • 查看pod

    sudo kubectl get pods -n istioclient

  • 进入客户端容器中,访问springbootapp服务

    sudo kubectl exec -it busyclient-5f6b7b954d-9wq5q /bin/sh -n istioclient

  • 访问springbootapp服务

    wget -q -O - springbootapp-svc.springistiodemo:8080/hello

    说明:

    1.上述服务格式[servicename].[namespace]:[port]/[action] 客户端与服务不在同一命名空间下,使用上述格式访问服务,参考k8s的namespace隔离机制 2.如在同一命名空间下,则直接使用[servicename]:[port]/[action]访问 for i in `seq 10`;do wget -q -O - springbootapp-svc:8080/hello;done 3.此处的port对应的是k8s的service(svc)节点的port端口值,不是nodePort端口设置值; port是service端口,即k8s中服务之间的访问端口 targetport是pod(也就是容器)的端口 nodeport是容器所在node节点的端口,即外部机器可访问的端口。(通过nodeport类型的service暴露给集群节点) 4.busybox client客户端也必须经过 Istio 注入,因为只有客户端被 Istio 注入才可以接收到来自 Pilot 有关 Virtual Service 和 Destination Rule 的配置信息,才可以保证流量接管生效。

  • 可以通过命令运行busybox,退出后pod自动删除释放

    sudo kubectl run --namespace=springistiodemo busybox --rm -ti --image busybox /bin/sh