在Kubernetes系统中,Kubernetes对象是持久化的实体。Kubernetes使用这些实体去表示整个集群的状态。它们描述了如下信息:

  • 哪些容器化应用在运行(以及在哪个节点上)
  • 可以被应用使用的资源
  • 关于应用运行时表现的策略,比如重启策略、升级策略,以及容错策略

Kubernetes对象是“目标性记录”:一旦创建对象,Kubernetes系统将持续工作以确保对象存在。通过创建对象,本质上是在告知Kubernetes系统,所需要的集群工作负载看起来是什么样子的,这就是Kubernetes集群的期望状态(Desired State)。

操作Kubernetes对象,无论是创建、修改、或者删除,都需要调用Kubernetes API(kube-apiserver提供),关于Kubernetes API,后面章节再详细介绍。

Kubernetes对象属性(Spec和Status)

每个Kubernetes对象包含两个嵌套的对象字段,它们负责管理对象的配置:spec和status。

  • spec是必需的,它描述了对象的期望状态(Desired State):希望对象所具有属性的特征。
  • status描述了对象的实际状态(Actual State),它是由Kubernetes系统提供和更新的。在任何时刻,Kubernetes一直努力地管理着对象的实际状态以与期望状态相匹配。

例如,Kubernetes Deployment对象能够表示运行在集群中的应用。当创建Deployment时,可能需要设置Deployment的spec规约,以指定该应用需要有3个副本在运行。 Kubernetes系统读取Deployment规约,并启动我们所期望的该应用的3个实例:更新状态以与规约相匹配。 如果那些实例中有失败的(一种状态变更),Kubernetes系统通过修正来响应规约和状态之间的不一致:这种情况下,会启动一个新的实例来替换。我们下面来通过实际配置来更直观的了解它。

Kubernetes对象Spec配置示例

当创建Kubernetes对象时,必须提供对象的Spec规约,用来描述该对象的一些基本信息和期望状态。Kubernetes支持使用YAML格式文件描述你的对象Spec,下面是一个nginx服务的Deployment示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: apps/v1beta1    # API版本
kind: Deployment # 对象类型
metadata: # 对象唯一性元数据,如对象名称,UID,标签等均可以设置
name: nginx-deployment
spec: # spec规约
replicas: 3 # 副本集
template: # Pod模板
metadata: # 模板元数据
labels: # 标签
app: nginx
spec: # 模板spec规约
containers: # 容器配置
- name: nginx # 容器名
image: nginx:1.7.9 # 镜像
ports: # 端口配置
- containerPort: 80

kubectl是Kubernetes调用API的CLI命令,直接通过命令行创建如下:

1
2
[root@k8s-master ~]# kubectl create -f nginx-deployment.yaml
deployment "nginx-deployment" created

查看Deployment

1
2
3
[root@k8s-master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 10s

READY中"3/3",前面的3即是status,后面的3即为spec;所以可以看出部署正常。

必需字段

在想要创建的Kubernetes对象对应的.yaml文件中,需要配置如下的字段:

  • apiVersion - 创建该对象所使用的Kubernetes API的版本,参考
  • kind - 想要创建的对象的类型
  • metadata - 帮助识别对象唯一性的数据,包括一个name字符串、UID和可选的namespace

也需要提供对象的spec字段。对象spec的精确格式对每个Kubernetes对象来说是不同的,包含了特定于该对象的嵌套字段。详细可查阅对象对应的官方文档,或使用kubectl explain命令查询。