更新时间:2024-03-18 GMT+08:00

1.3升级1.8 VirtualService支持Delegate切换

操作场景

1.8版本的网格默认支持VirtualService的Delegate功能,同时ASM控制台界面也仅支持delegate格式的VirtualService,升级版本并不会对用户的VirtualService进行修改,在升级后用户将无法在页面对路由进行维护,因此用户需要根据本文指导对应用VirtualService进行修改。

对于Delegate的介绍可以参考istio社区的说明:

https://istio.io/latest/docs/reference/config/networking/virtual-service/#Delegate

约束与限制

  • 只有在route和redirect为空时才能设置Delegate。
  • ASM只支持一级Delegate,多级Delegate不会生效。
  • Delegate VirtualService的HTTPMatchRequest必须是root VirtualService的子集,否则会产生冲突。
  • Delegate特性只对HTTP/gRPC协议有效,其他协议无需修改。

操作步骤

修改将分两种情况,下面以加入网格的Tomcat服务为例。

一、若升级前服务未添加网关,则升级后无需修改。

二、若升级前服务添加了网关,则升级后进行如下修改:

  1. 为网格所在集群配置kubectl命令,参考CCE控制台集群详情页的指导进行配置。
  2. 在istio-system命名空间下创建两个VirtualService YAML文件。

    文件名:tomcat-default-gateway.yaml

    其中,

    • tomcat:为修改的服务名
    • tomcat-default-gateway:为该VirtualService名,格式为{服务名}-default-gateway
    • tomcat-route:为修改VirtualService的名字
    • 100.85.219.117:为ELB的IP
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: tomcat-default-gateway
      namespace: istio-system
    spec:
      gateways:
      - istio-system/tomcat-default-gateway
      hosts:
      - 100.85.219.117
      http:
      - delegate:
          name: tomcat-route
          namespace: default
        match:
        - uri:
            prefix: /test
    

    文件名:tomcat-route-default.yaml

    其中,

    • tomcat:为修改的服务名
    • tomcat-route-default:为该VirtualService名,格式为{服务名}-route-default
    • tomcat-route:为修改VirtualService的名字
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: tomcat-route-default
      namespace: istio-system
    spec:
      hosts:
      - tomcat.default.svc.cluster.local
      http:
      - delegate:
          name: tomcat-route
          namespace: default
        match:
        - uri:
            prefix: /
    

    使用如下命令创建VirtualService。

    kubectl create -f tomcat-route-default.yaml

    kubectl create -f tomcat-default-gateway.yaml

  3. kubectl -n{namespace} get vs获取到服务的VirtualService,执行kubectl -n{namespace} edit vs tomcat-route修改如下:
    1. 删除spec.gateways、spec.hosts和spec.http.match.uri
    2. tomcat-default-gateway.istio-system.svc.cluster.local替换成istio-system/tomcat-default-gateway
    3. 修改apiVersion: networking.istio.io/v1alpha3为apiVersion: networking.istio.io/v1beta1
    4. destination.host:格式为{服务名}.{namespace}.svc.cluster.local
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: tomcat-route
      namespace: default
    spec:
      gateways:
      - tomcat-default-gateway.istio-system.svc.cluster.local
      - mesh
      hosts:
      - tomcat
      - 100.85.219.117  # spec.gateways、spec.hosts需要删除
      http:
      - match:
        - gateways:
          - istio-system/tomcat-default-gateway
          port: 5555
          uri:
            prefix: /test  # spec.http.match.uri需要删除
        route:
        - destination:
            host: tomcat.default.svc.cluster.local
            port:
              number: 8080
            subset: v1
      - match:
        - gateways:
          - mesh
          port: 8080
        route:
        - destination:
            host: tomcat.default.svc.cluster.local
            port:
              number: 8080
            subset: v1
  4. 升级完成后在服务列表页面,单击外部访问URL,检查访问是否正常。
  5. 在服务网关页面,检查服务网关路由是否显示正常。