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 spec 并启动您所需应用程序的三个实例——更新状态以匹配您的 spec。如果这些实例中的任何一个应该失败(状态更改),Kubernetes 系统会对 spec 和状态之间的差异做出响应,进行修正——在这种情况下,启动替换实例。

有关对象规范、状态和元数据的更多信息,请参阅 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 apply 命令在 kubectl 命令行界面中,将 .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 创建的所有对象的 spec 格式。

例如,请参阅 Pod API 参考的 spec 字段。对于每个 Pod,.spec 字段指定了 pod 及其期望状态(例如,该 pod 中每个容器的容器镜像名称)。对象规范的另一个示例是 spec 字段 的 StatefulSet API。对于 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)