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

前提条件

背景信息

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

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

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

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

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏选择网格实例 > 全局命名空间,然后在右侧页面单击新建
  5. 新建命名空间面板设置命名空间名称,本文设置为ns-in-mesh,然后单击确定
  6. 重复步骤5,创建名为ns-not-in-mesh的命名空间。
  7. 为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-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,说明即使ns-not-in-mesh命名空间没有启用Sidecar自动注入,Sidecar配置信息中心仍然保存着ns-not-in-mesh命名空间中的服务信息。
  2. 查看控制平面日志。
    1. 启用控制平面日志采集。具体操作,请参见启用控制平面日志采集和日志告警
    2. 在ACK集群中部署Sleep应用。
      1. 使用以下内容,创建名为sleep.yaml的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. 在网格详情页面选择网格实例 > 基本信息
      5. 基本信息页面单击控制面日志采集右侧的查看日志
        在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-zf4wg.ns-in-mesh resources:20 size:12.9kB
        2021-12-03T09:18:20.041499Z    info    ads    EDS: PUSH for node:httpbin-74fb669cc6-zf4wg.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-zf4wg.ns-in-mesh resources:16 size:80.8kB
        2021-12-03T09:18:20.042472Z    info    ads    RDS: PUSH for node:httpbin-74fb669cc6-zf4wg.ns-in-mesh resources:7 size:5.3kB
        2021-12-03T09:18:20.049506Z    info    ads    EDS: PUSH request for node:httpbin-74fb669cc6-zf4wg.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-zf4wg.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-zf4wg.ns-in-mesh resources:20 size:12.9kB
        2021-12-03T09:18:28.362238Z    info    ads    EDS: PUSH for node:httpbin-74fb669cc6-zf4wg.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-zf4wg.ns-in-mesh resources:16 size:80.8kB
        2021-12-03T09:18:28.363128Z    info    ads    RDS: PUSH for node:httpbin-74fb669cc6-zf4wg.ns-in-mesh resources:8 size:6.4kB

步骤四:在ASM中配置选择性服务发现

以下以设置标签精确匹配规则为例,使ASM控制平面将只推送配置至带有asm-discovery标签的命名空间下的应用,其他命名空间下的应用将不会引起Sidecar的配置推送。

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏选择配置推送优化 > 选择性服务发现
  5. 选择性服务发现页面单击添加标签选择器,单击添加标签表达式匹配规则,设置标签名为asm-discovery,操作符为Exists,然后单击确定
    此时,在基本信息页面网格状态显示更新中,待网格状态变更为运行中,说明标签选择器配置成功。

步骤五:验证使用选择性服务发现功能是否成功

  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. 在网格详情页面选择网格实例 > 基本信息
      5. 基本信息页面单击控制面日志采集右侧的查看日志

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