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