Kubernetes 为什么离不开Istio

228 阅读4分钟

Istio 是最流行的服务网格实现,是在 Kubernetes 之上开发的,在云原生应用生态系统中有不同的定位。本文不是直接介绍Istio的功能,而是解释Istio是如何产生的以及与Kubernetes的关系是什么。

image.png

image.png

为什么会有 Istio?

为了解释 Istio 是什么,了解 Istio 诞生的背景也很重要——即,为什么会有 Istio?

微服务是组织问题的技术解决方案。Kubernetes/Istio 是解决迁移到微服务所带来的问题的技术解决方案。作为微服务的可交付成果,容器解决了环境一致性问题,并允许更细粒度地限制应用程序资源。它们被广泛用作微服务的载体。

谷歌于 2014 年开源了 Kubernetes,并在接下来的几年里呈指数级增长。它成为解决分布式应用程序的部署和调度问题的容器调度工具——允许您将多台计算机视为一台计算机。由于单机资源有限,且互联网应用可能在不同时间出现流量泛滥(由于用户规模快速扩张或用户属性不同),因此计算资源的弹性需要较高。单台机器显然无法满足大规模应用的需求;反之,一个规模很小的应用程序占用整个主机将是一种巨大的浪费。

简而言之,Kubernetes 定义了服务的最终状态,并使系统能够自动达到并保持在该状态。那么,在部署应用程序后,如何管理服务上的流量呢?下面我们将看看 Kubernetes 中的服务管理是如何完成的,以及它在 Istio 中发生了怎样的变化。

如何在 Kubernetes 中进行服务管理?

下图展示了 Kubernetes 中的服务模型:

从上图我们可以看出:

  • 同一服务的不同实例可以被调度到不同的节点。
  • Kubernetes 通过 Service 对象组合一个服务的多个实例,以统一外部服务。
  • Kubernetes 在每个节点安装一个 kube-proxy 组件来转发流量,具有简单的负载均衡功能。
  • 来自 Kubernetes 集群外部的流量可以通过 Ingress 进入集群(Kubernetes 还有其他几种暴露服务的方式;例如 NodePort、LoadBalancer 等)。

Kubernetes 被用作密集资源管理的工具。然而,Kubernetes给应用程序分配资源后,并没有完全解决如何保证应用程序的健壮性和冗余性、如何实现更细粒度的流量划分(不根据服务的实例数量)等问题,如何保证服务的安全,或者如何管理多个集群等。

Istio 的基础知识

下图展示了 Istio 中的服务模型,它同时支持 Kubernetes 中的工作负载和虚拟机。

从图中我们可以看出:

  • Istiod 充当控制平面,将配置分发给所有 sidecar 代理和网关。(注:为了简单起见,图中没有画出 Istiod 和 Sidecar 之间的连接。)
  • Istio 支持从应用程序层到集群中其他支持网格的服务的智能应用程序感知负载平衡,并绕过基本的 kube-proxy 负载平衡。
  • 应用程序管理员可以通过声明性 API 来操纵Istio 服务网格中的流量行为,就像管理 Kubernetes 中的工作负载一样。它可以在几秒钟内生效,并且无需重新部署即可完成此操作。
  • Ingress 被 Gateway 资源取代,Gateway 资源是一种特殊的代理,也是重用的 Sidecar 代理。
  • 可以在虚拟机中安装 sidecar 代理,将虚拟机带入 Istio 网格。

事实上,在 Istio 之前,人们可以通过将 SDK 集成到应用程序中,使用 SpringCloud、Netflix OSS 和其他工具以编程方式管理应用程序中的流量。Istio 使流量管理对应用程序透明,将此功能从应用程序中移出并作为云原生基础设施移入平台层。

Istio 通过增强云原生应用程序的流量管理、可观察性和安全性来补充 Kubernetes。服务网格开源项目由 Google、IBM 和 Lyft 于 2017 年启动,三年来取得了长足的进步。Istio 核心功能的描述可以在Istio 文档中找到。

总结

  • Service Mesh 是 TCP/IP 的云原生版本,可解决应用程序网络通信、安全性和可见性问题。
  • Istio 是目前最流行的服务网格实现,它依赖 Kubernetes,但也可扩展至虚拟机负载。
  • Istio 的核心由控制平面和数据平面组成,Envoy 作为默认的数据平面代理。
  • Istio 充当云原生基础设施的网络层,对应用程序是透明的。