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 控制器将为了满足 StatefulSet 规格而创建的 Pod。不同类型的对象也可以具有不同的 .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)