Istio 对虚拟机支持史话( 二 )


Istio 对虚拟机支持史话

文章插图
下图展示的从集成虚拟机到在 mesh 中访问虚拟机中服务的详细流程 。
Istio 对虚拟机支持史话

文章插图
图一:从集成虚拟机到在 mesh 中访问虚拟机中服务的详细流程
1.DNS 被虚拟机中部署的劫持 , 这使得它可以正确的获取 Istio 服务、 内置 DNS 的端点 IP;2.访问的内置 DNS 服务(该服务已通过负载均衡器暴露到集群外 , 可以直接访问);3.返回..svc..local被解析出来的IP , 注意该 IP 地址无法直接访问 , 但是如果无法被 DNS 解析的话将导致 VM 对该服务的请求失败;4.虚拟机对 mesh 中服务的访问被proxy 劫持;5.因为 proxy 已连接 Istio 控制平面 , 可通过 xDS 查询到该服务的端点 , 因此流量将被转发到其中的一个端点 。关于这一步的详细过程请参考Istio中的流量路由机制分析 一节[4];6.要想在 mesh 中访问 VM 中的服务 , 需要使用 命令手动将 VM 中的服务添加到 mesh 中 , 这本质上是将 VM 中的服务 , 注册到中的和 ;7.mesh 中的服务可以使用 VM 注册的服务名称(FQDN , 例如mysql.vm.svc..local)来访问;
以上 Istio 对虚拟机支持的方式一直延续到 Istio 1.0 , 在 Istio 1.1 的时候引入了新的 [5] , 使用它可以在 Istio 的内部服务注册表中添加额外的条目 , 这样 mesh 中的服务就可以访问 / 路由到这些手动指定的服务了 , 不再需要运行 命令 , 而且该命令在 Istio 1.9 中将被废弃 。
Istio 1.5 中增加了add-to-mesh命令 , 可以将虚拟机中的服务添加到 mesh 中 , 其功能与 一样 。
新增资源抽象
Istio 从1.6 版本[6]开始在流量管理[7]中引入了新的资源类型[8] , 用以将虚拟机进行抽象 , 使得虚拟机在加入 mesh 后可以作为与中的 Pod 等同的负载 , 具备流量管理、安全管理、可视化等能力 。通过可以简化虚拟机的网格化配置过程 。对象可以根据服务条目中指定的标签选择器选择多个工作负载条目和pod 。
Istio 1.8 中增加了[9]的资源对象 , 它提供了一个规范 , 可以同时包括虚拟机和工作负载 , 旨在模仿现有的用于工作负载的注入和部署规范模型来引导 Istio 代理 。
下面是虚拟机与中负载的资源抽象层级对比 。
Istio 对虚拟机支持史话

文章插图
从上面的图表中我们可以看到 , 对于虚拟机工作负载是可以与中的负载一一对对应的 。
此时看似一切都比较完美了 , 但是直接将集群中的 DNS暴露出来会带来很大的安全风险[10] , 因此我们一般手动将虚拟机需要访问的服务的域名和IP 对写到本机的/etc/hosts中 , 但是对于一个节点数量庞大的分布式集群来说 , 这种做法又有些不现实 。
通过配置虚拟机本地/etc/hosts访问 mesh 内服务的流程 , 如下图所示 。
Istio 对虚拟机支持史话

文章插图
图二:通过配置虚拟机本地 /etc/hosts 访问 mesh 内服务的流程
1.将虚拟机中的服务注册到 mesh 中;2.将要访问的服务的域名、 IP 对手动写入虚拟机本地的/etc/hosts文件中;3.虚拟机获得访问服务的IP;4.流量被proxy 拦截并解析出要访问的服务的端点地址;5.访问服务的指定端点;
在中我们一般使用对象来实现服务的注册和发现 , 每个服务都有一个独立的 DNS 名称 , 应用程序可以使用服务名称来互相调用 。我们可以使用将虚拟机中的服务注册到 Istio 的服务注册表中 , 但是在集群中的 DNS无法对 mesh 外部暴露的情况下 , 虚拟机无法访问集群中的 DNS 服务以获取服务的IP , 从而导致虚拟机访问 mesh 中的服务失败 。如果能在虚拟机中增加一个可以透明地拦截 DNS 请求 , 可获取 mesh 内所有服务的  , 类似于图一中的的角色 , 这样不就可以解决问题了吗?