如何使用 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 文件的基本知识,这样才能理解文件的含义。
我需要喝杯咖啡,对吧?
资源
这篇文章实际上并非系列文章的一部分,但我之前也写过其他部分。如果你是新手,建议先阅读下面的第一部分。
- 第一部分 - 从头开始,第一部分,基础知识、部署和 Minikube在这一部分中,我们将介绍为什么使用 Kubernetes、一些历史和一些基本概念,如部署、节点、Pod。
- 第二部分 - 服务和标签简介在本部分中,我们将加深对 Pod 和节点的了解。我们还将介绍服务和标签,以及如何使用标签来查询我们的工件。
-
第三部分 - 扩展
在本部分中,我们将探讨如何根据期望状态进行扩展。我们指定所需的 Pod 数量,然后让 Kubernetes 承担主要工作,确保 Pod 能够扩展到期望数量,并通过所谓的自我修复功能来维持这一数量。 -
第四部分 - 自动扩展
您可以通过查看 CPU 使用率在 Kubernetes 中进行扩展
下面是一些我推荐您在 Kubernetes 开始发挥作用时查看的资源:
- 水平 Pod 自动缩放详细描述了所有操作的工作原理。在流程和 API 级别
- 免费 Azure 帐户如果您想试用 AKS、Azure Kubernetes 服务,您将需要一个免费的 Azure 帐户
- Kubernetes.io了解 Kubernetes 的最佳资源之一是 Google 的官方 Kubernetes 网站。
- Kubernetes 概述Kubernetes 概述、其各个部分以及其工作原理
- 云端 Kubernetes你是否觉得自己已经了解 Kubernetes 的方方面面,只想学习如何使用托管服务?那么这个链接正适合你
- AKS、Azure Kubernetes 服务文档Azure Kubernetes 服务,托管 Kubernetes
- AKS 的最佳实践您已经了解 AKS 并想学习如何更好地使用它?
YAML 格式
为了使用它,我们需要了解哪些格式?YAML 是 JSON 的超集,这使得 JSON 文件成为有效的 YAML 文件。这是一个有趣的信息,但真正想知道的是其中使用的结构:
- 地图
- 列表
好的,给我看看
地图
让我们从创建一个文件开始,我们将其命名为config.yaml
:
---
version: 1
name: some value
以上内容包含一些关于 YAML 格式的有用见解。---
被称为分隔符,除非文件中有多个结构,否则它是可选的。我们之后看到的是version
和name
。键与其值之间用 分隔:
。
这应该是 JSON 的超集,对吧,我们不是缺少双引号吗?
啊,眼睛真尖,双引号""
其实是可选的。为什么要写得比必须的多呢?所以上面的代码在 JSON 中对应如下内容:
{
"version": "1",
"name": "some value"
}
上面是一个地图,但是你的地图中的一个键可以依次指向一个地图,如下例所示:
---
version: 1
name: some value,
address:
street: One Microsoft Way
city: Redmond
country: USA
列表
好的,让我们看看下一个格式列表。请考虑以下示例:
version: 1
todos:
- shop
- clean
- do math
- write essay
todos
在这种情况下是列表类型,这将对应于 JSON 中的以下内容:
"version": "1",
"todos": ["shop", "clean", "do match", "write essay"]
那么作为地图的列表项怎么样?
这很简单:
created: 2019-01-01
items:
- quantity: 2
price: 10
discounts:
- id: 1
displayName: 10% off
- id: 111
displayName: Holiday Sale
上述内容对应于以下 JSON:
{
"created": "2019-01-01",
"items": [{
"quantity": 2,
"price" : 111,
"discounts": [{
"id": 1,
"displayName": "10% off"
}, {
"id": 111,
"displayName": "Holiday Sale"
}]
}]
}
我想我明白了。那 Kubernetes 呢?
哦,在我们开始讨论 Kubernetes 之前还有一件事。制表符 = 一点也不酷。空格是常用的,但要保持一致,如果你开始使用两个空格,那就一直用下去。
Kubernetes 中的 YAML
部署到 Kubernetes 集群的大多数内容都可以用 YAML 文件来描述。这样做有以下几个明显的优势:
- 节省手指:不再需要在命令行上输入长结构
- 源代码控制:YAML 文件可以存储在源代码控制中,从而我们可以跟踪更改
- 灵活性:与命令行相比,您可以使用 YAML 创建更复杂的结构
那么我们要用 YAML 描述什么呢?我们不仅会描述,还会部署以下内容:
- Pod,Pod 是可部署的最小单元。我知道,你通常不会只部署一个 Pod,为了练习一下,我们先来做一次。
- 部署,这更多是关于我们想要部署的内容。它使我们能够定义副本等。
描述并部署 Pod
让我们逐步构建 Pod 的 YAML 文件,并最终将其部署到集群。好了,开始吧:
—--
apiVersion: v1
kind: Pod
我们首先指定一个apiVersion
。然后我们继续指定kind: Pod
。现在这一点很重要。它可以是许多不同的类型,例如 Deployment 或 Service,例如 Pod。
元数据
我们文件的下一部分是元数据部分。在这里我们给它一个名称和一个标签:
metadata:
name: My Pod
labels:
app: web
规格
现在我们来描述组成 Pod 的各个部分。
spec:
containers:
- name: first-app
image: gcr.io/google-samples/kubernetes-bootcamp:v1
ports:
- containerPort: 8080
所有放在一起我们的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
部署我们的 POD YAML
现在我们想将它部署到集群。所以我们又要和老朋友聊聊了,minikube
然后kubectl
。
有时我的minikube
服务器有点慢,所以我用命令 重新启动它minikube start
。该命令运行完成后,让我们使用以下命令检查 Pod 的情况:
kubectl get pods
它应该列出当前正在启动和运行的所有 Pod:
正如您在上面看到的,我们过去已经做了相当多的实验,并创建了各种各样的 Pod,这对您来说显然看起来不同。
接下来,让我们pod.yaml
从该文件创建一个 Pod。为此,我们运行以下命令:
kubectl create -f pod.yaml
这意味着从文件 创建一个 Pod -f
,文件名为pod.yaml
。该命令的结果是:
该命令的结果表明我们已经创建了一个 Pod,让我们重新运行 Pod 列表命令:
kubectl get pods
这次,我们的新 Pod 已经启动并运行了。当然,只部署一个这样的 Pod 是不行的。因为 Pod 是动态的,一旦宕机,就彻底消失了。没有服务能够再次启动它。
那么为什么还要展示它呢?
展示如何从文件创建工件可能很有教育意义,但从 Kubernetes 的角度来看,它并没有用到所有能够在发生意外时保持其正常运行的优秀服务。毕竟,我们之所以使用 Kubernetes,就是为了实现高弹性。
因此,接下来我们来看一个部署。
继续之前,我们先进行一下清理:
kubectl delete pods my-pod
这会触发所谓的“优雅终止”,这是推荐的做法。如果你不耐烦,可以使用以下命令强制删除它:
kubectl delete pods my-pod --grace-period=0 --force
当然,我们删除了优雅的方式,所以过了一会儿我们得到了这个:
如果你运行kubectl get pods
我们的pod,它现在就消失了。我们所有的应用数据都消失了,消失了。
我明白了,别着急,我不会直接创建 Pod,我们可以继续吗?
部署
好的,那么部署,做事的正确方法。
我们将使用一种叫做 的概念ReplicationController
。从技术上讲,这是一个较旧的概念,正在逐渐被Deployment
s 所取代,后者是一个管理 部署的高级概念ReplicaSets
。仪表板支持和其他方面仍然存在问题,这使得所有这些类似的概念仍然存在,让我们更加困惑 ;) 总的来说,在一段时间内使用这些较旧的概念是可以的。
这次我们将定义一种新的对象类型,即所谓的。现在,这是一个 Deployment 对象,它不仅指出了要将哪个镜像部署到 Pod,还指出了在给定时间点(即所谓的期望状态 )ReplicationController
我们想要部署多少个 Pod 。让我们从头开始看一下这个文件:
apiVersion: v1
kind: ReplicationController
metadata:
name: my-rc
我们将其定义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
这里真正有趣的部分是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
我们通过输入以下内容根据文件创建上述部署:
kubectl create -f rc.yaml
上面我们看到我们的复制控制器已经创建。
让我们现在列出所有的 pod,并确保我们获得与预期一样多的 pod:
kubectl get pods
查看上面的清单,我们发现我们有 5 个副本,也就是 5 个 Pod 实例。我们可以尝试删除其中一个,看看会发生什么:
kubectl delete pods my-rc-wx6h7
它告诉我们上面的 Pod 已被删除,因此我们等待正常删除完成,然后再次列出我们的 Pod,这就是我们得到的结果:
如上所示,我们的特定 Pod 已被删除,但它正在被另一个 Pod 替换,副本数量保持不变,Kubernetes 正在执行其工作
那么我们怎样才能把它放下来呢,大蒜,木桩?

