使用 DiscoverySelectors
一个工作负载被包含在 Service Mesh 中需满足以下两个条件:
- 它已被控制平面发现。
- 已向其注入了 Envoy 代理 sidecar。
默认情况下,控制平面会扫描集群中每个命名空间的工作负载。此默认行为导致两个结果:
- 每个代理实例都会为所有命名空间配置,即使是未加入网格的工作负载也会被配置。
- 只要 Pod 或命名空间上带有正确的注入标签,代理 sidecar 就会被注入到任何工作负载中。
理解 discovery selectors
Discovery selectors 允许 mesh 管理员管理控制平面可以监控的命名空间。管理员使用 Kubernetes 标签选择器定义应对控制平面可见的命名空间的条件,从而有效隐藏不符合条件的命名空间。
Istiod 始终会对所有命名空间打开 Kubernetes 的 watch。不过,discovery selectors 会在处理的早期阶段忽略未被选择的对象,从而最大限度地降低开销。
discoverySelectors 字段接受一个 Kubernetes 选择器数组,这些选择器应用于命名空间标签。每个选择器可以针对不同场景进行配置:
- 自定义标签名称和值。 例如,为所有相关命名空间配置
istio-discovery=enabled标签。 - 多个命名空间标签列表。 可以使用基于集合的选择器(set-based selectors)实现 OR 逻辑。例如,配置具有
istio-discovery=enabled或region=us-east1标签的命名空间。 - 包含和排除命名空间。 例如,配置同时拥有
istio-discovery=enabled和app=helloworld标签的命名空间。
需要注意的是,discovery selectors 并不构成安全边界。即使配置了 discoverySelector 字段,Istiod 仍然可以访问所有命名空间。
如何使用 Discovery Selectors 限定 Service Mesh 范围
当确定了要包含在 Service Mesh 中的命名空间后,可以在安装期间或安装后配置 discoverySelectors。方法是在 Istio 资源的 meshConfig.discoverySelectors 字段中添加所需的选择器。例如,可以配置 Istio 仅发现带有 istio-discovery=enabled 标签的命名空间。
前提条件
- 已安装 Alauda Service Mesh v2 Operator。
- 已部署 Istio CNI。
- 已部署 Istio 控制平面。
操作步骤
-
为运行 Istio 控制平面的命名空间(如
istio-system命名空间)添加标签。 -
通过添加使用相同标签的
discoverySelectors部分,更新Istio控制平面资源。 -
确认所有计划承载 Service Mesh 工作负载的命名空间均已标记了
discoverySelector标签,并在需要时添加了相应的 Istio 注入标签。
参考
- Use discovery selectors to configure namespaces for your Istio service mesh (Istio 文档)
- Label selectors (Kubernetes 文档)
- Resources that support set-based requirements (Kubernetes 文档)