为远程集群配置 istioctl

2022-05-30

518

使用代理服务器在具有外部控制平面的网格中支持 istioctl 命令。


在使用 istioctlCLI 时远程集群对于外部控制平面或多集群 Istio 部署,默认情况下某些命令将不起作用。例如,需要访问服务以检索其管理的代理的状态和配置。如果您尝试在远程集群上运行它,您将收到如下错误消息:istioctl proxy-statusistiod



请注意,错误消息不仅说它无法访问该 istiod 服务,它还特别提到了它无法找到 istiod 实例。这是因为istioctl proxy-status实现需要检索的不仅仅是任何单个 istiod 实例的同步状态,而是所有实例的同步状态。当有多个 istiod 实例(副本)运行时,每个实例仅连接到网格中运行的服务代理的一个子集。该 istioctl 命令需要返回整个网格的状态,而不仅仅是由其中一个实例管理的子集。


在 istiod 服务在集群本地运行的普通 Istio 安装中(即,主集群),该命令的实现方式是简单地找到所有正在运行的 Pod,依次调用每个 Pod,然后在返回给用户之前汇总结果。



另一方面,当使用远程集群时,这是不可能的,因为 istiod 实例在网格集群之外运行,并且网格用户无法访问。这些实例甚至可能不会使用 Kubernetes 集群上的 Pod 进行部署。


幸运的是,istioctl 提供了一个配置选项来解决这个问题。您可以使用将有权访问实例 istioctl 的外部代理服务的地址进行 配置。istiod 与将传入请求委托给其中一个实例的普通负载均衡器服务不同,此代理服务必须委托给所有 istiod 实例,聚合响应,然后返回组合结果。


如果外部代理服务实际上是在另一个 Kubernetes 集群上运行,那么代理实现代码可以与 istioctl 在主集群情况下运行的实现代码非常相似,即找到所有正在运行的 istiodPod,依次调用每个 Pod ,然后聚合结果。



istioctl 可以在 此处找到包含此类代理服务器实现的 Istio 生态系统项目。要试用它,您需要两个集群,其中一个使用安装在另一个集群中的控制平面配置为远程集群。


使用远程集群拓扑安装 Istio


为了演示istioctl在远程集群上的工作,我们将首先使用 外部控制平面安装说明 来设置单个远程集群网格,外部控制平面在单独的外部集群中运行。


完成安装后,我们应该有两个环境变量CTX_REMOTE_CLUSTER和CTX_EXTERNAL_CLUSTER,分别包含远程(网格)和外部(控制平面)集群的上下文名称。


我们还应该让 helloworld 和 sleep 样本在网格中运行,即在远程集群上:



请注意,如果您尝试istioctl proxy-status在远程集群中运行,您将看到前面描述的错误消息:



配置 istioctl 以使用示例代理服务


要进行配置,我们首先需要在正在运行的Podistioctl旁边部署代理服务。istiod在我们的安装中,我们已经在external-istiod命名空间中部署了控制平面,因此我们使用以下命令在外部集群上启动代理服务:



您可以运行以下命令来确认istioctl-proxy服务正在旁边运行istiod:



代理服务是在端口 9090 上提供服务的 gRPC 服务器:



然而,在我们使用它之前,我们需要将它暴露在外部集群之外。有很多方法可以做到这一点,具体取决于部署环境。在我们的设置中,我们有一个在外部集群上运行的入口网关,因此我们可以更新它以公开端口 9090,更新关联的虚拟服务以将端口 9090 请求定向到代理服务,然后配置istioctl为使用网关地址代理服务。这将是一个“正确”的方法。


然而,由于这只是一个简单的演示,我们可以访问两个集群,我们将简单地port-forward 代理服务localhost:



我们现在通过设置环境变量来配置istioctl用于localhost:9090访问代理:ISTIOCTL_XDS_ADDRESS


因为我们的控制平面是在external-istiod命名空间中运行的,而不是默认的istio-system,我们还需要设置ISTIOCTL_ISTIONAMESPACE环境变量。


设置ISTIOCTL_PREFER_EXPERIMENTAL是可选的。它指示将调用istioctl重定向istioctl command到实验等价物 ,istioctl x command对于任何command同时具有稳定和实验性实现的人。在我们的例子中,我们需要使用istioctl x proxy-status实现代理委托功能的版本。


运行 istioctl proxy-status 命令


现在我们已经完成了配置 istioctl,可以通过再次运行proxy-status命令来尝试一下:



如您所见,这一次它正确显示了网格中运行的所有服务的同步状态。请注意,该 ISTIOD 列返回通用值,而不是pod 在本地运行时将显示的实例名称(例如)。istiod-666fb6694d-jklkt在这种情况下,网格用户无法获得或不需要此详细信息。它仅在外部集群上可供网格操作员查看。


总结


在本文中,我们使用示例代理服务器进行配置istioctl以与外部控制平面安装一起使用。我们已经看到了一些istioctlCLI 命令在由外部控制平面管理的远程集群上是如何开箱即用的。诸如 等命令istioctl proxy-status需要访问istiod管理网格的服务实例,当控制平面在网格集群之外运行时,这些服务实例不可用。为了解决这个问题,istioctl被配置为委托代理服务器,与外部控制平面一起运行,istiod代表它访问实例。


基于 Istio 及容器技术,SolarMesh 提供流量监控和管理,提供完善的非侵入式服务治理解决方案,帮助企业在纷繁复杂的微服务调度中快速定位问题,增强研发效率。

SolarMesh 在线体验



原文出处:https://istio.io/latest/blog/2022/istioctl-proxy/



技术交流
我们建立了多个云原生技术交流群,其中有来自Oracle、Citrix、华为、腾讯等国内外云计算专家,立即扫码,拉你进群。目前已有2000+开发者加入我们......
云原生厂商 云原生技术服务商
在云原生时代,行云创新致力于通过赋能开发者,实现企业快速迭代与交付,大幅提升创新效率。
产品下载