当前位置:Java -> 用Java编写Kubernetes操作员:第1部分

用Java编写Kubernetes操作员:第1部分

在本文中,您将简要了解什么是运算符,以及在Java中创建运算符可能会很有趣的原因。未来的文章将向您展示如何使用Java Operator SDK(JOSDK)创建一个简单的运算符,这是一个旨在简化使用Java创建Kubernetes运算符的开源项目。

正如您可能猜到的那样,本系列文章主要面向对在Java中编写运算符感兴趣的Java开发人员。您无需成为运算符或Kubernetes的专家。然而,对所有这些主题的基本理解将有所帮助。

Kubernetes运算符:简要介绍

Kubernetes已经成为部署云应用程序的事实标准平台。在其核心,Kubernetes基于一个简单的理念:用户传达他们希望集群处于的状态,平台将努力实现该目标。用户无需告诉Kubernetes如何到达那里的步骤;他们只需指定所需的最终状态是什么样子。通常,这涉及向集群提供以JSON或YAML文件的形式材料化的所需状态的版本,使用kubectl工具将其发送到集群供其考虑。假设所需状态有效,则一旦在集群上,就会由控制器处理。控制器是在集群上运行的进程,监视相关资源以使其实际状态与用户期望的状态一致。

尽管具有这种概念上的简单性,实际操作Kubernetes集群对于非专家用户来说并不是一个微不足道的任务。特别是,部署和配置Kubernetes应用程序通常需要创建几个由有时复杂关系联系在一起的资源。特别是,那些可能没有运维经验的开发人员通常难以将其应用程序从本地开发环境移至最终的云目标地。因此,简化这个复杂性将给用户带来巨大的好处,尤其是通过将所需的运维知识封装在一种可以由对该平台不太熟悉的用户在更高级别进行交互的形式中。这正是Kubernetes 运算符开发的目的。

自定义资源

Kubernetes提供了一种扩展机制,即< a>自定义资源(CRs),允许用户以类似于核心平台实现方式来扩展Kubernetes平台。在如何处理原生资源和自定义资源方面,实际上没有太多正式差异:两者都通过资源的YAML或JSON表示定义了控制平台的特定方面的领域特定语言(DSLs)。虽然原生资源通过它们相关的控制器控制平台的组成部分,但自定义资源在这些原生资源之上提供了另一层—允许用户定义更高级别的抽象。

然而,平台对这些自定义资源一无所知,因此用户必须首先向平台注册一个控制器来处理它们。自定义资源定义的DSL和相关控制器的组合使用户能够定义更接近于他们业务模型的词汇。他们可以专注于应用程序的与业务相关方面,而不是担心特定状态将如何在集群上实现;后者的任务落在相关的控制器责任范围内。这种模式使得将与自定义资源提供的DSL背后实施的运维知识封装起来成为可能。这就是运算符的实现:这种有用模式的实现。

因此,对于那些希望减少部署应用程序所需知识的人(但又想自动化重复步骤的人),运算符非常有吸引力。它们为组织提供了将业务规则或流程封装在由针对当前任务的词汇表达的声明性“语言”背后的可能性,而不是处理那些对技术水平较低的用户来说陌生的Kubernetes本地资源。一旦在集群上安装和配置了运算符,它提供的逻辑和自动化就可供集群用户访问,后者只需处理相关的DSL。

为什么要用Java编写运算符?

Kubernetes及其生态系统使用Go编程语言编写,传统上运算符也是如此。虽然不必将所有内容都用相同的语言编写,但现实是,该生态系统针对Go开发人员进行了优化。公平地说,Go非常适合这个任务:该语言相对易学,并在内存和CPU使用方面具有良好的运行时特性。此外,有几个Go项目旨在简化编写运算符的过程:

