全部产品
Search
文档中心

服务网格 ASM:配置服务发现范围提升网格配置的推送效率

更新时间:Dec 26, 2024

当遇到配置更新推送耗时较长、控制平面负载过高、资源配置不够精确等问题时,您可以配置服务发现范围来提升控制平面向数据平面Sidecar代理的推送效率。通过限定ASM控制平面仅处理和发现指定命名空间下的应用,可以有效减少无效通信,加速配置同步进程,确保服务网格的稳定运行并提升运维管理效率。

前提条件

背景信息

说明

本文的Sidecar代理配置或Sidecar配置均指Sidecar代理从控制平面接收到的网格配置信息。

默认情况下,数据平面的Sidecar代理中保存数据平面集群中任意命名空间内所有服务的相关信息(即使该命名空间内的工作负载并未注入Sidecar代理),同时,控制平面也会监视网格中来自所有命名空间内的服务,任何与服务相关的变更都会引起控制平面向所有Sidecar代理推送相关配置。

您可以使用服务发现范围配置功能,根据数据平面集群内命名空间的标签来制定若干标签选择器。标签选择器保证ASM控制平面只需要发现和处理指定命名空间下的应用服务。Sidecar代理配置内将仅保留被选中命名空间内的服务信息,未被选中的命名空间内的服务发生改变,将不会引起Sidecar代理的配置推送。

服务发现范围配置功能的标签选择器支持以下两种规则:

  • 标签精确匹配规则:您需要指定一个标签名和一个标签值,只有命名空间上的标签完全匹配给定的标签名和标签值才能够匹配成功。

  • 标签表达式匹配规则:您可以指定一个标签名、一个表达式操作符、以及一系列标签值来匹配数据平面中的命名空间标签,操作符含义如下:

    • In:数据平面命名空间的标签必须包含给定标签名的标签,且其标签值必须位于给定的一系列标签值中。

    • NotIn:数据平面命名空间的标签必须包含给定标签名的标签,且其标签值必须不在给定的一系列标签值中。

    • Exists:数据平面命名空间的标签必须包含给定标签名的标签,在操作符为Exists时,无需给出任何标签值。

    • DoesNotExist:数据平面命名空间的标签必须不能包含给定标签名的标签,在操作符为DoesNotExist时,无需给出任何标签值。

步骤一:在ASM中创建两个命名空间

  1. 创建ns-in-mesh和ns-not-in-mesh两个命名空间。具体操作,请参见新建命名空间

  2. 为ns-in-mesh命名空间启用Sidecar网格代理自动注入。具体操作,请参见启用自动注入

步骤二:在ACK集群中部署示例应用

  1. 执行以下命令,在ACK集群中为ns-in-mesh命名空间添加asm-discovery=enabled标签。

    kubectl label namespace ns-in-mesh asm-discovery=enabled
  2. 使用以下内容,创建httpbin.yaml文件。

    展开查看httpbin.yaml

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  3. 执行以下命令,分别在ns-in-mesh和ns-not-in-mesh命名空间中创建httpbin示例应用。

    kubectl apply -f httpbin.yaml -n ns-in-mesh
    kubectl apply -f httpbin.yaml -n ns-not-in-mesh

