天天看點

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

Istio 的流量路由規則可以讓您很容易的控制服務之間的流量和 API 調用。它簡化了服務屬性的配置,通過配置可以能輕松的實作A/B 測試、金絲雀釋出、基于流量百分比切分的機率釋出等。它還提供了開箱即用的故障恢複特性,有助于增強應用的健壯性,進而更好地應對被依賴的服務或網絡發生故障的情況。

本次Demo着重展示了應用流量管理中按百分比切分流量到服務不同版本的場景。建立的istio自定義資源包括虛拟服務,目标規則,網關。其中虛拟服務,目标規則是流量路由功能的關鍵。虛拟服務(virtual service)定義了一系列指定服務的流量路由規則,目标規則(destination rule)定義了在路由發生後應用于服務的流量政策。

Demo應用使用的是一個10個微服務組成的

商城應用 ,架構如圖所示
阿裡雲服務網格多叢集應用統一流量管理
其中product-catalog服務用來展示商品的類目,我們有三個版本的catalog服務,分别展示不同的商品類目。

準備資源

  • 建立同vpc 兩個托管版k8s叢集 ,可通路阿裡雲容器服務控制台進行建立。
  • 設定k8s叢集安全組規則,允許兩個叢集可互相通路。安全組規則可以在ecs控制台進行設定。
阿裡雲服務網格多叢集應用統一流量管理

建立服務網格執行個體

通路

服務網格控制台

,建立新網格,填寫相關内容。專有網絡選擇使用跟已經建立好的k8s叢集相同的vpc。

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

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

mesh執行個體建立成功後,進入mesh詳情頁。在資料平面中選擇叢集,點選添加。選擇建立好的兩個k8s叢集進行添加。成功後如圖所示。

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

在入口網關服務Tab中,點選部署,将入口網關服務部署到資料平面的一個叢集中。

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

部署demo應用到k8s叢集

在資料面的兩個k8s叢集中建立demo命名空間,添加label,istio-injection:enabled。

在demo命名空間下部署demo應用(應用的yaml檔案在kubernetes-manifests檔案夾中)

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

部署成功後如圖所示

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

添加網關和虛拟服務

建立命名空間

服務網格控制台中執行個體的控制台平面裡建立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應用。

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

部署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配置。

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

繼續閱讀