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 和 status 之间的差异——在这种情况下,启动替换实例。
有关对象规范、状态和元数据,请参阅 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和可选的namespacespec- 你希望对象具有的状态
对象的 spec 的确切格式对于每个 Kubernetes 对象来说都不同,并且包含特定于该对象的嵌套字段。Kubernetes API 参考 可以帮助你找到可以使用 Kubernetes 创建的所有对象的 spec 格式。
例如,请参阅 Pod API 参考的 spec 字段。对于每个 Pod,.spec 字段指定 Pod 及其期望的状态(例如 Pod 中每个容器的容器镜像名称)。StatefulSet API 的另一个对象规范示例是 spec 字段。对于 StatefulSet,.spec 字段指定 StatefulSet 及其期望的状态。在 StatefulSet 的 .spec 中,有一个 模板 用于 Pod 对象。该模板描述了 StatefulSet 控制器为了满足 StatefulSet 规范而创建的 Pod。不同类型的对象也可能具有不同的 .status;同样,API 参考页面详细介绍了该 .status 字段的结构及其每个不同类型对象的内容。
有关编写 YAML 配置文件,请参阅 Kubernetes 配置最佳实践。
服务器端字段验证
从 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 中的对象,请阅读本节的其他页面