如何自定义和应用配置变更到 Istio 资源?

概述

背景信息

该平台通过封装 CRD 或操作 Istio 资源(DestinationRule、VirtualService 等)提供 Istio 功能。操作(添加、删除、修改)Istio 资源的方式包括:

  • 用户在平台 UI 上执行操作。

    • 在特定功能页面中执行操作。例如,在服务详情页面的 Routes 标签页中,通过 Create Route 创建一个虚拟服务资源。

    • 直接编辑集群 Resources 页面上的 Istio 资源的 YAML 文件。管理员可以对 Kubernetes 资源(包括 Istio 资源)执行 YAML 的创建、修改或删除操作。

  • 服务网格组件 Controller (global-asm-controller/asm-controller) 根据 CRD 或 API 自动进行调优,在调优过程中,Controller 会自动更新 Istio 资源。

    例如,在平台的 UI 上为服务创建负载均衡策略后,Controller 会自动创建相应的 DestinationRule 资源;反之,在删除负载均衡策略后,Controller 会自动删除相应的 DestinationRule 资源。

解决方案概述

当产品 UI 的功能和原生 Istio 支持未能满足您的期望时,您可以参考本文档在 Platform Management > Clusters > Resources 页面自定义并应用 Istio 资源的 YAML 文件中的变更,暂时使用原生 Istio 提供的功能。

自定义和应用 Istio 资源配置变更的方法如下:

  1. 在 Istio 资源上添加注释 asm.cpaas.io/user-managed: "true",以将其从 Controller 控制中分离,避免 Controller 组件恢复或修改自定义更改。

  2. 根据 Istio 提供的配置参考自定义 YAML 配置。

约束和限制

  • 通过此方法配置的 Istio 资源将不再受 Controller 组件的控制,用户需要手动管理。

  • 如果修改后的 YAML 配置不符合 Istio 的设计,可能会导致未知的问题影响功能。

  • 当您将来升级到新的 Istio 版本时,平台将不会处理未管理资源的兼容性升级。您需要自行评估兼容性并进行兼容性处理。

配置示例

下面,我们将使用修改 DestinationRule 资源的场景,为服务的多个端口配置不同的负载均衡策略,来说明配置方法。

场景

服务 s1 有 2 个端口 80(HTTP 协议)和 81(TCP 协议)。在通过 UI 为服务创建负载均衡策略时,只支持为所有端口配置相同的策略(例如,最少请求负载均衡)。您可以修改 s1 的 DestinationRule 资源,为端口 8081 分别配置不同的负载均衡策略。

程序

  1. 进入服务网格平台后,在左侧导航栏单击 Services

  2. 点击要配置的 service name

  3. Policies 标签页下,点击 Create Policy > Load Balancer

  4. 选择 Minimum Request Load 策略,然后单击 Create

    提示:成功创建负载均衡策略后,Controller 组件会自动创建一个名为 asm-<service name> 的 DestinationRule 资源。您可以在 Resources 中查看该资源的 YAML 文件。

  5. 点击顶部导航栏中的产品视图切换入口,切换到 Platform Management

  6. 在左侧导航栏中,点击 Clusters > Resources

    提示:您可以通过顶部导航切换集群。

  7. 在服务所在的命名空间中,搜索名为 asm-<service name> 的 DestinationRule 资源。

  8. 点击 > DestinationRule 右侧的 Update

    根据下面的示例,添加注释 asm.cpaas.io/user-managed: "true" 并分别为服务的端口配置 负载均衡策略

    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      annotations:
        asm.cpaas.io/user-managed: "true"  # 添加注释
        cpaas.io/operator: admin@cpaas.io
        cpaas.io/updated-at: 2024-03-08T03:17:00Z
      creationTimestamp: 2024-03-07T10:22:11Z
      generation: 2
      labels:
        asm.cpaas.io/creator: asm-controller
        asm.cpaas.io/hostname: s1
        servicemesh.cpaas.io/resource: microservice
      name: asm-s1
      namespace: foo-ovn
      ownerReferences:
        - apiVersion: v1
          kind: Endpoints
          name: s1
          uid: b8ae24ba-b0ae-4432-a42c-09619a798963
      resourceVersion: "24795213"
      uid: 99fddf65-4812-4948-a92b-62de33fa3b4f
    spec:
      host: s1
      trafficPolicy:
        loadBalancer:
          simple: LEAST_CONN  # 默认为所有服务端口使用最少请求负载均衡策略
        portLevelSettings: # 根据用户源 IP 为端口 81 配置会话亲和性负载均衡策略
          - loadBalancer:
              consistentHash:
                useSourceIp: true
            port:
              number: 81