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