云计算虚拟化:一篇文章为你图解Kubernetes对象模型

来源:51cto2020-05-28 16:23:30

Kubernetes(以下简写为K8s)的对象模型是K8s又一精巧的设计。我们知道,K8s所建立的容器化生态是复杂且多变的,而对象模型就是将一系列的资源实体抽象成K8s中所能识别的对象。为了方便大家更全面的了解K8s的设计思想,本文对K8s的对象模型进行了梳理,同时在文章末尾增加了常见面试题问题汇总,章节内容分配如下:

K8s对象模型概述-我们为什么要了解对象模型 K8s常见对象模型介绍-哪些对象模型可以为我们所用 K8s对象模型的组织形式及yaml创建方法-我们该如何使用对象 总结

K8s对象模型概述-我们为什么要了解对象模型

这问题还用想?存在即合理呗。那咱们就先来看看他为什么存在。

在官方文档中,对K8s的对象模型有这样的定义:

“在 Kubernetes 系统中,Kubernetes 对象是持久化的实体。Kubernetes 使用这些实体去表示整个集群的状态。特别地,它们描述了如下信息:

哪些容器化应用在运行(以及在哪个 Node 上) 可以被应用使用的资源 关于应用运行时表现的策略,比如重启策略、升级策略,以及容错策略”

简单说来,对象模型主要有两点目标:

1.服务于K8s集群

对象模型一个功能是用以抽象化描述K8s集群状态,实体及实体间关联。此类的代表就是Label,它建立集群对象之间的灵活、松耦合的多维关联关系,我们可以用通过lable selector 查询和筛选建立对象间的关系的。

2.服务于用户。

K8s提供多种抽象对象便于用户部署自己的应用到集群中,这些抽象对象为用户屏蔽了复杂的底层逻辑,让用户更专注于如何去使用。此类的例子就比较多,比如Pod,Node,Deployment等。举个例子来说,比如我们要部署应用在8s集群内,首先要我们的应用需要转换为K8s所能管理的实体对象如Pod;对于多副本应用,我们需要考虑进行统一的管理,可以考虑如Deployment;进一步考虑副本间的负载均衡和服务发现,我们又可以考虑采用Service来实现,用户无需关注其内部实现,从而更专注于自身的应用。

K8s常见对象模型-哪些对象模型可以为我们所用

既然把K8s对象模型吹得这么神,那得看看他是不是真有这么神。下面来一起看看K8s常见的对象。

这里再用一幅图来更形象地介绍各个对象在K8s中的所处位置。

可以看到Deployment对象的Spec和Status描述结构。

再说yaml,对于不同的对象而言,yaml配置的内容有所不同,但以下几项是必选:

apiVersion   # 创建该对象所使用的 Kubernetes API 的版本  kind         # 想要创建的对象的类型  metadata    # 识别对象唯一性的数据,包括一个 name 字符串、UID 和可选的 namespace 

https://kubernetes.io/docs/api/)。下面我们对各资源的创建方式进行举例:

Workload类对象

Pod类资源我们使用经典案例——busybox的创建模板进行简述:

一篇文章为你图解Kubernetes对象模型

这则模板中首先指定了yaml的三要素,apiVersion、kind、metadata。在Pod特有的spec中指定了所需的镜像busybox,并简单设置了镜像拉取和容器重启的策略。在使用过程中我们会发现,简单的配置后,因镜像拉取或容器重启带来的异常管理问题,K8s都会帮你自动完成,也就是之前提到的对象的实际状态以与我们所期望的状态相匹配。

再举一个例子,经典的nginx模板用例:

一篇文章为你图解Kubernetes对象模型

Deployment用以描述一类Pod集合,因此这里指定了副本数,并设置了selector来简历Pod与Deployment的关系。

Discovery&Loadbalance类对象

这一类资源代表具备网络特性的对象,其中的代表对象就是Service,这里我们也列举一个Service的经典用例加以说明。

一篇文章为你图解Kubernetes对象模型

Service对象的yaml模板里,我们可以指定一个或一组Pod的通信端口及通信协议,并制定服务的暴露方式。

Config&Storage类对象

Configmap作为非持久化存储的代表,我们先举一个例子来说明:

一篇文章为你图解Kubernetes对象模型

Configmap的部署用例没有spec域,直接指定了数据的内容。除了以上使用yaml方式创建外,当我们将 ConfigMap 或者 Secret 包装成卷并挂载到某个目录时,我们其实是在创建 Volume,这些 Volume 并不是 Kubernetes 中的对象,它们只存在于当前 Pod 中,随着 Pod 的删除而删除,但是需要注意的是这些临时的Volume的删除并不会导致相关 ConfigMap 或者 Secret 对象的删除。

我们再举持久化存储的例子。

一篇文章为你图解Kubernetes对象模型

持久化存储的创建用例和Pod对象有些类似,需要制定存储的预期状态,这里设置了一个容量为1G,以可读可写方式挂载到多个节点,并使用nfs挂载的PV存储。这样在创建完成后,就可以使用PVC在Pod进行存储绑定了。

Cluster类对象

Cluster类对象多数属于集群集群资源对象,默认可不需要用户自己使用yaml创建,比如namespace就可以直接使用命令 kubectl create ns **** 来创建。这里我们举一个ClusterRole的yaml例子。

一篇文章为你图解Kubernetes对象模型

在这个例子中,我们定义了一个ClusterRole的对象,它可以授予对secrets资源对象的get,watch,list权限。接来下我们就是用ClusterRoleBinding来使用它。ClusterRoleBinding可以将角色中定义的权限授予用户或用户组,ClusterRoleBinding包含一组权限列表(subjects),权限列表中包含有不同形式的待授予权限资源类型(如USER,GROUP,SERVICEACCOUNT),ClusterRoleBinding适用于集群范围内的授权,与之相对应的RoleBinding适用于某个命名空间内授权。举例说明:

一篇文章为你图解Kubernetes对象模型

在这个用例中,我们将secret这个ClusterRole绑定到了dazhuang这个用户上,授权用户dazhuang只能访问myspace中的secret。

总结

K8s的对象模型是 K8s中非常重要的一部分,也是K8s构建的基础。K8s中各个对象为使用者屏蔽了复杂的底层细节,并通过不断获取集群的运行状态与期望状态进行对比,来帮助使用者确保对象能在预期的状态下运行,希望这篇文章能帮助各位读者更全面的理解K8s的对象模型。

 

责任编辑:云计算观察员

标签: 云计算 模型 对象 Kubernetes

相关文章

要闻

原创

最新

取消