您可以通过服务发现范围配置功能保证ASM控制平面只发现和处理指定命名空间下的应用,提升控制平面推送到数据平面Sidecar的效率。本文介绍如何使用服务发现范围配置提升控制平面推送效率。

前提条件

背景信息

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

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

服务发现范围配置功能的标签选择器支持以下两种规则:
  • 标签精确匹配规则:您需要指定一个标签名和一个标签值,只有命名空间上的标签完全匹配给定的标签名和标签值才能够匹配成功。
  • 标签表达式匹配规则:您可以指定一个标签名、一个表达式操作符、以及一系列标签值来匹配数据平面中的命名空间标签,操作符含义如下:
    • In:数据平面命名空间的标签必须包含给定标签名的标签,且其标签值必须位于给定的一系列标签值中。
    • NotIn:数据平面命名空间的标签必须包含给定标签名的标签,且其标签值必须不在给定的一系列标签值中。
    • Exists:数据平面命名空间的标签必须包含给定标签名的标签,在操作符为Exists时,无需给出任何标签值。
    • DoesNotExist:数据平面命名空间的标签必须不能包含给定标签名的标签,在操作符为DoesNotExist时,无需给出任何标签值。

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

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理
  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格实例 > 全局命名空间
  3. 全局命名空间页面,单击新建
  4. 新建命名空间面板,设置命名空间的名称(本文设置为ns-in-mesh),然后单击确定
  5. 重复上述步骤,创建名为ns-not-in-mesh的命名空间。
  6. 为ns-in-mesh命名空间启用自动注入。
    1. 全局命名空间页面的自动注入列,单击ns-in-mesh命名空间对应的启用 Sidecar 自动注入
    2. 确认对话框,单击确定

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

  1. 执行以下命令,在ACK集群中为ns-in-mesh命名空间添加asm-discovery=enabled标签。
    kubectl label namespace ns-in-mesh asm-discovery=enabled
  2. 使用以下内容,创建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. 在两个命名空间中创建httpbin示例应用。
    • 执行以下命令,在ns-in-mesh创建httpbin示例应用。
      kubectl apply -f httpbin.yaml -n ns-in-mesh
    • 执行以下命令,在n-not-in-meshs创建httpbin示例应用。
      kubectl apply -f httpbin.yaml -n n-not-in-meshs

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

  1. 查看Sidecar配置。
    1. 执行以下命令,下载Sidecar配置。
      kubectl exec -it httpbin-74fb669cc6-m**** -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.svc.cluster.local
      可以搜索到httpbin.ns-not-in-mesh.svc.cluster.local,说明即使ns-not-in-mesh命名空间没有启用Sidecar自动注入,Sidecar配置信息中心仍然保存着ns-not-in-mesh命名空间中的服务信息。
  2. 查看控制平面日志。
    1. 启用控制平面日志采集。具体操作,请参见启用控制平面日志采集和日志告警
    2. 在ACK集群中部署Sleep应用。
      1. 使用以下内容,创建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. 查看日志。
      1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理
      2. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
      3. 在网格详情页面,选择网格实例 > 基本信息
      4. 基本信息页面,单击控制面日志采集右侧的查看日志
        在Project页面右上角,设置时间为5分钟,缩小日志查看范围。在原始日志页签下,可以看到创建应用的日志。说明ns-not-in-mesh命名空间没有启用Sidecar自动注入,在ns-not-in-mesh中部署应用仍然导致了控制平面向数据平面中Sidecar推送配置信息。
        2021-12-03T09:18:19.939580Z    info    ads    Incremental push, service sleep.ns-not-in-mesh.svc.cluster.local has no endpoints
        2021-12-03T09:18:20.040291Z    info    ads    Push debounce stable[18] 2: 100.661695ms since last change, 107.19307ms since last push, full=true
        2021-12-03T09:18:20.040785Z    info    ads    XDS: Pushing:2021-12-03T09:18:20Z/11 Services:13 ConnectedEndpoints:1  Version:2021-12-03T09:18:20Z/11
        2021-12-03T09:18:20.041444Z    info    ads    CDS: PUSH for node:httpbin-74fb669cc6-z****.ns-in-mesh resources:20 size:12.9kB
        2021-12-03T09:18:20.041499Z    info    ads    EDS: PUSH for node:httpbin-74fb669cc6-z****.ns-in-mesh resources:12 size:1.6kB empty:0 cached:12/12
        2021-12-03T09:18:20.042280Z    info    ads    LDS: PUSH for node:httpbin-74fb669cc6-z****.ns-in-mesh resources:16 size:80.8kB
        2021-12-03T09:18:20.042472Z    info    ads    RDS: PUSH for node:httpbin-74fb669cc6-z****.ns-in-mesh resources:7 size:5.3kB
        2021-12-03T09:18:20.049506Z    info    ads    EDS: PUSH request for node:httpbin-74fb669cc6-z****.ns-in-mesh resources:13 size:1.6kB empty:1 cached:12/13
        2021-12-03T09:18:20.058780Z    info    ads    RDS: PUSH request for node:httpbin-74fb669cc6-z****.ns-in-mesh resources:8 size:6.4kB
        2021-12-03T09:18:28.260944Z    info    ads    Full push, new service ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local
        2021-12-03T09:18:28.361036Z    info    ads    Push debounce stable[19] 1: 100.041329ms since last change, 100.041123ms since last push, full=true
        2021-12-03T09:18:28.361524Z    info    ads    XDS: Pushing:2021-12-03T09:18:28Z/12 Services:13 ConnectedEndpoints:1  Version:2021-12-03T09:18:28Z/12
        2021-12-03T09:18:28.362134Z    info    ads    CDS: PUSH for node:httpbin-74fb669cc6-z****.ns-in-mesh resources:20 size:12.9kB
        2021-12-03T09:18:28.362238Z    info    ads    EDS: PUSH for node:httpbin-74fb669cc6-z****.ns-in-mesh resources:13 size:1.7kB empty:0 cached:12/13
        2021-12-03T09:18:28.362918Z    info    ads    LDS: PUSH for node:httpbin-74fb669cc6-z****.ns-in-mesh resources:16 size:80.8kB
        2021-12-03T09:18:28.363128Z    info    ads    RDS: PUSH for node:httpbin-74fb669cc6-z****.ns-in-mesh resources:8 size:6.4kB

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

