您可以通过服务发现范围配置功能保证ASM控制平面只发现和处理指定命名空间下的应用,提升控制平面推送到数据平面Sidecar的效率。本文介绍如何使用服务发现范围配置提升控制平面推送效率。
背景信息
默认情况下,数据平面的Sidecar中保存数据平面集群中任意命名空间内所有服务的相关信息(即使该命名空间内的工作负载并未注入Sidecar),同时,控制平面也会监视网格中来自所有命名空间内的服务,任何与服务相关的变更都会引起控制平面向所有Sidecar推送相关配置。
您可以使用服务发现范围配置功能,根据数据平面集群内命名空间的标签来制定若干标签选择器。标签选择器保证ASM控制平面只需要发现和处理指定命名空间下的应用服务。Sidecar配置内将仅保留被选中命名空间内的服务信息,未被选中的命名空间内的服务发生改变,将不会引起Sidecar的配置推送。
服务发现范围配置功能的标签选择器支持以下两种规则:
- 标签精确匹配规则:您需要指定一个标签名和一个标签值,只有命名空间上的标签完全匹配给定的标签名和标签值才能够匹配成功。
- 标签表达式匹配规则:您可以指定一个标签名、一个表达式操作符、以及一系列标签值来匹配数据平面中的命名空间标签,操作符含义如下:
- In:数据平面命名空间的标签必须包含给定标签名的标签,且其标签值必须位于给定的一系列标签值中。
- NotIn:数据平面命名空间的标签必须包含给定标签名的标签,且其标签值必须不在给定的一系列标签值中。
- Exists:数据平面命名空间的标签必须包含给定标签名的标签,在操作符为Exists时,无需给出任何标签值。
- DoesNotExist:数据平面命名空间的标签必须不能包含给定标签名的标签,在操作符为DoesNotExist时,无需给出任何标签值。
步骤一:在ASM中创建两个命名空间
- 登录ASM控制台,在左侧导航栏,选择。
- 在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择。
- 在全局命名空间页面,单击新建。
- 在新建命名空间面板,设置命名空间的名称(本文设置为ns-in-mesh),然后单击确定。
- 重复上述步骤,创建名为ns-not-in-mesh的命名空间。
- 为ns-in-mesh命名空间启用自动注入。
- 在全局命名空间页面的自动注入列,单击ns-in-mesh命名空间对应的启用 Sidecar 自动注入。
- 在确认对话框,单击确定。
步骤二:在ACK集群中部署示例应用
- 执行以下命令,在ACK集群中为ns-in-mesh命名空间添加
asm-discovery=enabled
标签。kubectl label namespace ns-in-mesh asm-discovery=enabled
- 使用以下内容,创建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
- 在两个命名空间中创建httpbin示例应用。
步骤三:查看Sidecar配置的推送状态
- 查看Sidecar配置。
- 执行以下命令,下载Sidecar配置。
kubectl exec -it httpbin-74fb669cc6-m**** -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.json
- 打开下载到本地的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命名空间中的服务信息。
- 查看控制平面日志。
- 启用控制平面日志采集。具体操作,请参见启用控制平面日志采集和日志告警。
- 在ACK集群中部署Sleep应用。
- 使用以下内容,创建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
---
- 执行以下命令,在ns-not-in-mesh命名空间部署应用。
kubectl apply -f sleep.yaml -n ns-not-in-mesh
- 查看日志。
- 登录ASM控制台,在左侧导航栏,选择。
- 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在网格详情页面,选择。
- 在基本信息页面,单击控制面日志采集右侧的查看日志。
在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的配置推送。
您可以通过选择命名空间或编辑标签选择器两种方式来进行服务发现范围配置。
方式一:通过命名空间配置服务发现范围
- 登录ASM控制台,在左侧导航栏,选择。
- 在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择。
- 在服务发现范围配置页面,网格服务发现模式选择对选中命名空间进行服务发现。
- 在选择命名空间页签,选择目标集群,在下方列表中的ns-in-mesh命名空间右侧,单击选中,然后在页面下方,单击确定。
- 查看命名空间配置是否成功。
- 在网格详情页面左侧导航栏,选择。
- 在基本信息页面,查看网格的状态。
状态显示为运行中,表示命名空间配置成功。
方式二:通过标签选择器配置服务发现范围
- 登录ASM控制台,在左侧导航栏,选择。
- 在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择。
- 在服务发现范围配置页面,网格服务发现模式选择对选中命名空间进行服务发现,然后单击编辑标签选择器页签。
- 单击添加标签选择器,在新增的标签选择器中,单击添加标签表达式匹配规则,配置标签名为asm-discovery,标签值为Exists,然后在页面下方,单击确定。
- 查看标签选择器配置是否成功。
- 在网格详情页面左侧导航栏,选择。
- 在基本信息页面,查看网格的状态。
状态显示为运行中,表示标签选择器配置成功。
步骤五:验证使用服务发现范围配置功能是否成功
- 查看Sidecar配置。
- 执行以下命令,下载Sidecar配置。
kubectl exec -it httpbin-74fb669cc6-mz72t -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.json
- 打开下载到本地的config_dump.json文件,搜索
httpbin.ns-not-in-mesh.svc.cluster.local
。搜索不到httpbin.ns-not-in-mesh.svc.cluster.local
,说明Sidecar配置信息中心没有保存ns-not-in-mesh命名空间中的服务信息。
- 查看控制平面日志。
- 启用控制平面日志采集。具体操作,请参见启用控制平面日志采集和日志告警。
- 执行以下命令,在ACK集群中删除Sleep应用。
kubectl delete -f sleep.yaml -n ns-not-in-mesh
- 查看日志。
- 登录ASM控制台,在左侧导航栏,选择。
- 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在网格详情页面,选择。
- 在基本信息页面,单击控制面日志采集右侧的查看日志。
在Project页面右上角,设置时间为15分钟,缩小日志查看范围。此时无法查看到关于删除应用的日志。说明在服务发现之外的命名空间发生变更,并不会引起控制平面向Sidecar推送配置信息。