Istio實踐(2)-流量控制及服務間呼叫

xjk27400861發表於2022-04-12

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

相關文章