【翻译】如何编写Kubernetes的YAML文件

举报
山河已无恙 发表于 2022/12/04 15:29:03 2022/12/04
【摘要】 写在前面CNCF官网的文章,感兴趣小伙伴可以看看原文不足之处请小伙伴批评指正 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波原文连接: http://webtrans.yodao.com/server/webtrans/tranUrl?url=htt...

写在前面


  • CNCF官网的文章,感兴趣小伙伴可以看看原文
  • 不足之处请小伙伴批评指正

傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波


原文连接: http://webtrans.yodao.com/server/webtrans/tranUrl?url=https%3A%2F%2Fwww.armosec.io%2Fblog%2Fyaml-file-for-kubernetes%2F&from=auto&to=auto&type=1&product=mdictweb&salt=1648861041808&sign=2ff277b53b8439482956d05229afc7ea

帖子最初发表于ARMO, 由研发副总裁兼联合创始人Ben Hirschberg撰写的博客

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

本文将介绍Kubernetes对象配置的YAML文件。YAML提供了一种以声明方式配置Kubernetes API的方法,这些声明性文件允许您有效地扩展和管理应用程序。如果不了解Kubernetes对象的基本配置,很容易陷入运行应用程序的陷阱,并且不了解问题的原因。

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

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

Kubernetes的YAML

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

  • Key/Field-Value Pair
app: redis
role: replica
tier: backend
  • List
containers:   
  – name: webserver1
  – name: database-server
  – name: rss-reader  
  • Map
containers:
   – name: webserver1
      image: nginx:1.6
      ports:
        – containerPort:80
   – name: database-server
      image: mysql-3.2
      ports:
        – containerPort:3306
   – name: rss-reader
      image: rss-php-nginx:2.8
      ports:
        – containerPort:86

在为Kubernetes编写YAML文件时,必须提供四个必需的字段: apiVersion, Kind, Metadata, spec.

apiVersion

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

apiVersion: v1通常被认为是Kubernetes发布的第一个稳定版本。另一个流行的APIVersionapps/v1,它采用了v1中的对象,并提供了部署和复制集等关键功能。+

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

apiVersion: v1

Kind

kind允许你指定你要定义的Kubernetes对象的类型。你将在这个字段中指定的对象将被链接到你之前指定的apiVersion,因为它是apiVersion字段,使你能够访问不同类型的对象及其特定的定义。可以定义的对象类型有pod、servicedaemonset

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

apiVersion: v1
kind: pod

metadata

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

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

apiVersion: v1
kind: Pod
metadata:
    name: spring-pod

### spec

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

如果我们继续我们构建spring应用程序的pod对象的例子,我们的spec字段可以像下面你看到的那样:

apiVersion: v1
kind: Pod
metadata:
    name: spring-pod
    containers:
    – image: armo/springapp:example
spec:
      name: spring-app
      ports:
      – containerPort: 80
        protocol: TCP

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

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

管理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对象的例子:

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm

一定要注意Secret类型。在上面的例子中,我们将Secrets类型指定为Opaque。这是Secret对象的默认类型。另一种Secrets类型是kubernetes.io/service-account-token,用于存储服务帐户token。

更多关于如何在Kubernetes中管理秘密的详细信息可以在ARMO的资源中找到。

YAML模板

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

apiVersion: v1
kind: Pod
metadata:
  name: spring-pod
spec:
  containers:
  – image: armo/springapp:example
    name: spring-app
    env:
    – name: eu-west-1
      value: postgres://db_url:5432

这个pod 将在欧盟西一地区。但是,如果我们想为美国的客户部署us-west-1,我们将不得不编写一个新的YAML文件,因为我们使用的是硬编码的值。

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

因此,使用最初的例子,我们将有一个占位符值,就像在env字段下看到的那样:

apiVersion: v1
kind: Pod
metadata:
  name: spring-pod
spec:
  containers:
  – image: armo/springapp:example
    name: spring-app
    env:
    – name: ENV
      value: %DEPLOYMENT_ENV%

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

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

结论

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

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

【版权声明】本文为华为云社区用户翻译文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容, 举报邮箱:cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。