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 格式)。当通过 HTTP 发出 API 请求时,诸如 kubectl 之类的工具会将清单中的信息转换为 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 - 你希望对象处于什么状态

每个 Kubernetes 对象的对象 spec 的确切格式都不同,并且包含特定于该对象的嵌套字段。 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

严格(Strict)
严格字段验证,如果验证失败则报错
警告(Warn)
执行字段验证,但错误会以警告的形式展现,而不是导致请求失败
忽略(Ignore)
不执行服务器端字段验证

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

下一步

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

Kubernetes 对象管理 解释了如何使用 kubectl 来管理对象。你可能需要安装 kubectl(如果你尚未安装)。

要了解关于 Kubernetes API 的概述,请访问

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

上次修改时间为太平洋标准时间 2024 年 8 月 25 日晚上 8:24: 重新排序概述页面 (42da717f16)