如果Go非常适合编写运算符,为什么有人想要用Java来做呢?首先,Java是许多企业应用程序编写的语言。这些应用程序通常从性质上来说非常复杂,并且依赖于它们的公司将受益于以简化的方式在Kubernetes集群上规模化部署和操作它们。

此外,DevOps理念要求开发人员还应该负责将应用程序部署到生产环境、维护和应用程序生命周期的其他运维方面。从这个角度来看,在生命周期的所有阶段使用相同的语言是一个有吸引力的建议。

最后,希望用Java编写Kubernetes运算符的公司希望利用其开发人员之间现有的丰富Java经验。如果开发人员可以快速掌握已经了解的编程语言,而不是投资时间和精力学习一种新的编程语言,那将提供一个非常可观的优势。

Java在云端?

话虽如此,如果用Java编写运算符提供了如此多的好处,为什么没有更多的公司这样做呢?首先想到的原因是,与Go相比,Java在部署到云端方面传统上相对薄弱。事实上,Java是一种在长时间运行的服务器上性能经过数十年打磨的平台。在这种情况下,内存使用或启动时间通常不是问题。这个特定的缺点随着时间的推移逐渐被解决,但事实仍然是典型的Java应用程序将使用更多的内存并且启动比Go应用程序更慢。在云环境中这一点相当重要,因为您的应用程序运行的pod随时可能被杀死(cattle versus pet approach),并且您可能需要快速扩展(尤其是在无服务器环境中)。内存消耗也影响部署密度:您的应用程序消耗的内存越多,在资源有限的同一集群上部署多个实例就越困难。

已经启动了一些项目,旨在改进Java在云环境中的适用性,其中之一是Quarkus,本系列文章将重点关注这个项目。Quarkus项目自称为“针对OpenJDK HotSpot和GraalVM量身定制的基于Kubernetes的Java栈,由最好的Java库和标准精心打造而成。”通过将传统Java栈在运行时(例如注解处理、属性文件解析、内省等)的许多处理移动到构建时,Quarkus 在消耗的内存和启动时间方面改善了Java应用程序的性能。通过利用GraalVM项目,还可以更容易地实现Java应用程序的本地编译,使其与Go应用程序具有竞争力,几乎消除了运行时特性的影响。

框架支持如何?

然而,正如我们已经注意到的,即使我们不考虑运行时特性,Go也是一个很有吸引力的语言,可用于编写操作者,这在很大程度上归功于其提供的框架生态系统,以支持这样的任务。虽然有Java客户端与client-go项目媲美,可用于与Kubernetes服务器进行交互,但这些客户端只提供低级抽象,而Go生态系统提供了面向操作者开发人员的更高级框架和工具。

这就是JOSDK的用武之地,提供了一个与Go开发者所获得的controller-runtime相媲美的框架,但专为Java开发人员量身定制,使用Java习惯用法。JOSDK旨在通过提供一个处理低级事件并实施最佳实践和模式的框架,从而使Java操作者的开发任务变得更容易,使开发人员可以专注于操作者的业务逻辑,而不必担心与Kubernetes API服务器交互所需的低级操作。

鉴于Quarkus特别适合部署Java应用程序,更具体地说是在云中部署操作者,JOSDK通过quarkus-operator-sdk,一个Quarkus扩展,进一步与Quarkus集成,通过专注于开发体验方面,进一步简化了Java操作者的开发任务。还存在一个用于快速搭建使用JOSDK及其Quarkus扩展的Java操作者项目的插件,可供operator-sdk命令行工具使用。

结论

这就是本系列探讨使用JOSDK和Quarkus编写操作者的第一部分。您对这些项目的动机有了一定的了解,也看到了为什么在Java中编写操作者是有趣且有用的。

在本系列的下一部分中,您将更详细地了解JOSDK的概念,并开始使用其Quarkus扩展和operator-sdk命令行工具实现自己的Java操作者。

推荐阅读: 剑指offer 49.丑数

本文链接: 用Java编写Kubernetes操作员:第1部分