如何自定义并应用对 Istio 资源的配置变更?

目录

Overview

Background information

平台通过封装 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 资源。

Solution overview

当产品 UI 无法满足您对功能和原生 Istio 支持的期望时,您可以参考本文档,在 平台管理 > 集群 > 资源 页面自定义并应用对 Istio 资源 YAML 文件的变更,暂时使用原生 Istio 提供的能力。

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

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

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

Constraints and limitations

  • 使用此方法配置的 Istio 资源将不再受 Controller 组件控制,需要用户自行管理。

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

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

Configuration example

下面以修改 DestinationRule 资源,为服务的多个端口配置不同的负载均衡策略为例,说明配置方法。

Scenario

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

Procedure

  1. 进入服务网格平台,点击左侧导航栏的 Services

  2. 点击要配置的 服务名称

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

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

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

  5. 点击顶部导航栏的产品视图切换入口,切换到 平台管理

  6. 在左侧导航栏点击 集群 > 资源

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

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

  8. 点击 DestinationRule 右侧的 > 更新

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

    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      annotations:
        asm.cpaas.io/user-managed: "true"  # Add annotation
        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  # Default to the least request load balancing policy for all ports of the service
        portLevelSettings: # Configure session affinity load balancing policy based on user source IP for port 81
          - loadBalancer:
              consistentHash:
                useSourceIp: true
            port:
              number: 81