ubernetes是一用于管理容器化工作负载和服务的可移植、可扩展的开源平台,拥有庞大快速发展的生态系统,它面向基础设施将计算、网络、存储等资源进行紧密整合,为容器提供最佳运行环境,并面向应用提供封装好的、易用的工作负载与服务编排接口,以及运维所需的资源规格、弹性、运行参数、调度等配置管理接口,是新一代的云原生基础设施平台。


从平台架构而言,Kubernetes的设计围绕平台化理念,强调插件化设计与易扩展性,这是与其他同类系统最大区别之一,保障了对各种不同客户应用场景的普遍适应性。另外,Kubernetes与其他容器编排系统的显著区别是Kubernetes并不把无状态化、微服务化等条件作为其上可运行的工作负载的约束。


如今,容器技术已经进入产业落地期,而Kubernetes作为容器平台的标准已经得到了广泛应用。Kubernetes20146月由Google宣布开源,到20157月发布1.0这个正式版本并进入CNCF基金会,再到20183月从CNCF基金会正式毕业迅速成为容器编排领域的标准,是开源历史上发展最快的项目之一,如图1-12所示

Kubernetes 与好基友 Istio_java

图1-12 Kubernetes的发展历史

IstioKubernetes的好帮手

从场景来看,Kubernetes已经提供了非常强大的应用负载的部署、升级、扩容等运行管理能力。Kubernetes中的Service机制也已经可以做服务注册、服务发现和负载均衡,支持通过服务名访问到服务实例。


从微服务的工具集观点来看,Kubernetes本身是支持微服务的架构,在Pod中部署微服务很合适,也已经解决了微服务的互访互通问题,但服务间访问的管理如服务的熔断、限流、动态路由、调用链追踪等不在Kubernetes的能力范围内。那么,如何提供一套从底层的负载部署运行到上层的服务访问治理端到端的解决方案目前,最完美的答案就是在Kubernetes上叠加Istio这个好帮手,如图1-13所示

Kubernetes 与好基友 Istio_java_02 

图1-13 在Kubernetes上叠加Istio这个好帮手

Kubernetes的Service基于每节点的Kube-proxy从Kube-apiserver获取Service和Endpoint的信息,并将对Service的请求经过负载均衡转发到对应的 Endpoint 上。但Kubernetes只提供了4层负载均衡能力,无法基于应用层的信息进行负载均衡,更不会提供应用层的流量管理在服务运行管理上也只提供了基本的探针机制,并不提供服务访问指标和调用链追踪这种应用的服务运行诊断能力。


Istio复用了Kubernetes Service的定义,在实现上进行了更细粒度的控制。Istio的服务发现就是从Kube-apiserver中获取ServiceEndpoint然后将其转换成Istio服务模型的ServiceServiceInstance但是数据面组件不再是Kube-proxy,而是在每个Pod里部署的Sidecar,也可以将其看作每个服务实例的Proxy。这样,Proxy的粒度更细了,和服务实例的联系更紧密了,可以做更多更细粒度的服务治理,如图1-14所示。通过拦截Pod的Inbound流量和Outbound流量,在Sidecar上解析各种应用层协议,Istio可以提供真正的应用层治理、监控和安全等能力。


总之,Istio和Kubernetes从设计理念、使用体验、系统架构甚至代码风格等小细节来看,关系都非常紧密,甚至有人认为Istio就是Kubernetes团队开发的Kubernetes可插拔的增强特性

 

图1-14 更细粒度的Proxy提供更多更细粒度的能力

KubernetesIstio的好基座

Istio最大化地利用了Kubernetes这个基础设施,与之叠加在一起形成了一个更强大的用于进行服务运行和治理的基础设施,并提供了更透明的用户体验。


1.数据面

数据面Sidecar运行在KubernetesPod里,作为一个Proxy和业务容器部署在一起。在服务网格的定义中要求应用程序在运行的时候感知不到Sidecar的存在。而基于Kubernetes的一个Pod多个容器的优秀设计使得部署运维对用户透明,用户甚至感知不到部署Sidecar的过程。用户还是用原有的方式创建负载,通过Istio的自动注入服务,可以自动给指定的负载注入Proxy。如果在另一种环境部署和使用Proxy,则不会有这样的便利。


2.统一服务发现

Istio的服务发现机制非常完美地基于Kubernetes的域名访问机制构建而成,省去了再搭一个类似Eureka的注册中心的麻烦避免了在Kubernetes上运行时服务发现数据不一致问题。


尽管Istio强调自己的可扩展性的重要性在于适配各种不同的平台,也可以对接其他服务发现机制,实际场景通过深入分析Istio几个版本的代码设计,便可以发现其重要的能力都是基于Kubernetes进行构建的


3.基于Kubernetes CRD描述规则

Istio的所有路由规则控制策略都是通过Kubernetes CRD实现的,因此各种规则策略对应的数据也存储在Kube-apiserver中,不需要另外一个单独的APIServer和后端的配置管理。所以可以说Istio的APIServer就是KubernetesAPIServer,数据也自然地被存在了对应Kubernetes的etcd中。


Istio非常巧妙地应用了Kubernetes这个基座,基于Kubernetes的已有能力构建自身功能。Kubernetes里已经有的,绝不再自己搞一套,避免了数据不一致和用户使用体验的问题


如图1-15所示为Istio和Kubernetes架构的关系,可以看出,Istio不仅数据面Envoy跑在KubernetesPod里,控制面也运行在Kubernetes集群中,其控制面组件本身存在形式也是Kubernetes Deployment和Service,基于Kubernetes扩展和构建

Kubernetes 与好基友 Istio_java_03

图1-15  IstioKubernetes架构的关系

如表1-2所示为Istio+Kubernetes的方案与将SDK开发的微服务部署在Kubernetes上的方案的比较。


表1-2  两种方案的比较

   

Istio服务部署在Kubernetes

SDK开发的服务部署在Kubernetes

架构设计

基于Kubernetes能力构建

Kubernetes无结合

服务发现

使用Kubernetes服务名,使用和Kubernetes一致的服务发现机制

两套服务发现,服务发现数据不一致的潜在问题KubernetesPod的正常迁移引起重新进行服务注册

使用体验

完全Kubernetes使用体验。Sidecar自动Pod注入,业务无感知,和部署普通Kubernetes负载无差别

Kubernetes结合,Kubernetes只是提供了运行环境

控 制 面

无须额外的APIServer和规则策略定义,基于KubernetesCRD扩展

需自安装和维护控制面来管理治理规则

总结

 

如图1-16所示为Istio、微服务、容器与Kubernetes的关系。

Kubernetes 与好基友 Istio_java_04 

图1-16  Istio、微服务、容器与Kubernetes的关系

Kubernetes在容器编排领域已经成为无可争辩的事实标准;微服务化的服务与容器在轻量、敏捷、快速部署运维等特征匹配,这类服务在容器中的运行也正日益流行;随着Istio的成熟和服务网格技术的流行,使用Istio进行服务治理的实践也越来越多,正成为服务治理的趋势;而IstioKubernetes的天然融合基于Kubernetes构建,补齐了Kubernetes的治理能力,提供了端到端的服务运行治理治理平台这都使得Istio、微服务、容器及Kubernetes形成一个完美的闭环。


云原生应用采用Kubernetes构建应用编排能力,采用Istio构建服务治理能力,将逐渐成为企业技术转型的标准配置。