资源和对象
Kubernetes之上常用的资源,它把所有内容都抽象为资源,把资源实例化出来后称为对象。
Kubernetes核心资源:
- workload: 工作负载型资源,运行应用程序,对外提供服务。
Pod, ReplicaSet, Deployment, StatefulSet, DaemonSet, Job, Cronjob, … - 跟服务发现及均衡相关:
Service, Ingress, … - 配置与存储相关:
Volume, CSI:还支持容器存储接口来对接第三方存储卷, ConfigMap, Secret, DownwardAPI - 集群级的资源:上面提到的都是配置在名称空间级别的资源。只不过没指都是default名称空间的。而有些资源需要在集群级别定义。
Namespace, Node, Role, ClusterRole, RoleBinding, ClusterRoleBinding - 元数据型资源:
HPA:能够自动去调整其他资源的元数据信息。
PodTemplate, LimitRange
资源清单示例
在上一篇博文中,我们使用了命令去创建了一些资源。在创建这些资源时,除了使用命令去创建,还可以使用配置清单来创建。举例看看配置清单是什么样子的:
【说明】:
apiVersion: v1
指定该对象属于k8s的哪个api版本,或者叫api组。这叫api群组的名称和版本。我们给定apiversion时有两个部分组成,group/version。如果group省略,表示core,核心组,最根本的资源。
kind: Pod
资源类别,Pod、控制器、service都是资源。
metadata:
元数据。内部嵌套了很多二级字段,甚至三级字段来定义。
spec:
可以理解为“规格”。我们要去定义接下来要创建的资源对象应该具有什么样的特性,或者应该满足什么样的规范。比如说容器有几个,每个容器应该用什么镜像文件来创建。包括它的容忍度,能容忍哪些污点。这也是资源对象中一个最重要的字段,因为它正是用来定义我们所期望的资源应该拥有什么样的特性。而后靠控制器来确保它的特性能够被满足。
status:
spec用来让用户定义一个资源对象应该所处的目标状态。而status则是显示当前这个资源的当前状态。如果当前状态和目标状态不一样怎么办?应该以目标状态为准。k8s保证当前状态无限向目标状态靠近或转移从而能满足用户期望。因此从这个角度讲,status应该是只读的,因为会动态维护。而spec是用户定义的。
创建资源的方法
1.在定义资源时,apiserver仅接收JSON格式的资源定义;
之前通过kubectl run创建一个deployment的时候,run命令被自动把我们给的内容转成了JSON格式而已。但JSON格式写起来太重量级了,而yaml格式几乎没有冗余数据。人更容易理解和记忆的是yaml格式的。
2.提供yaml格式的配置清单
apiserver可自动将其转为JSON格式,而后在执行。JSON格式对于apiserver才是根本。
资源的配置清单详解
大部分资源的配置清单都有5个一级字段组成:
apiVersion: group/version
api版本。
资源所属群组,k8s把apiserver中所支持的api有多少种,分组来管理。
分组的好处是:如果不分组,假设将来要更新一个,牵一发而动全身。而现在分成组以后,如果某一组当中的改变了,我们只需要改这一个组就可以了,其他组不受影响,可以继续使用。另外,组还加了版本号,同一个群组的多个不同版本还可以并存。Pod是最核心的资源,所以属于核心群组v1。像控制器Deployment、ReplicaSet等属于应用程序管理的资源,属于群组apps/v1。在创建Deployment的时候,可以使用apps/v1,也可以使用apps/v1beta1,或者apps/v1beta2。如果某一组标记为beta,意味着属于公测版。不同的版本,对于同一个资源来讲,可支持的字段有可能是不一样的。
kind
资源类别
metadata
元数据
- name,对象名称
- namespace: 对象属于哪个名称空间的
- labels:标签
- annotation:资源注解
- uid:系统自己生成的,不要自己去定义。自己去定义有可能冲突。
- 每个资源的引用PATH:基于HTPP
/api/GROUP/VERSION/namespaces/NAMESPACE/TYPE/NAME
spec
期望的状态。disired state。
不同的资源类型,spec中所需要嵌套的字段不尽相同。字段这么多,我们可能无法全部记下来,可以通过命令行来查看文档。比如查看Pod清单定义文档:
status
资源当前状态,current state。
该字段由Kubernetes集群维护,用户不能定义和删除。
清单定义示例
|
|
【说明】:
- containers的值是个对象列表,列表我们使用 [] 或者 - 来引导。
容器名、容器镜像。一个pod内可以有多个容器。 - 对于busybox这个镜像启动起来运行的命令是shell,启动起来一会就挂了,所以需要需要额外改个命令来运行,使用command。command是个列表,可以使用[],也可以使用 - 来引导。对于第一个镜像没有加command,表示运行镜像启动后默认的命令。
访问myapp服务:
查看日志:
进入Pod中的myapp容器:
删除这个Pod:
|
|
再次创建这个Pod:
删除这个清单文件中定义的资源:
这个文件里定义的资源Pod是“自主式Pod”,不受任何控制器控制的,这种Pod一删除就没了。不像控制器控制的Pod,哪怕删了,也会根据副本数量进行重新创建。
kubectl管理资源的方式
有三种方式:
- 命令式
- 刚刚上面演示的配置清单式
- 第三种也是清单,但要使用另外的命令。和第二种方式的区别为:第二种叫命令式资源清单,第三种叫声明式资源清单。使用声明式,我们可以确保资源尽可能地像我们声明的状态改变,而且可以随时改变我们的声明,并随时应用。后面的博文中将介绍使用声明式方式创建资源。