2

Istio实践(2)-流量控制及服务间调用 - xjk27400861

 2 years ago
source link: https://www.cnblogs.com/kunwn/p/16114859.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

前言:接上一篇istio应用部署,本文介绍通过virtualservice实现流量控制,并通过部署client端进行服务调用实例

1. 修改virtualservice组件,实现权重占比访问不同版本服务(v1版本70%,v2版本30%)

  • 拆分流量使用weight关键字来设置,70%的流量走v1版本,30%的流量走v2版本
    image
  • 输入命令,重新应用一下virtualservice组件
      sudo kubectl apply -f springbootapp-vs-v1.yaml -n springistiodemo
    
  • 通过istio-ingressgateway对外访问的地址,进行服务访问(http://ip:31380/hello)
    image
  • 通过kiali管理界面,查看服务调用详情,可以看到v1版本访问占比大概达到70%左右
    image

2. 超时时间设置,timeout:0.002s

  • 修改virtualservice的yaml文件,添加timeout属性,数值改小一些,方便测试
    image
  • 访问服务,不断刷新,发现有一部分服务已超时,访问不到
    image
  • 通过kiali管理界面,查看服务调用详情,发现v2版本已100% error
    image

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 # 查看注入状态
    

    image

  • 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" ]
    

    image

  • 执行命令,创建Deployment:
      sudo kubectl apply -f busybox-client.yaml -n istioclient
    
  • 查看pod
      sudo kubectl get pods -n istioclient
    

    image

  • 进入客户端容器中,访问springbootapp服务
      sudo kubectl exec -it busyclient-5f6b7b954d-9wq5q /bin/sh -n istioclient
    

    image

  • 访问springbootapp服务
      wget -q -O - http://springbootapp-svc.springistiodemo:8080/hello
    

    image

      1.上述服务格式[servicename].[namespace]:[port]/[action]
      客户端与服务不在同一命名空间下,使用上述格式访问服务,参考k8s的namespace隔离机制
      2.如在同一命名空间下,则直接使用[servicename]:[port]/[action]访问
      for i in `seq 10`;do wget -q -O - http://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
    

    image


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK