一、 K8s、Istio与虚拟机
云计算和容器技术开启全新的系统架构和思维方式演进,k8s(Kubernetes)已经是当前容器编排领域实质上的王者。K8s管理一个高度可用的计算机(Linux系统)集群,所有的应用以容器的方式运行在k8s内部并被管理。对于一些老旧的应用来说,不进行架构层次的重构与改变,很难直接被k8s管理。
随着微服务体系的发展,逐渐出现了服务网格(Service Mesh)的概念,它提供了一种透明的、与编程语言无关的方式,使网络配置、安全配置以及遥测等操作能够灵活而简便地实现自动化。Istio作为服务网格中的后起之秀,在市场和社区方面表现非常火爆。
Istio 1.7 版本其中一项备受期待的扩展便是专注于将服务网格扩展到基于虚拟机的云环境。Istio 1.8 版本新增了 ServiceEntry 及 智能 DNS 代理,使得如虚拟机这样的非 Kubernetes 工作负载可以在 Istio 中成为像 Pod 一样的资源进行管理。
下文所使用的的istio版本为v1.8,且以了解k8s与istio为基础进行阐述。
istio与虚拟机的安装教程参见官方的单个网络网格中的虚拟机与虚拟机安装。
二、 Istio对接虚拟机基本原理
Istio能够支持虚拟机上的服务,主要基于以下几点k8s和istio自身的特性:
1. K8s pod支持多个容器
正常情况下,一个微服务(Deployment)可以具备多个实例(Pod),每个实例里运行一个容器(Docker Container),该容器即为业务应用程序。
原生的k8s pod,支持运行多个容器。同一个pod内的所有容器,共享同一个网络,也可以通过配置使得多个容器共享同一块磁盘目录(可持久化也可临时内部目录)。
2. Istio流量管理
Istio支持自动与手动配置两种方式来为实例注入边车(Sidecar)容器,即在实例中再添加一个容器,这个名为istio-proxy
的容器是基于Envoy的代理容器,istio能够实现流量管理幕后主要运行的实体便是该代理容器。
实际上istio为每个实例又多注入了一个初始化容器(initContainer),初始化容器通过istio-iptabl