Kubernetes对象指的是Kubernetes系统的持久化实体,所有这些对象合起来,代表了你集群的实际情况。常规的应用里,我们把应用程序的数据存储在数据库中,Kubernetes将其数据以Kubernetes对象的形式通过 api server存储在 etcd 中。

具体来说,这些数据(Kubernetes对象)描述了:

  • 集群中运行了哪些容器化应用程序(以及在哪个节点上运行)
  • 集群中对应用程序可用的资源
  • 应用程序相关的策略定义,例如,重启策略、升级策略、容错策略
  • 其他Kubernetes管理应用程序时所需要的信息

一个Kubernetes对象代表着用户的一个意图,一旦您创建了一个Kubernetes对象,Kubernetes将持续工作,以尽量实现此用户的意图。创建一个 Kubernetes对象,就是告诉Kubernetes,您需要的集群中的工作负载是什么(集群的目标状态)。

对象的spec和status

每一个 Kubernetes 对象都包含了两个重要的字段:

  • spec 必须由您来提供,描述了您对该对象所期望的 目标状态
  • status 只能由 Kubernetes 系统来修改,描述了该对象在 Kubernetes 系统中的 实际状态

Kubernetes通过对应的控制器,不断地使实际状态趋向于您期望的目标状态。

描述Kubernetes对象

当您在 Kubernetes 中创建一个对象时,您必须提供

  • 该对象的 spec 字段,通过该字段描述您期望的 目标状态
  • 该对象的一些基本信息,例如名字

如果使用 kubectl 创建对象,您必须编写 .yaml 格式的文件

vim depolyment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # 运行 2 个容器化应用程序副本
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

必填字段:

  • apiVersion 用来创建对象时所使用的Kubernetes API版本
  • kind 被创建对象的类型
  • metadata 用于唯一确定该对象的元数据:包括 name 和 namespace,如果 namespace 为空,则默认值为 default
  • spec 描述您对该对象的期望状态

使用 kube apply 命令可以创建该 .yaml 文件中的 Deployment 对象:

kubectl apply -f deployment.yaml

输出结果:
deployment.apps/nginx-deployment created

使用 kubectl delete 命令可以删除该 .yaml 文件中的 Deployment 对象

kubectl detele -f deployment.yaml

管理对象

管理方式

管理方式操作对象优点缺点
指令性的命令行Kubernetes对象命令简单,易学易记;
只需要一个步骤,就可以对集群执行变更
使用命令,无法进行变更review的管理;
不提供日志审计;
没有创建新对象的模板
指令性的对象配置单个 yaml 文件与指令性命令行相比:
对象配置文件可以存储在源代码管理系统中,例如 git;
对象配置文件可以整合进团队的变更管理流程,并进行审计和复核;
对象配置文件可以作为一个模板,直接用来创建新的对象
与声明式的对象配置相比:
指令性的对象配置更简单更易于理解;
指令性的对象配置更成熟

与指令性命令行相比:
需要理解对象配置文件的基本格式;
需要额外编写 yaml 文件
与声明式的对象配置相比:
指令性的对象配置基于文件进行工作,而不是目录;
如果直接更新 Kubernetes 中对象,最好也同时修改配置文件,否则在下一次替换时,这些更新将丢失
声明式的对象配置包含多个 yaml 文件的多个目录与指令性的对象配置相比:
直接针对Kubernetes已有对象的修改将被保留,即使这些信息没有合并到配置文件中。
与指令性的对象配置相比:
声明式的对象配置可以支持多文件目录的处理,可以自动探测应该对具体每一个对象执行什么操作(创建、更新、删除)

指令性的命令行
当使用指令性的命令行(imperative commands)时,用户通过向 kubectl 命令提供参数的方式,直接操作集群中的 Kubernetes 对象。此时,用户无需编写或修改 .yaml 文件。
这是在 Kubernetes 集群中执行一次性任务的一个简便的办法。由于这种方式直接修改 Kubernetes 对象,也就无法提供历史配置查看的功能。

创建一个nginx实例

kubectl create deployment nginx --image nginx

指令性的对象配置
使用指令性的对象配置(imperative object configuration)时,需要向 kubectl 命令指定具体的操作(create,replace,apply,delete等),可选参数以及至少一个配置文件的名字。配置文件中必须包括一个完整的对象的定义,可以是 yaml 格式,也可以是 json 格式。

通过文件创建/删除/替换对象

kubectl <create|delete|replace> -f 文件名.yaml

声明式的对象配置

当使用声明式的对象配置时,用户操作本地存储的Kubernetes对象配置文件,然而,在将文件传递给 kubectl 命令时,并不指定具体的操作,由 kubectl 自动检查每一个对象的状态并自行决定是创建、更新、还是删除该对象。使用这种方法时,可以直接针对一个或多个文件目录进行操作(对不同的对象可能需要执行不同的操作)。
声明式对象配置将保留其他用户对Kubernetes对象的更新,即使这些更新没有合并到对象配置文件中。因为当Kubernetes中已经存在该对象时,声明式对象配置使用 patch API接口,此时会把变化的内容更新进去,而不是使用 replace API接口,该接口替换整个 spec 信息。

处理 configs 目录中所有配置文件中的Kubernetes对象,根据情况创建对象、或更新Kubernetes中已经存在的对象。可以先执行 diff 指令查看具体的变更,然后执行 apply 指令执行变更:

kubectl diff -f configs/
kubectl apply -f configs/

递归处理目录中的内容:

kubectl diff -R -f configs/
kubectl apply -R -f configs/