整理 | 山河已无恙 校对 | 西狩xs
出品 | CSDN云原生
声明:本文原文来自CNCF官方博客,由Armo研发副总裁兼联合创始人Ben Hirschberg撰写。CSDN将文章翻译成中文,分享给大家。
尽管Kubernetes越来越受欢迎,但它仍然有一定的学习难度,这使得很难采用这项技术。在快节奏的软件开发领域中,那些不能克服初期障碍的人往往会被甩在身后。
本文将介绍Kubernetes对象配置的YAML文件。YAML提供了一种以声明式配置Kubernetes应用程序的方法,这些声明性文件允许您有效地扩展和管理应用程序。如果不了解Kubernetes对象的基本配置,很容易陷入运行应用程序的陷阱,而无法了解他们是如何工作的。
需要注意的是,YAML和JSON都可以用于Kubernetes的配置,尽管在某些情况下YAML被认为更难编写,但它更加紧凑。当考虑到需要为大型应用程序管理所有YAML文件时,这是一个很大的优势。
总的来说,YAML更易于用户使用,紧凑的特性允许您对相关的Kubernetes 对象进行分组,从而减少所需文件的数量。这是因为YAML的设计目标是提高可读性并提供更完整的信息模型。它可以简单地看作是JSON的演变。
Kubernetes的YAML
为了开始使用Kubernetes的YAML,我们将回顾YAML的基本结构类型,如下表所示:
在为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版本可以是:
kind
kind允许您指定要定义的Kubernetes对象的类型。您在这个字段中要指定的对象将被链接到您之前指定的apiVersion,因为API版本字段允许您访问不同类型的对象及其特定的定义。可以定义的对象类型有Pod、Service和 DaemonSet。
因此,为了定义一个Pod对象,在指定apiVersion之后,我们将指定kind字段,如下所示:
例如:如果我们正在构建一个spring应用程序,Pod的name值可如下所示:
如果我们继续构建spring应用程序的Pod对象示例,spec字段则如下所示:
在上面的最后一个示例文件中,我们使用API v1创建一个Pod对象,并将其命名为spring-pod。按照这个规范,我们将使用的端口为80,使用的镜像为 armo/springapp:example。
下图比较了JSON和YAML中的配置。正如您所看到的,YAML更加简洁易读。
现在我们已经构建了Kubernetes的YAML文件,让我们看看进一步加速构建 Kubernetes应用程序的一些策略。
如上所述,使用YAML字段允许您以声明方式管理Kubernetes应用程序。这些 YAML文件可以存储在一个公共目录中,并且可以使用kubectl apply-f
这相当简单。但是,随着应用程序的演变和对Kubernetes对象定义的更改,您必须考虑当前部署的是哪个版本和更改。这是因为:如果没有版本控制,您可能无法回滚到之前的镜像,而之前的镜像可能会比新运行的镜像更加稳定。
有几种方法可以实现YAML的版本控制,它们的复杂性和易管理性各不相同。这可能需要在YAML中使用简单的标记以及手动执行kubectl命令,或者需要使用特殊工具,如Helm。受限于本文的讲解范围,无法详细介绍这些方法,但是值得一提的是:版本控制非常重要。
在应用程序的整个生命周期中,您可能需要利用隐私数据来支持其功能。这可能包括密码、用户信息,甚至信用卡详细信息。
在定义Kubernetes对象时,您可以将这些数据直接作为变量放入YAML文件中。然而,这可能会导致重大的安全漏洞,并且增加了这些数据落入坏人之手的可能性。因此,建议使用Kubernetes提供的Secrets对象以及秘密管理工具。
当利用Secrets对象时,pod必须引用Secret。这就是我们使用metadata字段的地方。pod将使用Secret name字段,其中Secret对象的名称将是一个有效的DNS子域名。
在利用Secrets对象时,Pod必须引用Secret。所以,这就是我们使用元数据字段的地方。Pod将使用Secret name字段,其中Secret对象的名称将是有效的DNS子域名。
下面是一个定义Secrets对象的示例:
一定要注意Secret类型。在上面的示例中,我们将Secrets类型指定为Opaque(不透明)。这是Secret对象的默认类型。
另一种Secrets类型是 kubernetes.io/service-account-token,用于存储服务帐户token。
更多关于如何管理Kubernetes隐私的详细信息可以参考ARMO中的资料。
YAML模板的目的是通过在Kubernetes应用程序中复用YAML文件来减少我们必须编写和管理的YAML文件的数量。例如,让我们考虑下面的Pod定义:
这个Pod位于eu-west-1区域。但是,如果我们想为美国的客户部署us-west-1,将不得不编写一个新的YAML文件,因为我们使用的是硬编码值。
这个问题的解决方案是YAML模板,它允许我们使用不同的值复用YAML文件。YAML模板有几种方法,但最基本的方法是搜索并替换我们在YAML文件中使用占位符来表示一些值的地方。
因此,回到最初的例子,我们将添加一个占位符值,如env字段下所示:
通过利用bash中的sed命令,我们可以在处理YAML文件之前搜索并替换这些值。然而,这是最基本和最不方便的方法,因为您必须手动执行占位符的硬编码。
一种更便捷的方法是利用像Helm这样的工具来构建和管理模板。
由于YAML的结构及其设计目标,它是Kubernetes配置的最佳解决方案。增强的可读性和简洁的结构使您在扩展Kubernetes配置时,不会迷失在成堆的配置文件中。
此外,通过了解如何声明式地构建Kubernetes应用程序,我们还可以理解 Kubernetes应用程序如何以及为什么运行的机制,并考虑YAML模板等高级功能来帮助简化定义和构建Kubernetes应用程序的过程。
END
云原生志愿者计划正在招募
精准把握技术趋势,深度学习新技术、新实践
扫描图片二维码立即申请加入
— 推荐阅读 —
☞只需十步,让你的应用云原生化
☞云原生应用交付的前世今生与一线实践☞2个维度5大方法,让你的微服务在K8s上跑起来☞透彻解析云原生在数字化转型中的应用实践,PaaS功不可没
—点这里↓↓↓记得关注标星哦—
一键三连 「分享」「点赞」「在看」
成就一亿技术人