Kubernetes 中的对象

Kubernetes 对象是 Kubernetes 系统中的持久化实体。Kubernetes 使用这些实体来表示集群的状态。了解 Kubernetes 对象模型以及如何使用这些对象。

本页面解释了 Kubernetes 对象如何在 Kubernetes API 中表示,以及如何以 .yaml 格式表示它们。

理解 Kubernetes 对象

Kubernetes 对象是 Kubernetes 系统中的持久化实体。Kubernetes 使用这些实体来表示集群的状态。具体来说,它们可以描述

  • 正在运行哪些容器化应用程序(以及在哪些节点上运行)
  • 这些应用程序可用的资源
  • 有关这些应用程序行为方式的策略,例如重启策略、升级和容错

Kubernetes 对象是“意图记录”——一旦创建了对象,Kubernetes 系统就会不断工作以确保该对象存在。通过创建对象,你实际上是在告诉 Kubernetes 系统你希望集群的工作负载是什么样子的;这就是集群的期望状态

要使用 Kubernetes 对象(无论是创建、修改还是删除它们),都需要使用 Kubernetes API。例如,当你使用 kubectl 命令行界面时,CLI 会为你发出必要的 Kubernetes API 调用。你也可以使用 客户端库 之一,在自己程序中直接使用 Kubernetes API。

对象规约和状态

几乎每个 Kubernetes 对象都包含两个嵌套的对象字段,用于控制对象的配置:对象 spec 和对象 status。对于具有 spec 的对象,你必须在创建对象时设置它,提供你希望资源具有的特征的描述:它的期望状态

status 描述了对象的当前状态,由 Kubernetes 系统及其组件提供和更新。Kubernetes 控制平面 会持续主动地管理每个对象的实际状态,以匹配你提供的期望状态。

例如:在 Kubernetes 中,Deployment 是一个可以表示在集群上运行的应用程序的对象。当你创建 Deployment 时,你可能会设置 Deployment spec 以指定你希望运行三个应用程序副本。Kubernetes 系统读取 Deployment 规约并启动你期望应用程序的三个实例——更新状态以匹配你的规约。如果其中任何一个实例发生故障(状态更改),Kubernetes 系统会通过进行更正来响应规约和状态之间的差异——在本例中,启动一个替换实例。

有关对象规约、状态和元数据的更多信息,请参阅 Kubernetes API 约定

描述 Kubernetes 对象

在 Kubernetes 中创建对象时,你必须提供描述其期望状态的对象规约,以及有关该对象的一些基本信息(例如名称)。当你使用 Kubernetes API 创建对象时(直接或通过 kubectl),该 API 请求必须在请求体中包含作为 JSON 的信息。大多数情况下,你将在名为 清单 的文件中向 kubectl 提供信息。按照惯例,清单是 YAML(你也可以使用 JSON 格式)。kubectl 等工具在通过 HTTP 发出 API 请求时,会将信息从清单转换为 JSON 或其他受支持的序列化格式。

下面是一个示例清单,展示了 Kubernetes Deployment 的必需字段和对象规约

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

使用上述清单文件创建 Deployment 的一种方法是使用 kubectl 命令行界面中的 kubectl apply 命令,将 .yaml 文件作为参数传递。下面是一个例子

kubectl apply -f https://k8s.io/examples/application/deployment.yaml

输出类似于以下内容

deployment.apps/nginx-deployment created

必填字段

在你想要创建的 Kubernetes 对象的清单(YAML 或 JSON 文件)中,你需要为以下字段设置值

  • apiVersion - 你用于创建此对象的 Kubernetes API 版本
  • kind - 你想要创建的对象类型
  • metadata - 帮助唯一标识对象的数据,包括 name 字符串、UID 和可选的 namespace
  • spec - 你希望对象处于什么状态

对象 spec 的精确格式对于每个 Kubernetes 对象都是不同的,并且包含特定于该对象的嵌套字段。Kubernetes API 参考 可以帮助你找到可以使用 Kubernetes 创建的所有对象的规约格式。

例如,请参阅 Pod API 参考中的 spec 字段。对于每个 Pod,.spec 字段指定 Pod 及其期望状态(例如该 Pod 中每个容器的容器镜像名称)。对象规约的另一个例子是 StatefulSet API 的 spec 字段。对于 StatefulSet,.spec 字段指定 StatefulSet 及其期望状态。StatefulSet 的 .spec 中包含 Pod 对象的 模板。该模板描述了 StatefulSet 控制器将创建的 Pod,以满足 StatefulSet 规约。不同类型的对象也可以有不同的 .status;同样,API 参考页面详细介绍了 .status 字段的结构,以及每种不同类型对象的内容。

服务器端字段验证

从 Kubernetes v1.25 开始,API 服务器提供服务器端 字段验证,可以检测对象中无法识别或重复的字段。它在服务器端提供了 kubectl --validate 的所有功能。

kubectl 工具使用 --validate 标志来设置字段验证级别。它接受值 ignorewarnstrict,同时还接受值 true(等效于 strict)和 false(等效于 ignore)。kubectl 的默认验证设置为 --validate=true

严格
严格的字段验证,验证失败时报错
警告
执行字段验证,但错误作为警告公开,而不是使请求失败
忽略
不执行服务器端字段验证

kubectl 无法连接到支持字段验证的 API 服务器时,它将回退到使用客户端验证。Kubernetes 1.27 及更高版本始终提供字段验证;较旧的 Kubernetes 版本可能不支持。如果你的集群版本低于 v1.27,请查看你的 Kubernetes 版本的文档。

下一步

如果你是 Kubernetes 新手,请阅读以下内容了解更多信息

Kubernetes 对象管理 解释了如何使用 kubectl 管理对象。如果你还没有 安装 kubectl,则可能需要安装。

要全面了解 Kubernetes API,请访问

要更深入地了解 Kubernetes 中的对象,请阅读本节中的其他页面

上次修改时间:2024 年 5 月 28 日下午 5:43 PST:语法修复 (58c857e74c)