2.1 认识 K8S 中的资源对象¶
在我看来,在学习 K8S 之前,有必要对 K8S 的资源对象有个全局的概念,他相当于房子的地基,是以后学习所有对象的根基。
1. 认识 K8S 资源对象¶
学习 K8S 首先最重要的是学习各种资源对象的功能,如何编写并创建他们。
那么第一个问题就来了,什么是 K8S 资源对象?
当你使用
kubectl api-resources
,就可以列出当前集群中所有的资源定义。
当前集群的资源数量达 73 种,随着你后面安装越来越多的插件后,这个数量会快速增长。
以 K8S 中的核心对象 Pod 为例,对这些字段做一些解释,首先是
APIVERSION:v1,对应 yaml 中的 apiVersion
KIND:Pod,对应 yaml 中的 kind
有了这两个,我们就可以编写 yaml 如下
# simple-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
你可以通过 kubectl apply -f simple-pod.yaml
去创建这个 Pod 对象。
创建完成之后,可以使用这两条命令查看刚才创建的 Pod 对象
kubectl get po:这里的 po 对应 SHORTNAMES
kubectl get pod:这里的 pod 对应 KIND
kubectl get pods:这里的 pod 对应 NAME
K8S 对大小写是不敏感的,ab、Ab、aB、AB 都是一样的,因此对于NAME 和 KIND,你可以大小写自由组合,都是没有问题的。
但唯独对于 SHORTNAMES 不可以,只能严格按照定义的小写来
上面以 Pod 为例介绍了 K8S 中的资源对象,其他常见的,还有 Deployment、ReplicaSet、Node、DaemonSet、Service 等等,都是需要掌握的,我会在后面的文章中一一介绍。
2. 如何创建一个对象?¶
创建一个资源对象的方式有好多种,从调用方式上可以分为两种:
调用 HTTP 接口:用于上层业务的开发
调用 client 命令:即 kubectl 命令行工具
目前对于刚学习的新手来说,kubectl 是熟悉各种资源对象最好的工具,后面我也都会使用它来演示。
使用了 kubectl,创建资源对象,又可以分为两种:
kubectl apply
kubectl create
这两种有什么区别呢?
kubectl create 是命令式 API,体现的是我要怎么样(创建)?
对于同一个 pod.yaml create 多次是会报错的,原因是 k8s 中资源名称必须是唯一的,而该名称的 pod 资源已经创建过了。
kubectl apply 是声明式 API,体现的是我要什么样?
对于同一个 pod.yaml apply 完全没有任何问题,若第二次 apply 之前,修改了 pod 中的一些内容,也会更新上去。
3. 花样创建资源对象?¶
从上面的演示来看,你是不是有了一个疑问:必须要有 yaml 文件才能创建对象吗?
答案是:并不是必须的。
你可以不用 yaml 文件,用 json 文件啊
或者连文件都省了,直接用标准输入啊
不过,不管用哪种方式,总归是要给出资源对象的具体配置,不给全配置,K8S 再神也没法读你的心啊。
4. 编写资源对象两个要素?¶
编写一个资源对象,形式虽然不重要,可以是 json,也可以是 yaml,但为了可读性和可维护性,通常会使用 yaml 格式。
想要编写一个资源对象的配置文件,只要你搞懂这两点,就可以一招吃遍天,而这些很少有人会这么教你。
第一点:学会 yaml 的基本格式
如今的 yaml,已经非常流行了,如果你至今还没有用过,那我这里只能建议你去花点简单学习一下语法格式,几分钟就能入门。
这个 yaml 的语法不是咱们的重点,具体的明哥就不再细说了。
第二点:知道配置文件的具体结构
很多教程在教你学习 k8s 对象的时候,都是直接扔给你一个 yaml 配置文件,告诉你用这个配置文件就能创建一个 xx 对象。
这就很离谱,教人吃鱼,不教人打渔。
因此明哥这边都尽量教给你最核心的知识,不仅告诉你这是什么,更要告诉你他怎么来的。
以一个 Pod 的配置文件为例,下面俩个配置文件,左边的配置文件只有区区的 12 行,而右边的配置文件却有 107 行。
内容相差甚远的两个配置文件,创建出来的 Pod 却是完全一样的,也就是说下面两个配置文件完全等价。
你可能想说,这也太不可思议了吧?
要是左边的这种,你还可以简单写一写,不费啥事,但要是右边这种,你还有这个信心嘛?
直接从入门到放弃了,卒~
那么多的字段,都代表啥意思,值的格式都是啥,是字符串还是列表?
一切都充满着未知,让人不知从何入手。
如何查询一个资源对象的配置文件结构,是一个新手必备的技能,请继续跟着我的节奏往下。
7. 查询配置文件的结构¶
kubectl 提供给我们一个命令 ,可以输出资源对应的属性字段及定义,它在定义资源配置文件时候非常有用。
以 Pod 为例,使用 kubectl explain pod
,就可以查看 pod
对象的一级字段都有哪些?
可以看到 Pod 的一级字段,主要分成 5 个部分:
apiVersion:api 版本,上面讲过可以通过 kubectl api-resources 查询,或者直接看 explain 的结果
kind:资源类型,上面讲过可以通过 kubectl api-resources 查询,或者直接看 explain 的结果
metadata:元信息,比如 name, namespace, label 和 annotation 等
spec:资源的具体配置,比如磁盘、网络、镜像等
status:存储一些正在运行的对象的一些状态信息
用户在定义一个资源对象的配置文件时, 只需要写前面 4 个部分,而无需定义 status 部分,因为它是由具体的程序去负责更新维护的,对于用户而言,它是只读的,不可写入。
即使你在配置文件中写了这部分内容,也会直接被忽略。
而对于前面 4 个部分:
前面两个字段 apiVersion 和 kind 都是简单字段,值是一个字段串
后面两个字段 metadata 和 spec 是复杂字段,值是一个 object 对象
一个 object 对象,又会包含 N 多的字段,使用 kubectl explain 可以查询二级对象的结构
kubectl explain <type>.<fieldName>[.<fieldName>]
示例命令可以看图
metadata 和 spec 对象的字段非常多,多到一个屏幕放不到,使用命令可以计算一下:
metadata 的一级字段,有 16 个
spec 的一级字段,有 36 个
对象是可以嵌套的,也就是 spec 下的一级字段,还会有二级字段…
非常的恐怖,因此一个资源对象的配置文件,可以复杂到让你头皮发麻。
6. 最核心的字段有哪些?¶
可以看到上面的字段,实在是太多太杂了,一个对象尚且有这么多字段,那 K8S 中自带的资源对象还有几十个呢,再加一些第三方的自定义资源,学一辈子也学不完啊。
不过,你也不用担心,虽然字段很多,但不同的对象的结构大体相似,我们当前只需要把这些字段给掌握了就好。
至于那些低频的字段,就直接让他缺省就行,并不影响使用。
那对于新手来说, Pod 中有哪些字段,是新手需要掌握的呢?
以我的经验我总结了如下几个配置,是你入门 Pod 对象的一个基础,这些配置是一定要掌握的
至于具体的配置,都是什么意思,怎么用?并不是本文的重点,会在后面的文章中,一一介绍到。
7. 写在最后¶
到目前系列已经写了两篇了,自己写文章的思路,完全来源于我自己当初的学习路径,符合一个纯小白的知识背景,因为在一年前,我也是和你一样 K8S 小白。
当然,我也清楚,写文章不能一个人自嗨,要时刻接收读者朋友们的反馈,然后调不断整,是不是写得够清楚,在学习过程中有没有遇到什么问题?
因此请大家,无论是文章对你有启发,亦或者有写得不足之外,都不要藏着噎着,评论区给我一些正反馈吧,这是我写下去唯一的动力。
帮助我完成这一个 讲人话 的 K8S 入门教程吧~