本文继续学习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 是一个对象,可以代表在您的集群上运行的应用程序。创建部署时,您可以将部署设置spec
为指定要运行应用程序的三个副本。Kubernetes 系统读取部署规范并启动所需应用程序的三个实例——更新状态以匹配您的规范。如果这些实例中的任何一个失败(状态更改),Kubernetes 系统会通过进行更正来响应规范和状态之间的差异——在这种情况下,启动一个替换实例。
有关对象规范、状态和元数据的更多信息,请参阅Kubernetes API 约定。
描述 Kubernetes 对象
当您在 Kubernetes 中创建对象时,您必须提供描述其所需状态的对象规范,以及有关该对象的一些基本信息(例如名称)。当您使用 Kubernetes API 创建对象(直接或通过kubectl
)时,该 API 请求必须将该信息作为 JSON 包含在请求正文中。大多数情况下,您kubectl
在 .yaml 文件中提供信息。 kubectl
在发出 API 请求时将信息转换为 JSON。
这是一个示例.yaml
文件,显示了 Kubernetes 部署所需的字段和对象规范:
application/deployment.yaml
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
使用上述.yaml
文件创建部署的一种方法是kubectl apply
在kubectl
命令行界面中使用该 命令,将该.yaml
文件作为参数传递。下面是一个例子:
kubectl apply -f https://k8s.io/examples/application/deployment.yaml --record
输出类似于:
deployment.apps/nginx-deployment created
必填字段
在.yaml
要创建的 Kubernetes 对象的文件中,您需要为以下字段设置值:
-
apiVersion
- 您使用哪个版本的 Kubernetes API 创建此对象 -
kind
- 你想创建什么样的对象 -
metadata
- 有助于唯一标识对象的数据,包括name
字符串UID
、 和可选namespace
-
spec
- 您希望对象处于什么状态
spec
每个 Kubernetes 对象的对象的精确格式都不同,并且包含特定于该对象的嵌套字段。该Kubernetes API参考可以帮助你找到所有你可以创建使用Kubernetes对象的规范格式。
例如,Pod 的参考详细说明了 API 中Pod 的spec
字段,而 Deployment 的参考详细说明了 Deployments 的spec
字段。在这些 API 参考页面中,您会看到提到 PodSpec 和 DeploymentSpec。这些名称是 Kubernetes 用于实现其 API 的 Golang 代码的实现细节。