步骤三:查看Sidecar代理配置的推送状态

  1. 查看Sidecar代理配置。

    1. 执行以下命令,获取ns-in-mesh命名空间下httpbin Pod名称。

      kubectl get pods -n ns-in-mesh

      预期输出:

      NAME                       READY   STATUS    RESTARTS   AGE
      httpbin-6fcb98998c-46qhr   2/2     Running   0          22m
    2. 执行以下命令,导出Sidecar代理配置。

      命令中httpbin-6fcb98998c-46qhr请替换为上一步获取的httpbin Pod名称。

      kubectl exec -it httpbin-6fcb98998c-46qhr -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.json
    3. 打开下载到本地的config_dump.json文件,搜索httpbin.ns-not-in-mesh

      可以搜索到httpbin.ns-not-in-mesh,说明即使ns-not-in-mesh命名空间没有启用Sidecar网格代理自动注入,Sidecar代理配置信息中仍然保存着ns-not-in-mesh命名空间中的服务信息。

  2. 查看控制平面日志。

    1. 启用控制平面日志采集。

    2. 在ACK集群的ns-not-in-mesh命名空间中部署sleep应用。

      1. 使用以下内容,创建sleep.yaml文件。

        展开查看sleep.yaml

        ##################################################################################################
        # Sleep service
        ##################################################################################################
        apiVersion: v1
        kind: Service
        metadata:
          name: sleep
          labels:
            app: sleep
        spec:
          ports:
          - port: 80
            name: http
          selector:
            app: sleep
        ---
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: sleep
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: sleep
          template:
            metadata:
              labels:
                app: sleep
            spec:
              containers:
              - name: sleep
                image: pstauffer/curl
                command: ["/bin/sleep", "3650d"]
                imagePullPolicy: IfNotPresent
        ---
      2. 执行以下命令,在ns-not-in-mesh命名空间部署应用。

        kubectl apply -f sleep.yaml -n ns-not-in-mesh
    3. 查看日志。

      ASM实例版本为1.17.2.35以下

      1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

      2. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理

      3. 在网格详情页面,选择网格实例 > 基本信息

      4. 基本信息页面,单击控制面日志采集右侧的查看日志

        在Project页面右上角,设置时间为5分钟,缩小日志查看范围。在原始日志页签下,可以看到创建sleep应用的日志。说明ns-not-in-mesh命名空间没有启用Sidecar代理自动注入,在ns-not-in-mesh中部署应用仍然导致了控制平面向数据平面中Sidecar代理推送配置信息。

        {"content":"2024-01-04T10:27:00.056248Z\tinfo\tads\tPush debounce stable[16] 1 for config ServiceEntry/ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local: 100.183738ms since last change, 100.183497ms since last push, full=true","_time_":"2024-01-04T18:27:00.056310074+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"1|MTcwNDM2MjU0MjUyMjE4OTYxMA==|10|4","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364020"}
        {"content":"2024-01-04T10:26:59.956023Z\tinfo\tads\tFull push, new service ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local","_time_":"2024-01-04T18:26:59.956087922+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"1|MTcwNDM2MjU0MjUyMjE4OTYxMA==|10|3","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364020"}

      ASM实例版本为1.17.2.35及以上

      1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

      2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择可观测管理中心 > 日志中心

      3. 日志中心页面,单击控制平面日志页签,设置时间为5分钟,缩小日志查看范围。

        原始日志页签下,可以看到创建sleep应用的日志。说明ns-not-in-mesh命名空间没有启用Sidecar代理自动注入,在ns-not-in-mesh中部署应用仍然导致了控制平面向数据平面中Sidecar代理推送配置信息。

        {"content":"2024-01-04T10:33:21.180016Z\tinfo\tads\tPush debounce stable[28] 2 for config Address//c847e048f73054cb192835f8a60ea5219//Pod/ns-not-in-mesh/sleep-fc5cdb9c5-pkfvr and 1 more configs: 100.488198ms since last change, 121.179298ms since last push, full=true","_time_":"2024-01-04T18:33:21.180104591+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"0|MTcwNDM1NjA0OTcxOTcxNzAyMw==|11|9","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364401"}
        {"content":"2024-01-04T10:33:21.079470Z\tinfo\tmodel\tFull push, new service ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local","_time_":"2024-01-04T18:33:21.07954976+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"0|MTcwNDM1NjA0OTcxOTcxNzAyMw==|11|8","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364401"}

步骤四:在ASM中进行服务发现范围配置

服务发现范围配置功能可以使ASM控制平面只推送配置到带有asm-discovery标签的ns-in-mesh命名空间下的应用,其他命名空间下的应用将不会引起Sidecar的配置推送。您可以通过选择命名空间或编辑标签选择器两种方式来进行服务发现范围配置。

方式一:通过命名空间配置服务发现范围

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网络实例 > 服务发现范围配置

  3. 服务发现范围配置页面,网格服务发现模式选择自动发现数据面 Kubernetes 集群中选定命名空间下的服务

  4. 选择命名空间页签,选择目标集群,在下方列表中,找到所有ns-in-mesh以外的命名空间。在ns-in-mesh以外的命名空间右侧,单击取消选中,在页面下方,单击确定,在确认对话框,单击确定

  5. 查看命名空间配置是否成功。

    1. 在网格详情页面左侧导航栏,选择网格实例 > 基本信息

    2. 基本信息页面,查看网格的状态

      状态显示为运行中,表示命名空间配置成功。

方式二:通过标签选择器配置服务发现范围

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网络实例 > 服务发现范围配置

  3. 服务发现范围配置页面,网格服务发现模式选择自动发现数据面 Kubernetes 集群中选定命名空间下的服务,然后单击编辑标签选择器页签。

  4. 配置标签名asm-discovery操作符Exists,然后在页面下方,单击确定,在确认对话框,单击确定

  5. 查看标签选择器配置是否成功。

    1. 在网格详情页面左侧导航栏,选择网格实例 > 基本信息

    2. 基本信息页面,查看网格的状态

      状态显示为运行中,表示标签选择器配置成功。

步骤五:验证使用服务发现范围配置功能是否成功

  1. 查看Sidecar代理配置。

    1. 执行以下命令,重新导出Sidecar代理配置。

      命令中httpbin-6fcb98998c-46qhr请替换为实际的httpbin Pod名称。

      kubectl exec -it httpbin-6fcb98998c-46qhr -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.json
    2. 打开下载到本地的config_dump.json文件,搜索httpbin.ns-not-in-mesh

      搜索不到httpbin.ns-not-in-mesh,说明Sidecar代理配置信息中没有保存ns-not-in-mesh命名空间中的服务信息。

  2. 查看控制平面日志。

    1. 执行以下命令,在ACK集群的ns-not-in-mesh命名空间中删除sleep应用。

      kubectl delete -f sleep.yaml -n ns-not-in-mesh
    2. 查看日志。

      ASM实例版本为1.17.2.35以下

      1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

      2. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理

      3. 在网格详情页面,选择网格实例 > 基本信息

      4. 基本信息页面,单击控制面日志采集右侧的查看日志

        在Project页面右上角,设置时间为15分钟,缩小日志查看范围。此时无法查看到关于删除的sleep应用的日志。说明在服务发现之外的命名空间发生变更,并不会引起控制平面向Sidecar代理推送配置信息。

      ASM实例版本为1.17.2.35及以上

      1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

      2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择可观测管理中心 > 日志中心

      3. 日志中心页面,单击控制平面日志页签,设置时间为15分钟,缩小日志查看范围。

        此时无法查看到关于删除的sleep应用的日志。说明在服务发现之外的命名空间发生变更,并不会引起控制平面向Sidecar代理推送配置信息。

相关操作

在服务发现范围中排除指定标签的Pod

服务网格默认发现Kubernetes集群中的所有服务和Pod,当一个Pod在服务发现范围之外时,服务网格控制面将不会发现此Pod,任何被Sidecar代理的请求将不会发送到此Pod。在服务网格1.20及以上版本,您可以通过配置标签选择器的方式,从服务发现范围中排除满足指定标签的Pod。通过这种方式,可以快速转移Pod接收的所有流量。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网络实例 > 服务发现范围配置

  3. 单击展开高级选项,单击排除指定标签的Pod,填写标签名标签值,以在服务发现范围中排除指定标签的Pod。同时,您也可以使用topology.kubernetes.io/region来排除指定地域的Pod,使用topology.kubernetes.io/zone来指定可用区的Pod。

  4. 在页面下方,单击确定。在弹出的对话框中,单击确定