Istio 对虚拟机支持史话


Istio 对虚拟机支持史话

文章插图
本文将为你介绍 Istio 历史上对虚拟机负载的支持情况 , 尤其是 Istio 1.8 中引入的智能 DNS 代理及使得虚拟机与容器在资源抽象层面可以等同视之 。我将为你展现一幅 Istio 支持虚拟机的波澜壮阔的奥德赛 。
本文也是我去年12 月 20 日在云原生社区北京站上的分享的话题内容之一 , 原文是英文版发布在上 , 本文是中文版 。
Istio 对虚拟机支持史话

文章插图
前言
在我之前的博客[1]中谈到 Istio 1.7 如何支持虚拟机 , 但那时虚拟机仍然无法无缝的集成到 Istio 中 , 因为还需要做很多手动的操作 。现在 , Istio 1.8 新增了及智能 DNS 代理[2] , 这使得如虚拟机这样的非工作负载可以在 Istio 中成为像 Pod 一样的一等公民 。
不论有没有为虚拟机安装  , 虚拟机通常情况下无法直接访问集群中的 DNS 服务器以解析服务的IP 的(虽然你也许可以通过一些黑客的手段做到) , 这是在 Istio 中集成虚拟的最后一块短板 , 终于在 Istio 1.8 中完成了突破 。
为什么要支持虚拟机?
在我们将应用在迁移到云原生架构 , 不断容器化的过程中 , 将经历三个阶段 , 如下图所示 。
Istio 对虚拟机支持史话

文章插图
云原生应用的三个阶段
?阶段一:应用全部部署在虚拟机上?阶段二:应用既部署在虚拟机上也部署在容器里 , 正在从虚拟机向容器中迁移 , 并使用管理容器?阶段三:所有的应用优先部署在容器里 , 使用管理容器 , 使用 Istio 管理应用间的通信
上图仅是对以上三个阶段的最简化描述 , 实际上还会有多混合云、多机房、多集群等情况 , 且阶段三只是个理想化的阶段 , 容器和虚拟机将是长期共存的 , 但是容器化趋势不变 。
在阶段二中 , 人们通常会将新业务和少量应用率先实现容器化 , 并部署到中 , 在应用尚未完全实现容器化的时候 , 处于过度状态时会遇到很多问题 , 如何让应用与部署在虚拟机中的服务交互?虚拟机如何访问容器中的服务?在服务迁移的过程中如何保证稳定无缝?是否可以将容器和虚拟机纳入一个统一的控制平面来管理?Istio 从开源初期就考虑并着手解决这一问题 。
Istio 支持虚拟机的历史
Istio 对于虚拟机的支持是个漫长的过程 , 堪称是一部奥德赛 。
Istio mesh 扩张
Istio 从 0.2 版本开始通过Istio Mesh [3]将虚拟机加入的 Mesh 中 , 但是需要满足以下前提条件:
?虚拟机必须可以通过 IP 地址直接访问到应用的 Pod , 这就要求容器与 VM 之间通过 VPC 或者 VPN 建立扁平网络 , 虚拟机不需要访问IP , 直接对服务的端点访问即可 。?虚拟机必须可以访问到 Istio 的控制平面服务(Pilot、Mixer、CA , 现在已正整合为 ) , 可以通过在 Istio Mesh 中部署负载均衡器将控制平面端点暴露给虚拟机 。?(可选)虚拟机可以访问到 Mesh 内部的(部署在中)的 DNS。
集成虚拟机的步骤如下:
1.为 Istio 控制平面服务及集群的 DNS 服务创建负载均衡器;2.生成 IstioCIDR、token、安全证书、Istio 控制平面服务的 IP(通过负载均衡器暴露出来的 IP)的配置文件并发送给虚拟机;3.(可选)在虚拟机中安装、配置并启动 Istio 的组件、(用于 DNS 发现) , 此时虚拟机可以使用 FQDN 访问 mesh 中的服务了 , 这一步是为了保证虚拟机可以正确解析出 mesh 中服务的IP;4.若要在虚拟机中运行服务 , 需要配置  , 新增需要拦截的端口 , 然后重启 istio , 还需要运行为服务注册