如何使用 Kubernetes(以 YAML 文件为例)

2025-06-04

如何使用 Kubernetes(以 YAML 文件为例)

在Twitter上关注我,很高兴接受您对主题或改进的建议/Chris

我在四篇文章中介绍了 Minkube、Pod、节点、服务等概念。虽然本文旨在提供一些指导,但你使用 Kubernetes 的方式可能与我之前介绍的不同,你可能会使用 YAML 文件。

YAML 文件是让我们定义任何配置的文件。

YAML 就是 YAML,又名 YMCA?:)

不,不是那样的,更多的是像 Camel 中的 YAML

哦,好的,告诉我更多

YAML 实际上是“ YAML A in't Markup Language”( YAML A in't Markup Language )的缩写,尽管它最初代表的是另一种标记语言 ( Y et A not another Markup Language )。改变其含义的原因是为了明确其用途是面向数据,而非文档标记。

是的,你没看错,这是一个递归定义。它也被称为人类可读的数据序列化语言

感谢您的历史课,它在 Kubernetes 中扮演什么角色?

正如我们之前所说,我们一直在通过命令行向您展示 Kubernetes 的使用方法,但这并不是人们使用它的方式。

让我猜猜我使用 YAML 文件

是的,所有可以描述并部署到 Kubernetes 的东西都可以用 YAML 文件来描述。这样实际上也更简单。但在讨论 Kubernetes 的具体用法之前,我们需要了解一些 YAML 文件的基本知识,这样才能理解文件的含义。

我需要喝杯咖啡,对吧?

 资源

这篇文章实际上并非系列文章的一部分,但我之前也写过其他部分。如果你是新手,建议先阅读下面的第一部分。

下面是一些我推荐您在 Kubernetes 开始发挥作用时查看的资源:

YAML 格式

为了使用它,我们需要了解哪些格式?YAML 是 JSON 的超集,这使得 JSON 文件成为有效的 YAML 文件。这是一个有趣的信息,但真正想知道的是其中使用的结构:

  • 地图
  • 列表

好的,给我看看

地图

让我们从创建一个文件开始,我们将其命名为config.yaml

--- 
version: 1
name: some value
Enter fullscreen mode Exit fullscreen mode

以上内容包含一些关于 YAML 格式的有用见解。---被称为分隔符,除非文件中有多个结构,否则它是可选的。我们之后看到的是versionname。键与其值之间用 分隔:

这应该是 JSON 的超集,对吧,我们不是缺少双引号吗?

啊,眼睛真尖,双引号""其实是可选的。为什么要写得比必须的多呢?所以上面的代码在 JSON 中对应如下内容:

{
  "version": "1",
  "name": "some value"
}
Enter fullscreen mode Exit fullscreen mode

上面是一个地图,但是你的地图中的一个键可以依次指向一个地图,如下例所示:

--- 
version: 1
name: some value,
address: 
  street: One Microsoft Way
  city: Redmond
  country: USA
Enter fullscreen mode Exit fullscreen mode

列表

好的,让我们看看下一个格式列表。请考虑以下示例:

version: 1
todos:
 - shop
 - clean
 - do math
 - write essay
Enter fullscreen mode Exit fullscreen mode

todos在这种情况下是列表类型,这将对应于 JSON 中的以下内容:

"version": "1",
"todos": ["shop", "clean", "do match", "write essay"]
Enter fullscreen mode Exit fullscreen mode

那么作为地图的列表项怎么样?

这很简单:

created: 2019-01-01
items:
 - quantity: 2
   price: 10
   discounts:
     - id: 1
       displayName: 10% off  
     - id: 111
       displayName: Holiday Sale
Enter fullscreen mode Exit fullscreen mode

上述内容对应于以下 JSON:

{
  "created": "2019-01-01",
  "items": [{
    "quantity": 2,
    "price" : 111,
    "discounts": [{
      "id": 1,
      "displayName": "10% off"
    }, {
      "id": 111,
      "displayName": "Holiday Sale"
    }]
  }]
}
Enter fullscreen mode Exit fullscreen mode

我想我明白了。那 Kubernetes 呢?

哦,在我们开始讨论 Kubernetes 之前还有一件事。制表符 = 一点也不酷。空格是常用的,但要保持一致,如果你开始使用两个空格,那就一直用下去。

Kubernetes 中的 YAML

