Istio實踐(3)- 路由控制及多應用部署(netcore&springboot)

xjk27400861發表於2022-04-21

前言:接上一篇istio應用部署及服務間呼叫,本文介紹通過構建.netcore與springboot簡單服務應用,實現服務間呼叫及相關路由控制等

1、.netcore程式碼介紹及應用部署

  • 新建.netcore webapi服務專案,新增簡單服務呼叫方法(getStrByServiceName與getStrByIPAddress),返回預設字串方法getDetaultStr
    image
    image
  • 通過我們前面文章《Azure 實踐(3)- Azure Devops構建.netcore專案,打包Docker映象+執行容器部署》,打包我們的服務應用,並構建映象推送到docker hub中,構建Tag為45的映象
    image
  • 建立netapp-1nodes.yaml檔案,構建應用netapp及k8s svc service對外提供服務訪問
    image
  • 建立名稱空間netistiodemo,並設定istio自動注入:
      sudo kubectl create namespace netistiodemo
      sudo kubectl label namespace netistiodemo istio-injection=enabled
      sudo kubectl get ns netistiodemo --show-labels # 檢視注入狀態
    
  • 建立應用(namespace:netistiodemo):
      sudo kubectl apply -f netapp-1nodes.yaml -n netistiodemo
    
  • 建立netapp-destination.yaml並建立DestinationRule
      sudo kubectl apply -f netapp-destination.yaml -n netistiodemo
    
    image
  • 建立Gateway & VirtualService
      sudo kubectl apply -f nettapp-vs-v1.yaml -n netistiodemo
    
    image
  • GateWay設定的port埠為81,由於istio-ingressgateway的80埠,我們已經開放對應了springbootapp應用,所以我們要給istio-ingressgateway新增埠對映,對映到netapp應用上,我們可以通過rancher管理工具新增埠對映,當然你也可以通過編輯istio-ingressgateway的yaml檔案來新增埠對映
    image
  • 這樣,我們就通過多個gateway來訪問不同名稱空間的應用(k8s節點ip+埠31381)來訪問netapp;(k8s節點ip+埠31380)來訪問springbootapp
    image
    image

2、springboot程式碼介紹及應用部署

  • springboot服務專案,參考我以前的dubbo實踐程式碼,這裡只展示我們要用的簡單的webapi服務
    image
  • 部署應用參考前面兩篇文章,都是基於這個應用部署的,使用到2個版本;這裡省略部署步驟(名稱空間:springistiodemo)
    image

3、springboot應用與.netcore服務應用呼叫介紹

  • 我們可以通過netapp的方法(getStrByServiceName與getStrByIPAddress)來呼叫springbootapp的hello服務方法
  • 我通過管理工具kiali的服務呼叫鏈路圖來展示服務呼叫關係;有藍色線的是情況1,純綠色先的是情況2
    image

4、路由控制

  • 配置1:修改springbootapp-vs-v1.yaml檔案,新增不同名稱空間的應用服務的配置,新增多個gateway
    image
  • 說明:
      gateway:springbootapp-gateway為同namespace的gateway;netistiodemo/netapp-gateway為netistiodemo空間的gateway,格式【名稱空間】/【gateway名】
      match:uri prefix字首匹配,將以/net/、/netcore/為字首的請求,對映到netapp服務上;請求規則支援exact(完全匹配),prefix(字首匹配)、regex(正則匹配)三種匹配方式
      host:netapp-svc.netistiodemo.svc.cluster.local,指向namespace為netistiodemo的.netcore服務中,格式【service svc】+【名稱空間】+ 【預設:svc.cluster】 + 【叢集名稱】
    
  • 路由結果(兩個gateway的監聽埠【31380&31381】均可訪問),並且不同的uri字首(/net/ 與/netcore/)都定位到了服務
    image
    image
  • 配置2:路由直接匹配到應用服務具體的服務上(netapp應用的api/Query/getDetaultStr服務)
    image
    image
  • 配置3:通過新增spring的字首,定位到本namespace的springbootapp應用上
    image
    image
  • 配置4:如無路由匹配規則(無字首匹配),則直接定位到netcoreapp上
    image
    image
  • Istio virtual service檔案springbootapp-vs-v1.yaml詳情:
      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: springbootapp-v1
      spec:
        hosts:
        - "*"
        gateways:
        - springbootapp-gateway
        - netistiodemo/netapp-gateway
        http:
        - fault:
            delay:
              fixedDelay: 1s
              percent: 100
          match:
          - uri:
              prefix: /net/
          - uri:
              prefix: /netcore/
          rewrite:
            uri: /
          route:
          - destination:
              host: netapp-svc.netistiodemo.svc.cluster.local
              port:
                number: 8081
              subset: v1
        - match:
          - uri:
              exact: /netdefault
          rewrite:
            uri: /api/Query/getDetaultStr
          route:
          - destination:
              host: netapp-svc.netistiodemo.svc.cluster.local
              port:
                number: 8081
              subset: v1
        - match:
          - uri:
              exact: /redirect
          redirect:
            authority: springbootapp-svc
            uri: /hello
        - match:
          - uri:
              prefix: /spring
          rewrite:
            uri: /
          route:
          - destination:
              host: springbootapp-svc
              port:
                number: 8080
              subset: v1
            weight: 70
          - destination:
              host: springbootapp-svc
              port:
                number: 8080
              subset: v2
            weight: 30
          timeout: 5s
        - route:
          - destination:
              host: netapp-svc.netistiodemo.svc.cluster.local
              port:
                number: 8081
              subset: v1
    

5、服務呼叫實踐

  • 通過netapp的服務/api/Query/getStrByServiceName傳入服務名埠等資訊訪問springbootapp應用的hello服務;可以看到可以訪問到springbootapp的v1和v2版本服務
    image
    image
    image
  • 通過netapp的服務/api/Query/getStrByIPAddress傳入IP埠等資訊訪問springbootapp應用的hello服務;可以看到可以訪問到springbootapp的v1和v2版本服務
    image
  • 通過訪問springbootapp的svc對外訪問埠也可以實現服務呼叫,且遵循Istio流量規則
    image
    image
    image

相關文章