引言
谈到 Serverless,Kubernetes 是一个无法回避的话题。
在今天的课程中,我们将继续学习如何搭建私有 Serverless 环境。具体来说,我们将基于上一节课本地 K8s 部署的成果来构建 Serverless 基础设施。然后,我们会安装额外的组件来扩展 K8s 集群的能力,最终让本地 K8s 集群能够支持 Serverless。
构建 Serverless 的前提条件
在开始之前,我们先澄清一个在 Serverless 计算(特别是 FaaS)基础课程中提出的问题。有些同学问:“微服务、Service Mesh 和 Serverless 之间是什么关系?”
这些概念经常出现在讨论中,但不必有压力。我在刚开始学习 Serverless 时也被这些概念搞糊涂过。我们先回顾一下微服务。当使用微服务构建 BaaS 时,你可能已经注意到微服务中的许多概念与 Serverless 中的概念非常相似。
简单来说,Service Mesh 是一种微服务网络通信解决方案,它在微服务自身无感知的情况下运行。我们也可以将 Serverless 架构中的网络通信委托给 Service Mesh。通过 Service Mesh,Serverless 组件可以与 K8s 集群紧密协作,最终以 Serverless 的方式支持我们部署的应用程序。让我们来看下面的架构图:
从图中可以清晰地看到,Serverless 的底层基础设施可以构建在 Service Mesh 之上。不过,Service Mesh 只是实现 Serverless 网络通信的解决方案之一。还有其他选择,比如 RSocket、gRPC 和 Dubbo。我选择 Service Mesh 是因为这个方案可以基于 K8s 组件,并且提供可视化工具来帮助我们理解 Serverless 的运行机制,例如如何实现零启动时间以及控制流量进行灰度发布。如果你想动手实践,Service Mesh 无疑是不二之选。
Serverless 基础设施:Service Mesh
有些人将 Kubernetes、Service Mesh 和 Serverless 技术称为云原生应用开发的“三大支柱”。到现在,我想你已经明白其中的原因了。不过,我需要说明的是,在接下来的课程中,我们会介绍许多新术语。我已经给你提供了这些术语的总体概述,让你有一个大致的了解。如果你有时间,应该更深入地研究它们。
现在,让我们回到正题,更详细地了解 Service Mesh 的原理。
当我们讨论微服务时,只涉及了分解和集成的理论指导,没有触及具体实现。如果切换到底层实现,业界其实有很多微服务框架,但大多数都局限于特定语言的 SDK,特别是 Java 微服务框架。
SDK 形式的微服务框架通常侧重于微服务之间网络通信的实现,例如重试失败的服务请求、跨多个服务实例的负载均衡、以及在高服务请求量时限制流量。这些逻辑通常需要微服务开发者关注,并且需要在每种 SDK 语言中重复实现。那么,有没有可能将微服务的网络通信逻辑从 SDK 中抽离出来,让我们的微服务变得更轻量,甚至无需关心网络通信?
答案是 Service Mesh。
如果我们将分解后的应用程序部署到 K8s 集群的 Pod 中,过程如下图所示:MyApp 应用会通过 HTTP 直接调用集群内的用户微服务和待办任务微服务。
但是直接 HTTP 访问会带来安全问题怎么办?如果有人在我们的集群中启动了一个 BusyBox 容器,他们岂不是可以直接攻击我们的用户微服务和待办任务微服务?此外,当我们有多个用户微服务实例时,如何分配流量?
传统上,我们会使用微服务架构 SDK,其中包含大量这类逻辑以及许多策略,我们在调用 SDK 时需要决定何时激活这些策略。我们的代码也会与微服务架构 SDK 紧密耦合。
Service Mesh 则采用了不同的方法,它将网络通信逻辑从微服务中抽离出来,以非侵入的方式管理网络流量,这样我们就不再需要担心沉重的微服务 SDK。我们来看看 Service Mesh 是如何解决这个问题的。
Service Mesh 可以划分为数据平面和控制平面。数据平面负责管理网络通信,而控制平面则控制和监控网络通信的状态。Service Mesh 通过注入 Sidecar 来拦截所有网络流量。
在数据平面中,我们的应用和微服务似乎直接与 Sidecar 通信,但实际上,Sidecar 可以通过流量劫持来实现这一点。因此,我们的应用和微服务通常对此无感知,不需要做任何修改,只需使用 HTTP 请求来传输数据。
控制平面则更为复杂,它是 Service Mesh 运行的核心。Pilot 是整个控制平面的驱动者,负责服务发现、流量管理和扩缩容。Citadel 是控制平面的守护堡垒,负责安全证书和认证。Mixer 是通信官,分发控制平面的策略并收集每个服务的运行状态。
现在你应该清楚地理解了什么是 Service Mesh,它是如何将微服务网络通信逻辑从 SDK 中抽离出来的,以及为什么我们说 Service Mesh 是 Serverless 的网络通信基础。
Serverless 与容器引擎的关系
Serverless 的核心价值在于无需管理服务器,从而可以专注于业务逻辑。容器技术为 Serverless 提供了强大的基础设施和灵活的调度能力,特别是与 Kubernetes 等编排工具结合时。
容器具有轻量级打包、资源隔离和快速启动等优势。容器将应用程序及其依赖打包在一起,确保运行时环境的一致性,这有助于在 Serverless 平台上快速部署和启动应用实例。此外,容器提供了隔离的运行时环境,确保不同应用程序之间互不干扰,从而提高平台的整体稳定性。而且,容器的启动速度比虚拟机更快,满足了 Serverless 应用对弹性伸缩的高要求。
作为 Serverless 调度的核心,Kubernetes 具有自动化部署、弹性伸缩和服务发现等功能。它可以根据预设规则自动部署容器化应用,无需人工干预;根据实时负载调整应用实例数量,在保证性能的同时优化资源利用;并提供服务发现机制,方便 Serverless 平台内各组件之间的通信。
要构建基于容器的 Serverless 平台,首先需要将应用程序及其依赖打包成容器镜像,确保应用能够在平台上快速部署和运行。然后,选择合适的云平台或搭建自托管的 Kubernetes 集群作为 Serverless 平台的基础设施。接着,开发 Serverless 平台组件,包括用于接收和路由外部请求的 API 网关、用于加载和运行函数代码并管理函数生命周期的函数运行时,以及监听各种事件源并将事件转化为函数调用的事件触发器。最后,使用 Kubernetes 的 Deployment 来管理应用实例的部署和更新,使用 Service 进行服务发现和负载均衡,使用 HPA 实现自动弹性伸缩。
基于容器的 Serverless 平台具有灵活性高、可定制性强和成本效益高等特点。开发者可以自由选择底层的容器技术和 Kubernetes 平台,根据需求自定义 Serverless 平台的功能和特性,并利用 Kubernetes 的资源调度能力优化资源利用率,降低成本。
容器技术与 Kubernetes 的结合为构建高效、灵活且可扩展的 Serverless 平台提供了强大的工具和方法,使开发者能够轻松构建自己的 Serverless 平台,专注于业务逻辑开发,提高开发效率。
Novita AI Serverless
在 Novita AI,我们开发了自己的容器引擎 Nexus。凭借 Nexus 强大的分布式计算和资源调度能力,Novita AI 构建了面向下一代生成式 AI 的 Serverless 服务。用户只需关注业务创新,无需担心底层计算资源。现已开放预约,加入等待列表,抢先体验 Novita AI Serverless。
Novita AI 是一个全能的云平台,助力您的 AI 雄心。集成 API、Serverless、GPU 实例——您需要的经济高效的工具。消除基础设施,免费开始,让您的 AI 愿景成为现实。
推荐阅读
