K8S - 通过 YAML 或 JSON 文件创建 Pods

借助您在前几节中学到的信息,您现在可以开始创建 pod。您曾经使用过命令 kubectl create 创建了它们,但 pod 和其他 Kubernetes 对象通常是通过创建 JSON 或 YAML 清单文件并将其发布到 Kubernetes API 来创建的。

注意:

使用 YAML 还是 JSON 来定义对象由您决定。大多数人更喜欢使用 YAML,因为它更人性化,并且允许您向对象定义添加注释。

通过使用 YAML 文件来定义应用程序的结构,您不需要 shell 脚本来使部署应用程序的过程可重复,并且您可以通过将这些文件存储在 VCS(版本控制系统)中来保留所有更改的历史记录. 就像你存储代码一样。

为 Pod 创建一份 YAML 清单

创建一个名为 pod.kiada.yaml 的文件,内容为:

apiVersion: v1 # 这份清单使用 V1 版本的 API 去定义 API 对象
kind: Pod # 这个 API 对象 的 类型是 Pod
metadata:     
  name: kiada # Pod 的名称
spec: 
  containers: 
  - name: kiada
    image: luksa/kiada:0.1 # 容器镜像
    ports: 
    - containerPort: 8080 # 容器监听的端口

我相信你会同意这个 pod 清单比你在前一章看到的代表 Node 对象的庞大清单更容易理解。但是,一旦您将此 pod 对象清单发布到 API,然后将其读回,它不会有太大不同。

清单中的内容很短,只是因为它还没有包含 pod 对象在通过 API 创建后获得的所有字段。例如,您会注意到该 metadata 部分仅包含一个字段,并且该 status 部分完全缺失。从这个清单创建对象后,情况将不再如此。但我们稍后会谈到。

在创建对象之前,让我们详细检查清单。它使用 v1 Kubernetes API 的版本来描述对象。对象种类是Pod,对象名称是 kiada。pod 由一个容器组成,也称为 kiada,基于 luksa/kiada:0.1 图像。pod 定义还指定容器中的应用程序侦听端口 8080

注意

每当您想从头开始创建 pod 清单时,您还可以使用以下命令创建文件,然后对其进行编辑以添加更多字段:kubectl run kiada --image=luksa/kiada:0.1 --dry-run=client -o yaml > mypod.yaml. 该 --dry-run=client 标志告诉 kubectl 输出定义,而不是通过 API 实际创建对象。

YAML 文件中的字段是不言自明的,但如果您想了解有关每个字段的更多信息或想知道可以添加哪些其他字段,请记住使用该 kubectl explain pods 命令。

从 YAML 文件创建 Pod 对象

为 pod 准备好清单文件后,您现在可以通过将文件发布到 Kubernetes API 来创建对象。

通过将清单文件应用于集群来创建对象

当您将清单发布到 API 时,您是在指示 Kubernetes 将清单应用到集群。这就是为什么 kubectl 执行此操作的子命令称为 apply. 让我们用它来创建 pod:

kubectl apply -f pod.kiada.yaml
# output
pod "kiada" created

通过修改清单文件并重新应用它来更新对象

kubectl apply 命令用于创建对象以及对现有对象进行更改。如果您稍后决定对您的 pod 对象进行更改,您可以简单地编辑该 pod.kiada.yaml 文件并 apply 再次运行该命令。pod 的某些字段不是可变的,因此更新可能会失败,但您始终可以删除 pod 并重新创建它。您将在本章末尾学习如何删除 pod 和其他对象。

检索正在运行的 POD 的完整清单

pod 对象现在是集群配置的一部分。您现在可以使用以下命令从 API 中读取它以查看完整的对象清单:

> kubectl get po kiada -o yaml
> ```
>
> 如果您运行此命令,您会注意到清单与 `pod.kiada.yaml` 文件中的清单相比已大大增加。您会看到该 `metadata` 部分现在要大得多,并且该对象现在有一个 `status` 部分。该 `spec` 部分还增长了几个领域。您可以使用它 `kubectl explain` 来了解更多关于这些新领域的信息。

### 检查新创建的pod

在开始与在其中运行的应用程序交互之前,让我们使用基本`kubectl`命令来查看 pod 的运行情况。

#### 快速检查 Pod 的状态

你的 Pod 对象已经创建好了,但是你怎么知道 Pod 中的容器是否真的在运行呢?您可以使用 `kubectl get` 命令查看 pod 的摘要:

```sh
kubectl get pod kiada
# output
NAME     READY   STATUS    RESTARTS   AGE
kiada    1/1     Running   0          32s

您可以看到 pod 正在运行,但仅此而已。要查看更多信息,您可以尝试 kubectl get pod -o widekubectl describe 命令。

使用 kubectl describe 查看 pod 详细信息

要显示 pod 的更详细视图,请使用以下 kubectl describe 命令:

kubectl describe pod kiada
# output
Name:             kiada
Namespace:        default
Priority:         0
Service Account:  default
Node:             kind-worker2/172.19.0.2
Start Time:       Fri, 04 Nov 2022 15:09:54 +0800
...

该清单没有显示整个输出,但如果您自己运行该命令,您将看到几乎所有信息,如果您使用该 kubectl get pod kiada -o yaml 命令打印完整的对象清单时会看到这些信息。

检查事件以了解表面下发生的情况

与上一章使用 describe node 命令检查 Node 对象一样,该 describe pod 命令应在输出底部显示与 pod 相关的几个事件。

如果您还记得,这些事件不是对象本身的一部分,而是单独的对象。让我们打印它们以了解更多关于创建 pod 对象时发生的情况。这些是创建 pod 后记录的事件:

kubectl get events
LAST SEEN   TYPE      REASON                    OBJECT                    MESSAGE
6m46s       Normal    Scheduled                 pod/kiada                 Successfully assigned default/kiada to kind-worker2
6m15s       Normal    Pulling                   pod/kiada                 Pulling image "luksa/kiada:0.1"
6m30s       Warning   Failed                    pod/kiada                 Failed to pull image "luksa/kiada:0.1": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/luksa/kiada:0.1": failed to copy: httpReadSeeker: failed open: failed to do request: Get "https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/65/654c1214396e2d0b06cec4d1d8596a28f5d696b25b14273516982939af7f264c/data?verify=1667548800-JcD9imxJuPdaXfF80Ea9lU9bdjE%3D": net/http: TLS handshake timeout
6m30s       Warning   Failed                    pod/kiada                 Error: ErrImagePull
6m29s       Normal    BackOff                   pod/kiada                 Back-off pulling image "luksa/kiada:0.1"
6m29s       Warning   Failed                    pod/kiada                 Error: ImagePullBackOff
5m51s       Normal    Pulled                    pod/kiada                 Successfully pulled image "luksa/kiada:0.1" in 23.990394928s
5m51s       Normal    Created                   pod/kiada                 Created container kiada
5m51s       Normal    Started                   pod/kiada                 Started container kiada

这些事件按时间顺序打印。最近的事件位于底部。您会看到,首先将 pod 分配给其中一个工作节点,然后拉取容器映像,然后创建容器并最终启动。

如果没有显示警告事件,一切似乎都很好。如果您的集群不是这种情况,您应该阅读后续文章以了解如何解决 pod 故障。


好好学习,天天向上