部署到 Kubernetes 集群的大多数内容都可以用 YAML 文件来描述。这样做有以下几个明显的优势:

  • 节省手指:不再需要在命令行上输入长结构
  • 源代码控制:YAML 文件可以存储在源代码控制中,从而我们可以跟踪更改
  • 灵活性:与命令行相比,您可以使用 YAML 创建更复杂的结构

那么我们要用 YAML 描述什么呢?我们不仅会描述,还会部署以下内容:

  • Pod,Pod 是可部署的最小单元。我知道,你通常不会只部署一个 Pod,为了练习一下,我们先来做一次。
  • 部署,这更多是关于我们想要部署的内容。它使我们能够定义副本等。

描述并部署 Pod

让我们逐步构建 Pod 的 YAML 文件,并最终将其部署到集群。好了,开始吧:

—--
apiVersion: v1
kind: Pod
Enter fullscreen mode Exit fullscreen mode

我们首先指定一个apiVersion。然后我们继续指定kind: Pod。现在这一点很重要。它可以是许多不同的类型,例如 Deployment 或 Service,例如 Pod。

元数据
我们文件的下一部分是元数据部分。在这里我们给它一个名称和一个标签:

metadata:
 name: My Pod
 labels:
   app: web
Enter fullscreen mode Exit fullscreen mode

规格

现在我们来描述组成 Pod 的各个部分。

spec:
  containers:
    - name: first-app
      image: gcr.io/google-samples/kubernetes-bootcamp:v1
      ports:
        - containerPort: 8080
Enter fullscreen mode Exit fullscreen mode

所有放在一起我们的pod.yaml文件现在应该是这样的:

apiVersion: v1
kind: Pod
metadata:
 name: my-pod
 labels:
   app: web
spec:
  containers:
    - name: first-app
      image: gcr.io/google-samples/kubernetes-bootcamp:v1
      ports:
        - containerPort: 8080
Enter fullscreen mode Exit fullscreen mode

部署我们的 POD YAML

现在我们想将它部署到集群。所以我们又要和老朋友聊聊了,minikube然后kubectl

有时我的minikube服务器有点慢,所以我用命令 重新启动它minikube start。该命令运行完成后,让我们使用以下命令检查 Pod 的情况:

kubectl get pods
Enter fullscreen mode Exit fullscreen mode

它应该列出当前正在启动和运行的所有 Pod:

正如您在上面看到的,我们过去已经做了相当多的实验,并创建了各种各样的 Pod,这对您来说显然看起来不同。

接下来,让我们pod.yaml从该文件创建一个 Pod。为此,我们运行以下命令:

kubectl create -f pod.yaml
Enter fullscreen mode Exit fullscreen mode

这意味着从文件 创建一个 Pod -f,文件名为pod.yaml。该命令的结果是:

该命令的结果表明我们已经创建了一个 Pod,让我们重新运行 Pod 列表命令:

kubectl get pods
Enter fullscreen mode Exit fullscreen mode

这次,我们的新 Pod 已经启动并运行了。当然,只部署一个这样的 Pod 是不行的。因为 Pod 是动态的,一旦宕机,就彻底消失了。没有服务能够再次启动它。

那么为什么还要展示它呢?

展示如何从文件创建工件可能很有教育意义,但从 Kubernetes 的角度来看,它并没有用到所有能够在发生意外时保持其正常运行的优秀服务。毕竟,我们之所以使用 Kubernetes,就是为了实现高弹性。

因此,接下来我们来看一个部署。

继续之前,我们先进行一下清理:

kubectl delete pods my-pod
Enter fullscreen mode Exit fullscreen mode

这会触发所谓的“优雅终止”,这是推荐的做法。如果你不耐烦,可以使用以下命令强制删除它:

kubectl delete pods my-pod --grace-period=0 --force
Enter fullscreen mode Exit fullscreen mode

当然,我们删除了优雅的方式,所以过了一会儿我们得到了这个:

如果你运行kubectl get pods我们的pod,它现在就消失了。我们所有的应用数据都消失了,消失了。

我明白了,别着急,我不会直接创建 Pod,我们可以继续吗?

 部署

好的,那么部署,做事的正确方法。

我们将使用一种叫做 的概念ReplicationController。从技术上讲,这是一个较旧的概念,正在逐渐被Deployments 所取代,后者是一个管理 部署的高级概念ReplicaSets。仪表板支持和其他方面仍然存在问题,这使得所有这些类似的概念仍然存在,让我们更加困惑 ;) 总的来说,在一段时间内使用这些较旧的概念是可以的。

