如何编写Kubernetes的YAML文件?

7fa832088a7c06be315ff2d6aa7c45c5.gif

整理 | 山河已无恙     校对 | 西狩xs

出品 | CSDN云原生

声明:本文原文来自CNCF官方博客,由Armo研发副总裁兼联合创始人Ben Hirschberg撰写。CSDN将文章翻译成中文,分享给大家。

尽管Kubernetes越来越受欢迎,但它仍然有一定的学习难度,这使得很难采用这项技术。在快节奏的软件开发领域中,那些不能克服初期障碍的人往往会被甩在身后。

本文将介绍Kubernetes对象配置的YAML文件。YAML提供了一种以声明式配置Kubernetes应用程序的方法,这些声明性文件允许您有效地扩展和管理应用程序。如果不了解Kubernetes对象的基本配置,很容易陷入运行应用程序的陷阱,而无法了解他们是如何工作的。

需要注意的是,YAML和JSON都可以用于Kubernetes的配置,尽管在某些情况下YAML被认为更难编写,但它更加紧凑。当考虑到需要为大型应用程序管理所有YAML文件时,这是一个很大的优势。

总的来说,YAML更易于用户使用,紧凑的特性允许您对相关的Kubernetes 对象进行分组,从而减少所需文件的数量。这是因为YAML的设计目标是提高可读性并提供更完整的信息模型。它可以简单地看作是JSON的演变。

2e500239fdde2c92340b70a3ea9a7270.png

Kubernetes的YAML

为了开始使用Kubernetes的YAML,我们将回顾YAML的基本结构类型,如下表所示:

如何编写Kubernetes的YAML文件?_第1张图片

在为Kubernetes编写YAML文件时,必须存在四个必需的字段:API版本(apiVersion)、类型(kind)、元数据(metadata)和规范(spec)。

apiVersion

该字段引用API,用于创建要定义的Kubernetes对象。Kubernetes提供了各种 API,使您能够创建不同的Kubernetes对象。例如:apiVersion: v1包含了许多核心对象。

apiVersion: v1通常被认为是Kubernetes发布的第一个稳定版本。另一个流行的API版本是apps/v1,它采用了v1中的对象,并提供了Deployments和 ReplicaSets等关键功能。

因此,在我们的YAML文件中,定义API版本可以是:

a125595ebc465e43e2c7b265a8e2d438.png

kind

kind允许您指定要定义的Kubernetes对象的类型。您在这个字段中要指定的对象将被链接到您之前指定的apiVersion,因为API版本字段允许您访问不同类型的对象及其特定的定义。可以定义的对象类型有Pod、Service和 DaemonSet。

因此,为了定义一个Pod对象,在指定apiVersion之后,我们将指定kind字段,如下所示:

a4a945eff936aace938af91244e90f5b.png

metadata

在指定要定义的对象类型之后,metadata字段将为该特定对象提供唯一属性。这可能包括name、uuid和namespace等字段。这些字段指定的值为我们提供了该对象的上下文,并且它们也可以被其他对象引用。因此,这个字段允许我们指定对象的标识符属性。

例如:如果我们正在构建一个spring应用程序,Pod的name值可如下所示:

如何编写Kubernetes的YAML文件?_第2张图片

spec

spec字段允许我们为我们构建的对象定义期望值。它由所有针对定义对象操作的键值对组成。就像对象本身一样,对象的规范依赖于之前指定的API版本。因此,不同的API版本可能包含相同的对象,但对象可以定义的规范可能会有所不同。

如果我们继续构建spring应用程序的Pod对象示例,spec字段则如下所示:

如何编写Kubernetes的YAML文件?_第3张图片

在上面的最后一个示例文件中,我们使用API v1创建一个Pod对象,并将其命名为spring-pod。按照这个规范,我们将使用的端口为80,使用的镜像为 armo/springapp:example。

下图比较了JSON和YAML中的配置。正如您所看到的,YAML更加简洁易读。

如何编写Kubernetes的YAML文件?_第4张图片


5951a7dc67c5fa227e79d7d4a5389b64.png

管理YAML文件的策略

现在我们已经构建了Kubernetes的YAML文件,让我们看看进一步加速构建 Kubernetes应用程序的一些策略。

YAML的版本控制

