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
字段的结构,以及每种不同类型对象的内容。
注意
有关编写 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 中的对象,请阅读本节中的其他页面