服务发现范围配置功能可以使ASM控制平面只推送配置到带有asm-discovery标签的ns-in-mesh命名空间下的应用,其他命名空间下的应用将不会引起Sidecar的配置推送。

您可以通过选择命名空间或编辑标签选择器两种方式来进行服务发现范围配置。

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

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理
  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格优化中心 > 服务发现范围配置
  3. 服务发现范围配置页面,网格服务发现模式选择对选中命名空间进行服务发现
  4. 选择命名空间页签,选择目标集群,在下方列表中的ns-in-mesh命名空间右侧,单击选中,然后在页面下方,单击确定
  5. 查看命名空间配置是否成功。
    1. 在网格详情页面左侧导航栏,选择网格实例 > 基本信息
    2. 基本信息页面,查看网格的状态
      状态显示为运行中,表示命名空间配置成功。

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

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理
  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格优化中心 > 服务发现范围配置
  3. 服务发现范围配置页面,网格服务发现模式选择对选中命名空间进行服务发现,然后单击编辑标签选择器页签。
  4. 单击添加标签选择器,在新增的标签选择器中,单击添加标签表达式匹配规则,配置标签名asm-discovery标签值Exists,然后在页面下方,单击确定
  5. 查看标签选择器配置是否成功。
    1. 在网格详情页面左侧导航栏,选择网格实例 > 基本信息
    2. 基本信息页面,查看网格的状态
      状态显示为运行中,表示标签选择器配置成功。

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

  1. 查看Sidecar配置。
    1. 执行以下命令,下载Sidecar配置。
      kubectl exec -it httpbin-74fb669cc6-mz72t -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.svc.cluster.local
      搜索不到httpbin.ns-not-in-mesh.svc.cluster.local,说明Sidecar配置信息中心没有保存ns-not-in-mesh命名空间中的服务信息。
  2. 查看控制平面日志。
    1. 启用控制平面日志采集。具体操作,请参见启用控制平面日志采集和日志告警
    2. 执行以下命令,在ACK集群中删除Sleep应用。
      kubectl delete -f sleep.yaml -n ns-not-in-mesh
    3. 查看日志。
      1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理
      2. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
      3. 在网格详情页面,选择网格实例 > 基本信息
      4. 基本信息页面,单击控制面日志采集右侧的查看日志

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