Istio實踐(2)- 流量控制及服務間調用


前言:接上一篇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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM