大白话 K8S(02):深入浅出理解 K8S 中的资源对象

796

本篇作为系列第二篇,到底写什么内容,我也是纠结了挺久,观察过其他教程,大都是直接开始介绍 Pod 。

可以点此链接订阅该系列:《大白话 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 个部分:

  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 <type>.<fieldName>[.<fieldName>]

示例命令可以看图

metadata 和 spec 对象的字段非常多,多到一个屏幕放不到,使用命令可以计算一下:

  • metadata 的一级字段,有 16 个
  • spec 的一级字段,有 36 个

对象是可以嵌套的,也就是 spec 下的一级字段,还会有二级字段…

非常的恐怖,因此一个资源对象的配置文件,可以复杂到让你头皮发麻。

6. 最核心的字段有哪些?

可以看到上面的字段,实在是太多太杂了,一个对象尚且有这么多字段,那 K8S 中自带的资源对象还有几十个呢,再加一些第三方的自定义资源,学一辈子也学不完啊。

不过,你也不用担心,虽然字段很多,但不同的对象的结构大体相似,我们当前只需要把这些字段给掌握了就好。

至于那些低频的字段,就直接让他缺省就行,并不影响使用。

那对于新手来说, Pod 中有哪些字段,是新手需要掌握的呢?

以我的经验我总结了如下几个配置,是你入门 Pod 对象的一个基础,这些配置是一定要掌握的

至于具体的配置,都是什么意思,怎么用?并不是本文的重点,会在后面的文章中,一一介绍到。

7. 写在最后

到目前系列已经写了两篇了,自己写文章的思路,完全来源于我自己当初的学习路径,符合一个纯小白的知识背景,因为在一年前,我也是和你一样 K8S 小白。

当然,我也清楚,写文章不能一个人自嗨,要时刻接收读者朋友们的反馈,然后调不断整,是不是写得够清楚,在学习过程中有没有遇到什么问题?

因此请大家,无论是文章对你有启发,亦或者有写得不足之外,都不要藏着噎着,评论区给我一些正反馈吧,这是我写下去唯一的动力。

本文使用 文章同步助手 同步