让我们首先列出所有复制控制器:
kubernetes get replicationcontroller
现在我们可以通过两种方式将其降低,大蒜或删除;)
是啊是啊很有趣,删除,告诉我更无聊
就像打字一样简单
kubectl delete replicationcontroller [name of replication controller]
如果你执行上述操作,不仅会删除复制控制器,还会删除所有与其关联的 Pod,即所谓的级联删除。如果你只想删除复制控制器,可以指定--cascade=false
。我们希望删除所有 Pod,因此只需输入:
kubectl delete my-rc
这样应该就能把所有东西都删掉了。运行一下kubectl get replicationcontroller
应该就没了。我们再运行一下kubectl get pods
,看看 Pod 也消失了没有。
让我们把另一个复制控制器也拿走,它在我的系统中挂了太长时间:
kubectl delete replicationcontroller my-rc
快速点击:
kubectl get pods
您将能够看到 Pod 被终止:
概括
在本文中,我们讨论了 YAML 文件格式、它是什么以及它是如何工作的。我们还讨论了如何使用 YAML 文件来配置我们的 Kubernetes 体验。此外,我们还演示了如何部署 Pod 以及如何部署 Kubernetes ReplicationControllers
。希望本文对您有所帮助,并让您体验真正的 Kubernetes 管理是什么样子。