Istio 1.10 引人注目的新功能之一是发现选择器(Discovery Selector), 让你轻易掌控 Istio 控制平面对哪些命名空间进行监视以及发送配置更新。 默认情况下,Istio 控制平面会对集群中所有 Kubernetes 资源的更新进行监视和处理。 网格中的所有 Envoy 代理都采用特别的配置方式,让它们访问网格中的每个工作负载,并接受与这些工作负载相关的所有端口的流量。

举个例子,我们在不同的命名空间中部署了两个工作负载—— foo bar. 即使我们知道 foo永远无需bar 对话,而且反过来也一样,但一个服务的端点仍会包含在另一个服务的已发现端点之中。

Workloads in two namespaces
两个命名空间中的工作负载

这条视频将为你讲解什么是发现选择器,并演示如何使用它们:

如果运行 istioctl proxy-config,并列出 foo 命名空间中 foo 工作负载可见的的所有端点,你会注意到一个名为 bar 的服务的条目:

如果 Istio 持续向代理更新集群中每个服务的信息,即使它们毫不相干,你大概也能想象到这会大大减慢工作的速度。

如果这个问题听起来很熟悉,你可能知道它已经有解决方案——那就是 Sidecar 资源。

Sidecar 资源

Sidecar 资源 描述了 sidecar 代理的配置。 默认情况下,网格中的所有代理都具有到达网格中每个工作负载并接受所有端口上的流量所需的配置。

除了配置代理在转发流量时接受哪些端口/协议之外,我们还可以限制代理在转发出站流量时有权访问哪些服务。

值得注意的一点是,此处的限制仅为配置的设定。 它并不是安全边界——你仍然可以访问服务,只不过那些服务的配置不会传播到代理。

下面的示例foo 命名空间中的 sidecar 代理资源,它用于配置命名空间中的所有工作负载,使这些工作负载只能查看同一命名空间中以及 istio-system 命名空间中的工作负载。

如果重新运行 proxy-config 命令,并列出 foo服务可以看到的端点,你会注意到 bar服务不再显示在列表上。

发现选择器

你可以在 MeshConfig中的网格级别配置发现选择器. 发现选择器是一个 Kubernetes 选择器的列表,这些选择器在 Istio 将配置推送到 sidecar 时,负责指定 Istio 监视和更新哪些命名空间。

就像 Sidecar 资源一样,discoverySelectors可以用来限制 Istio 监视和处理的项目数量。

你可以更新 IstioOperator,使它包含 discoverySelectors字段,做法如下:

上面的示例将 env=test 设置为匹配标签。 这表示标有 env=test 的命名空间中的工作负载将包含在 Istio 监视和更新的命名空间列表中。

如果用 env=test 标签标记 foo 命名空间 然后列出端点,你会注意到现在配置中列出的端点并不多。 这是因为我们唯一标记的命名空间是 foo 命名空间,而它是 Istio 控制平面监视和发送更新的唯一命名空间。

$ istioctl proxy-config endpoints deploy/foo.foo
ENDPOINT                         STATUS      OUTLIER CHECK     CLUSTER
10.4.1.5:80                      HEALTHY     OK                outbound|80||foo.foo.svc.cluster.local
127.0.0.1:15000                  HEALTHY     OK                prometheus_stats
127.0.0.1:15020                  HEALTHY     OK                agent
unix://./etc/istio/proxy/SDS     HEALTHY     OK                sds-grpc
unix://./etc/istio/proxy/XDS     HEALTHY     OK                xds-grpc

如果我们也标记 bar 命名空间,然后重新运行 istioctl proxy-config 命令,你会注意到 bar 端点将显示为 foo 服务配置的一部分。

$ istioctl proxy-config endpoints deploy/foo.foo
ENDPOINT                         STATUS      OUTLIER CHECK     CLUSTER
10.4.1.5:80                      HEALTHY     OK                outbound|80||foo.foo.svc.cluster.local
10.4.4.4:80                      HEALTHY     OK                outbound|80||bar.bar.svc.cluster.local
127.0.0.1:15000                  HEALTHY     OK                prometheus_stats
127.0.0.1:15020                  HEALTHY     OK                agent
unix://./etc/istio/proxy/SDS     HEALTHY     OK                sds-grpc
unix://./etc/istio/proxy/XDS     HEALTHY     OK                xds-grpcd

发现选择器与 sidecar 资源有什么区别?

发现选择器和 sidecar 资源之间的主要区别之一,就是通过发现选择器你可以包含 Istio 控制平面将监视和响应的命名空间。

这里再说明一下。此时你应该已经注意到,当我们使用 discoverySelector 时,端点的数量会急剧减少。. 那是因为我们只包含了一个命名空间。 所以没有 kube-system 命名空间,也不会有其他系统或非系统命名空间。 如果没有 discoverySelectors所有命名空间都会自动包含在内,而 Istio 控制平面会监视它们,并将配置推送到所有工作负载。

discoverySelectors sidecar 资源都可以应用到全局。 不过, discoverySelector 通常由网格管理员配置,而产品团队或服务所有者会使用 sidecar 资源来配置他们自己的命名空间和工作负载。

你也可以将两者结合起来。 试着想象一下,网格管理员通过 discoverySelectors 配置监视哪些命​​名空间,然后服务所有者在全局、命名空间或工作负载级别创建 sidecar 资源来为配置进行微调。

资源