雲計算

阿里雲服務網格多集群應用統一流量管理

Istio 的流量路由規則可以讓您很容易的控制服務之間的流量和 API 調用。它簡化了服務屬性的配置,通過配置可以能輕鬆的實現A/B 測試、金絲雀發佈、基於流量百分比切分的概率發佈等。它還提供了開箱即用的故障恢復特性,有助於增強應用的健壯性,從而更好地應對被依賴的服務或網絡發生故障的情況。
本次Demo著重展示了應用流量管理中按百分比切分流量到服務不同版本的場景。創建的istio自定義資源包括虛擬服務,目標規則,網關。其中虛擬服務,目標規則是流量路由功能的關鍵。虛擬服務(virtual service)定義了一系列指定服務的流量路由規則,目標規則(destination rule)定義了在路由發生後應用於服務的流量策略。

Demo應用使用的是一個10個微服務組成的商城應用,架構如圖所示
demo-1.jpg
其中product-catalog服務用來展示商品的類目,我們有三個版本的catalog服務,分別展示不同的商品類目。

準備資源

  • 創建同vpc 兩個託管版k8s集群 ,可訪問阿里雲容器服務控制檯進行創建。
  • 設置k8s集群安全組規則,允許兩個集群可相互訪問。安全組規則可以在ecs控制檯進行設置。

demo-2.jpg

創建服務網格實例

訪問服務網格控制檯,創建新網格,填寫相關內容。專有網絡選擇使用跟已經創建好的k8s集群相同的vpc。
demo-3.jpg

添加集群,部署入口網關服務

mesh實例創建成功後,進入mesh詳情頁。在數據平面中選擇集群,點擊添加。選擇創建好的兩個k8s集群進行添加。成功後如圖所示。
demo-4.jpg
在入口網關服務Tab中,點擊部署,將入口網關服務部署到數據平面的一個集群中。
demo-5.jpg

部署demo應用到k8s集群

在數據面的兩個k8s集群中創建demo命名空間,添加label,istio-injection:enabled。
在demo命名空間下部署demo應用(應用的yaml文件在kubernetes-manifests文件夾中)

kubectl apply --namespace=demo -f ./kubernetes-manifests/

部署成功後如圖所示
demo-6.jpg

添加網關和虛擬服務

新建命名空間
服務網格控制檯中實例的控制檯平面裡新建demo命名空間
新建網關
服務網格控制檯中實例的控制檯平面裡,切換至服務網關,新建frontend-gateway。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: frontend-gateway
  namespace: demo
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
        - '*'
      port:
        name: http
        number: 80
        protocol: HTTP

新建虛擬服務
服務網格控制檯中實例的控制檯平面裡,切換至虛擬服務,新建frontend-ingress。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: frontend-ingress
  namespace: demo
spec:
  gateways:
    - frontend-gateway
  hosts:
    - '*'
  http:
    - route:
        - destination:
            host: frontend
            port:
              number: 80

上述配置完成後,訪問入口服務網關地址(負載均衡地址),就可以訪問到demo應用。
demo-5.jpg
demo-7.jpg

部署productcatalogservice不同版本

在已經部署應用的集群中,部署productcatalogservice-v2

apiVersion: apps/v1
kind: Deployment
metadata:
  name: productcatalogservice-v2
  labels:
    app: productcatalogservice
    version: v2
spec:
  selector:
    matchLabels:
      app: productcatalogservice
      version: v2
  template:
    metadata:
      labels:
        app: productcatalogservice
        version: v2
    spec:
      terminationGracePeriodSeconds: 5
      containers:
      - name: server
        image: registry.cn-hangzhou.aliyuncs.com/ack/istio-demo-productcatalogservice:0.1
        imagePullPolicy: Always
        ports:
        - containerPort: 3550
        env:
        - name: PORT
          value: "3550"
        - name: CATALOG_VERSION
          value: "v2"  
        readinessProbe:
          exec:
            command: ["/bin/grpc_health_probe", "-addr=:3550"]
        livenessProbe:
          exec:
            command: ["/bin/grpc_health_probe", "-addr=:3550"]
        resources:
          requests:
            cpu: 100m
            memory: 64Mi
          limits:
            cpu: 200m
            memory: 128Mi

在服務網格管理的另一個集群中,部署productcatalogservice-v3

apiVersion: apps/v1
kind: Deployment
metadata:
  name: productcatalogservice-v3
  labels:
    app: productcatalogservice
    version: v3
spec:
  selector:
    matchLabels:
      app: productcatalogservice
      version: v3
  template:
    metadata:
      labels:
        app: productcatalogservice
        version: v3
    spec:
      terminationGracePeriodSeconds: 5
      containers:
      - name: server
        image: registry.cn-hangzhou.aliyuncs.com/ack/istio-demo-productcatalogservice:0.1
        imagePullPolicy: Always
        ports:
        - containerPort: 3550
        env:
        - name: PORT
          value: "3550"
        - name: CATALOG_VERSION
          value: "v3"    
        readinessProbe:
          exec:
            command: ["/bin/grpc_health_probe", "-addr=:3550"]
        livenessProbe:
          exec:
            command: ["/bin/grpc_health_probe", "-addr=:3550"]
        resources:
          requests:
            cpu: 100m
            memory: 64Mi
          limits:
            cpu: 200m
            memory: 128Mi
---    
apiVersion: v1
kind: Service
metadata:
  name: productcatalogservice
  labels:
    app: productcatalogservice
spec:
  type: ClusterIP
  selector:
    app: productcatalogservice
  ports:
  - name: grpc
    port: 3550
    targetPort: 3550

添加虛擬服務和目標規則,控制不同版本訪問流量百分比

服務網格控制檯中實例的控制檯平面裡,切換至目標規則,新建productcatalogservice。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: productcatalogservice
  namespace: demo
spec:
  host: productcatalogservice
  subsets:
    - labels:
        version: v1
      name: v1
    - labels:
        version: v2
      name: v2
    - labels:
        version: v3
      name: v3

服務網格控制檯中實例的控制檯平面裡,切換至虛擬服務,新建productcatalogservice。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productcatalogservice
  namespace: demo
spec:
  hosts:
    - productcatalogservice
  http:
    - route:
        - destination:
            host: productcatalogservice
            subset: v1
          weight: 40
        - destination:
            host: productcatalogservice
            subset: v2
          weight: 30
        - destination:
            host: productcatalogservice
            subset: v3
          weight: 30

再次訪問入口服務網關地址,刷新頁面,可以看到不同版本的商品類目,訪問概率如上述weight配置。
demo-8.jpg

Leave a Reply

Your email address will not be published. Required fields are marked *