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