这次我们将定义一种新的对象类型,即所谓的。现在,这是一个 Deployment 对象,它不仅指出了要将哪个镜像部署到 Pod,还指出了在给定时间点(即所谓的期望状态 )ReplicationController我们想要部署多少个 Pod 。让我们从头开始看一下这个文件:

apiVersion: v1
kind: ReplicationController
metadata: 
  name: my-rc
Enter fullscreen mode Exit fullscreen mode

我们将其定义kind为 类型,ReplicationController而不是Pod,并在元数据中将其命名为my-rc。现在让我们进入规范部分:

spec:
  replicas: 5
  selector: 
    app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: my-first-app
        image: gcr.io/google-samples/kubernetes-bootcamp:v1
        ports:
        - containerPort: 8080
Enter fullscreen mode Exit fullscreen mode

这里真正有趣的部分是replicas,Pod 的数量和其余部分主要是我们再次指出相同的图像。

该规范在顶层看起来略有不同,因为它是一个 ReplicationController,但内部spec是我们习惯的,指出了镜像、端口和其他信息。让我们看看我们命名的完整文件rc.yaml

apiVersion: v1
kind: ReplicationController
metadata: 
  name: my-rc
spec:
  replicas: 5
  selector: 
    app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: my-first-app
        image: gcr.io/google-samples/kubernetes-bootcamp:v1
        ports:
        - containerPort: 8080
Enter fullscreen mode Exit fullscreen mode

我们通过输入以下内容根据文件创建上述部署:

kubectl create -f rc.yaml
Enter fullscreen mode Exit fullscreen mode

上面我们看到我们的复制控制器已经创建。

让我们现在列出所有的 pod,并确保我们获得与预期一样多的 pod:

kubectl get pods
Enter fullscreen mode Exit fullscreen mode

查看上面的清单,我们发现我们有 5 个副本,也就是 5 个 Pod 实例。我们可以尝试删除其中一个,看看会发生什么:

kubectl delete pods my-rc-wx6h7
Enter fullscreen mode Exit fullscreen mode

它告诉我们上面的 Pod 已被删除,因此我们等待正常删除完成,然后再次列出我们的 Pod,这就是我们得到的结果:

如上所示,我们的特定 Pod 已被删除,但它正在被另一个 Pod 替换,副本数量保持不变,Kubernetes 正在执行其工作

那么我们怎样才能把它放下来呢,大蒜,木桩?

让我们首先列出所有复制控制器:

kubernetes get replicationcontroller
Enter fullscreen mode Exit fullscreen mode

现在我们可以通过两种方式将其降低,大蒜或删除;)

是啊是啊很有趣,删除,告诉我更无聊

就像打字一样简单

kubectl delete replicationcontroller [name of replication controller]
Enter fullscreen mode Exit fullscreen mode

如果你执行上述操作,不仅会删除复制控制器,还会删除所有与其关联的 Pod,即所谓的级联删除。如果你只想删除复制控制器,可以指定--cascade=false。我们希望删除所有 Pod,因此只需输入:

kubectl delete my-rc
Enter fullscreen mode Exit fullscreen mode

这样应该就能把所有东西都删掉了。运行一下kubectl get replicationcontroller应该就没了。我们再运行一​​下kubectl get pods,看看 Pod 也消失了没有。

让我们把另一个复制控制器也拿走,它在我的系统中挂了太长时间:

kubectl delete replicationcontroller my-rc
Enter fullscreen mode Exit fullscreen mode

快速点击:

kubectl get pods
Enter fullscreen mode Exit fullscreen mode

您将能够看到 Pod 被终止:

概括

在本文中,我们讨论了 YAML 文件格式、它是什么以及它是如何工作的。我们还讨论了如何使用 YAML 文件来配置我们的 Kubernetes 体验。此外,我们还演示了如何部署 Pod 以及如何部署 Kubernetes ReplicationControllers。希望本文对您有所帮助,并让您体验真正的 Kubernetes 管理是什么样子。

文章来源:https://dev.to/azure/how-you-actually-use-kubernetes-starring-yaml-files-3c0k
PREV
学习 Kubernetes,第四部分,自动缩放
NEXT
如何使用 TypeORM 向 NestJS API 添加免费的 MongoDB 数据库