# 了解 k8s 对象

k8s 对象是 k8s 系统中的持久实体。k8s 使用这些实体来表示集群的状态。具体来说,他们可以描述:

  • 容器化应用正在运行(以及在哪些节点上)
  • 这些应用可用的资源
  • 关于这些应用如何运行的策略,如重新策略,升级和容错

k8s 对象是“record of intent”,一旦创建了对象,k8s 系统会确保对象存在。通过创建对象,可以有效地告诉 k8s 系统你希望集群的工作负载是什么样的。

要使用 k8s 对象(无论是创建,修改还是删除),都需要使用 k8s API。例如,当使用 kubectl 命令管理工具时,CLI 会为提供 k8s API 调用。你也可以直接在自己的程序中使用 k8s API,k8s 提供一个 golang 客户端库 (其他语言库正在开发中-如 Python)。

# 对象(Object)规范和状态

每个 k8s 对象都包含两个嵌套对象字段,用于管理 Object 的配置:Object Spec 和 Object Status。Spec 描述了对象所需的状态 - 希望 Object 具有的特性,Status 描述了对象的实际状态,并由 k8s 系统提供和更新。

例如,通过 k8s Deployment 来表示在集群上运行的应用的对象。创建 Deployment 时,可以设置 Deployment Spec,来指定要运行应用的三个副本。k8s 系统将读取 Deployment Spec,并启动你想要的三个应用实例 - 来更新状态以符合之前设置的 Spec。如果这些实例中有任何一个失败(状态更改),Kuberentes 系统将响应 Spec 和当前状态之间差异来调整,这种情况下,将会开始替代实例。

有关 object spec、status 和 metadata 更多信息,请参考“k8s API Conventions”。

# 描述 k8s 对象

在 k8s 中创建对象时,必须提供描述其所需 Status 的对象 Spec,以及关于对象(如 name)的一些基本信息。当使用 k8s API 创建对象(直接或通过 kubectl)时,该 API 请求必须将该信息作为 JSON 包含在请求 body 中。通常,可以将信息提供给 kubectl .yaml 文件,在进行 API 请求时,kubectl 将信息转换为 JSON。

以下示例是一个.yaml 文件,显示 k8s Deployment 所需的字段和对象 Spec:

nginx-deployment.yaml
apiVersion: apps/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80

使用上述.yaml 文件创建 Deployment,是通过在 kubectl 中使用 kubectl create 命令来实现。将该.yaml 文件作为参数传递。如下例子:

$ kubectl create -f docs/user-guide/nginx-deployment.yaml --record

其输出与此类似:

deployment "nginx-deployment" created

# 必填字段

对于要创建的 k8s 对象的 yaml 文件,需要为以下字段设置值:

  • apiVersion - 创建对象的 k8s API 版本
  • kind - 要创建什么样的对象?
  • metadata- 具有唯一标示对象的数据,包括 name(字符串)、UID 和 Namespace(可选项)

还需要提供对象 Spec 字段,对象 Spec 的精确格式(对于每个 k8s 对象都是不同的),以及容器内嵌套的特定于该对象的字段。k8s API reference 可以查找所有可创建 k8s 对象的 Spec 格式。

Last Updated: 4/15/2023, 8:33:17 PM