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
字段的结构及其针对每种不同类型对象的內容。
注意
有关编写 YAML 配置文件的更多信息,请参阅 配置最佳实践。服务器端字段验证
从 Kubernetes v1.25 开始,API 服务器提供服务器端 字段验证,该验证检测对象中未识别的或重复的字段。它提供了服务器端 kubectl --validate
的所有功能。
kubectl
工具使用 --validate
标志来设置字段验证的级别。它接受值 ignore
、warn
和 strict
,同时也接受值 true
(等效于 strict
)和 false
(等效于 ignore
)。kubectl
的默认验证设置是 --validate=true
。
严格
- 严格的字段验证,在验证失败时出错
警告
- 执行字段验证,但错误作为警告而不是请求失败而显示
忽略
- 不执行服务器端字段验证
当 kubectl
无法连接到支持字段验证的 API 服务器时,它将回退到使用客户端验证。Kubernetes 1.27 及更高版本始终提供字段验证;旧的 Kubernetes 版本可能不支持。如果您的集群版本早于 v1.27,请查看 Kubernetes 版本的文档。
下一步
如果您是 Kubernetes 的新手,请详细了解以下内容
- Pod 是最重要的基本 Kubernetes 对象。
- Deployment 对象。
- 控制器 在 Kubernetes 中。
- kubectl 和 kubectl 命令。
Kubernetes 对象管理 解释了如何使用 kubectl
管理对象。如果您还没有,您可能需要 安装 kubectl。
要了解 Kubernetes API 的一般信息,请访问
要更深入地了解 Kubernetes 中的对象,请阅读本节中的其他页面