如上所述,使用YAML字段允许您以声明方式管理Kubernetes应用程序。这些 YAML文件可以存储在一个公共目录中,并且可以使用kubectl apply-f 来应用它们。

这相当简单。但是,随着应用程序的演变和对Kubernetes对象定义的更改,您必须考虑当前部署的是哪个版本和更改。这是因为:如果没有版本控制,您可能无法回滚到之前的镜像,而之前的镜像可能会比新运行的镜像更加稳定。

有几种方法可以实现YAML的版本控制,它们的复杂性和易管理性各不相同。这可能需要在YAML中使用简单的标记以及手动执行kubectl命令,或者需要使用特殊工具,如Helm。受限于本文的讲解范围,无法详细介绍这些方法,但是值得一提的是:版本控制非常重要。

管理Secrets

在应用程序的整个生命周期中,您可能需要利用隐私数据来支持其功能。这可能包括密码、用户信息,甚至信用卡详细信息。

在定义Kubernetes对象时,您可以将这些数据直接作为变量放入YAML文件中。然而,这可能会导致重大的安全漏洞,并且增加了这些数据落入坏人之手的可能性。因此,建议使用Kubernetes提供的Secrets对象以及秘密管理工具。

当利用Secrets对象时,pod必须引用Secret。这就是我们使用metadata字段的地方。pod将使用Secret name字段,其中Secret对象的名称将是一个有效的DNS子域名。

在利用Secrets对象时,Pod必须引用Secret。所以,这就是我们使用元数据字段的地方。Pod将使用Secret name字段,其中Secret对象的名称将是有效的DNS子域名。

下面是一个定义Secrets对象的示例:

如何编写Kubernetes的YAML文件?_第5张图片

一定要注意Secret类型。在上面的示例中,我们将Secrets类型指定为Opaque(不透明)。这是Secret对象的默认类型。

另一种Secrets类型是 kubernetes.io/service-account-token,用于存储服务帐户token。

更多关于如何管理Kubernetes隐私的详细信息可以参考ARMO中的资料。

YAML模板

YAML模板的目的是通过在Kubernetes应用程序中复用YAML文件来减少我们必须编写和管理的YAML文件的数量。例如,让我们考虑下面的Pod定义:

如何编写Kubernetes的YAML文件?_第6张图片

这个Pod位于eu-west-1区域。但是,如果我们想为美国的客户部署us-west-1,将不得不编写一个新的YAML文件,因为我们使用的是硬编码值。

这个问题的解决方案是YAML模板,它允许我们使用不同的值复用YAML文件。YAML模板有几种方法,但最基本的方法是搜索并替换我们在YAML文件中使用占位符来表示一些值的地方。

因此,回到最初的例子,我们将添加一个占位符值,如env字段下所示:

如何编写Kubernetes的YAML文件?_第7张图片

通过利用bash中的sed命令,我们可以在处理YAML文件之前搜索并替换这些值。然而,这是最基本和最不方便的方法,因为您必须手动执行占位符的硬编码。

一种更便捷的方法是利用像Helm这样的工具来构建和管理模板。

40384faf52d7d0de15a8f258a376aa05.png

结论

由于YAML的结构及其设计目标,它是Kubernetes配置的最佳解决方案。增强的可读性和简洁的结构使您在扩展Kubernetes配置时,不会迷失在成堆的配置文件中。

此外,通过了解如何声明式地构建Kubernetes应用程序,我们还可以理解 Kubernetes应用程序如何以及为什么运行的机制,并考虑YAML模板等高级功能来帮助简化定义和构建Kubernetes应用程序的过程。

559a4a956d5e6485c0ba153931864284.png

END

云原生志愿者计划正在招募 

精准把握技术趋势,深度学习新技术、新实践

如何编写Kubernetes的YAML文件?_第8张图片

扫描图片二维码立即申请加入


— 推荐阅读 —


☞只需十步,让你的应用云原生化
☞云原生应用交付的前世今生与一线实践☞2个维度5大方法,让你的微服务在K8s上跑起来☞透彻解析云原生在数字化转型中的应用实践,PaaS功不可没

—点这里↓↓↓记得关注标星哦—

一键三连 「分享」「点赞」「在看」

成就一亿技术人

41c842c04fa1999dd3013964130897fc.png

你可能感兴趣的:(python,java,大数据,spring,kubernetes)