本文永久链接: https://www.xtplayer.cn/istio/istio-discoveryselectors-filter-the-namespaces/

在 Istio 服务网格中,discoverySelectorsMeshConfig 里的一个配置字段。它的作用是限制 Istio 控制平面(Istiod)需要监控和发现哪些命名空间(Namespace)。忽略掉不必要的命名空间,从而优化性能。

核心价值

在大型 Kubernetes 集群中,如果所有命名空间都在服务网格内,Istiod 会监视和处理所有命名空间的 services, pods, and endpoints,这将消耗大量 CPU 和内存去处理所有服务的配置。为了解决这个问题,可通过 discoverySelectors 过滤不必要的命名空间,让 Istio 只关心你指定的命名空间,有效降低控制平面的负载。

配置方式

你可以在 IstioOperator 自定义资源中配置 meshConfig.discoverySelectors,使用标准的 Kubernetes 标签选择器。

示例 1:基于标签匹配

下面的配置告诉 Istiod,只发现带有 istio-discovery: enabled 标签的命名空间。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
discoverySelectors:
- matchLabels:
istio-discovery: enabled

然后,你需要手动为你希望纳入网格的命名空间打上这个标签:

kubectl label namespace your-namespace istio-discovery=enabled

如果是通过 chart 部署,在 value 中添加配置:

istiod:
meshConfig:
discoverySelectors:
- matchLabels:
istio-discovery: enabled

示例 2:基于表达式匹配

你也可以使用 matchExpressions 进行更复杂的逻辑判断。

meshConfig:
discoverySelectors:
- matchExpressions:
- key: environment
operator: In
values: ["production", "staging"] # 只有环境为 prod 或 staging 的命名空间会被发现

如果是通过 chart 部署,在 value 中添加配置:

istiod:
meshConfig:
discoverySelectors:
- matchExpressions:
- key: environment
operator: In
values: ["production", "staging"]

示例 3:基于表达式排除命名空间

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
# ...
spec:
meshConfig:
discoverySelectors:
- matchExpressions:
- key: kubernetes.io/metadata.name
operator: NotIn
values:
- kube-system
- cattle-neuvector-system # 直接排除 NeuVector 的命名空间
- matchLabels:
# 同时,必须包含网格自身的命名空间
kubernetes.io/metadata.name: istio-system

如果是通过 chart 部署,在 value 中添加配置:

istiod:
meshConfig:
discoverySelectors:
- matchExpressions:
- key: kubernetes.io/metadata.name
operator: NotIn
values:
- cattle-neuvector-system

注意事项

  • **需要包含 istio-system**:如果你在 istio-system 命名空间中存放了网关等核心配置,请务必也为它打上匹配的标签,否则这些配置会被忽略。
  • 动态生效:配置更改后,Istiod 会很快生效,不再匹配的命名空间会从服务注册表中被移除。

参考地址

https://istio.io/latest/zh/docs/reference/config/istio.mesh.v1alpha1/#MeshConfig-discovery_selectors

https://istio.io/latest/zh/docs/ops/configuration/mesh/configuration-scoping/