阿里云服务网格多集群应用统一流量管理

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配置。
阿里云服务网格多集群应用统一流量管理

上一篇:阿里云服务器有哪里优势?为什么优先选择阿里云服务器?


下一篇:【预告】5月14日机器学习PAI发布会,揭秘最懂你的轻量化AI服务