昨天介紹 istio gateway 時有提到,他需要透過 virtual service 才能做到 L7 route rule 的功能,今天就來跟大家介紹這個東西

首先大家先看一下這個部署檔

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: first-vs
spec:
  hosts:
  # 這邊可以選擇要不要指定
  - "first-vs.com"
  gateways:
  # 這邊要指定昨天做過的 gateway名稱
  - first-gateway
  http:
  - route:
    - destination:
        port:
          number: 80
        host: grpc-client.test-istio.svc.cluster.local  #這裡就是指向你真正服務 service 的名稱喔

上面 destionation 下面的 host 名稱會這麽長,這是 k8s 內部實際 dns 全名,如果需要跨 namspace 存取,就需要用這樣的全名方式指定。

{service name}.{namespace}.svc.cluster.local 這就是它的規則

這邊簡單說明一下,它的流量管理方式

spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: grpc-client
        subset: v1
      weight: 75
    - destination:
        host: grpc-client
        subset: v2
      weight: 25

假設你服務要進行改版,你可以同時部署上去,然後透過 virtualservice 來控制,改版的服務可能只分配總流量的 25% 給它,來做實際測試,這種方式會比傳統的更新程式更來得穩固,因為你可以用實際流量來測試新服務有沒有什麼 bug ,就算真的有問題,你也只會損失 25% 的流量,而不會造成全面性的災難,損失客戶流量。

最後以這幾天範例下來,這個流程會是

istio-vs

實務上『切記』istio-ingressgateway,可以有多個選擇,這個 istio-ingressgateway 是 istio 安裝完後預設的,如果放在真實環境,如果有多組 ip 需要掛上去,這時侯就需要使用多組 ingressgateway。