Last Updated on
系统学习kubernetes,请到《Kubernetes(k8s) 系列教程汇总篇》
k8s 对象是什么
在k8s集群中,k8s对象是集群中的持久性实体,k8s使用这些实体来表示集群的状态,具体来说,它们可以描述:
- 哪些容器化应用程序正在运行(以及在哪些节点上)
- 这些应用程序可用的资源
- 有关这些应用程序的行为的策略,例如重新启动策略,升级和容错等
k8s对象是表达你的意图的记录
,创建对象后,k8s系统将不断工作以确保该对象存在并保持为你期望的状态。
举个例子:
k8s 中的pod就是一个对象,可以表示你在集群中运行的容器,创建此pod后,可以根据你定义的pod的期望状态,比如定义了pod的资源限制不能占用超过多少的内存和cpu,那么k8s集群就会不停的工作以保证对象处在期望的状态,也就是资源占用在设置的限制内,如果超过限制,则会根据定义的策略进行pod的重启,以减少资源占用,使得pod一直保持在你的期望状态内。
在k8s中,k8s将所有资源都作为对象来进行管理。
像常见的如Pod,deplyment,secret,service等等等等,都是对象。
所在在k8s中部署应用,启动服务等操作,就可以理解为对相应对象的操作。
对象的描述
上面说了,在k8s里,一切都是对象,那么对象作为一个表达意图的记录,那么在创建对象时,必须提供描述对象的期望状态以及有关该对象的一些基本信息。
在k8s中对所有对象的操作,都是通过apiserver进行,所以我们可以通过kubectl命令行工具来操作对象。可以定义对象的yaml配置文件,然后使用kubbectl工具应用该配置文件,创建对象。
在创建对象时,有一些对象的基本信息是必要的,在你要创建的k8s对象的文件中,您需要为以下字段设置值:
-
apiVersion
:您正在使用哪个版本的Kubernetes API创建该对象 -
kind
:您要创建什么样的对象 -
metadata
:对象的元数据,用于唯一标识对象的数据,包括name
字符串UID
,和可选namespace
-
spec
:你对对象的期望状态
spec
在每个k8s对象中的实际设置格式都不同,并且包含特定于该对象的嵌套字段。这个在后面我们单独讲k8s中的特定对象时,再详细说明。
在这些必填字段中,metadata
是对象的元数据,用来区分相同类型的对象,非常重要,里面最常用的有三个字段:
-
name
:名称,群集中的每个对象都有一个对于该资源类型唯一的名称。 -
namespace
:命令空间,提供独立的名称范围,实现环境的隔离,同时方便进行区分和管理。创建集群后,会默认存在default
和kube-system
两个不可删除的默认命名空间。 -
labels
:标签,是附加到对象的键/值对,通过对对象打上标签,可以通过标签选择器来找到具有相同标签的对象。
这些都是对象的重要描述信息,下面列举一个Deployment对象的yaml文件配置,来方便大家理解,看看是如何配置的,也就是这个对象的描述:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
labels:
app: nginx-deployment
spec:
selector:
# 这里就是标签选择器,选择app: nginx的对象,也就是下面模版中设置了标签的pod,然后以选择到的这些pod作为副本数量控制器replicas的数量。
matchLabels:
app: nginx
# 这里定义了副本数量为2,所以通过上面标签选择器,选择到的pod数据应该为2,否则则会自动调度,增加或减少以达到此期望的状态。
replicas: 2
template:
# 这里设置Pod模版的元数据,里面打上app: nginx的标签
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
对象的管理
k8s中对于的对象的管理操作,可以通过kubectl命令行工具或者Dashboard的即界面进行,因为原理都一样都是通过的定义对象的描述,然后通过apiserver来记录对象的描述,将这个对象的描述信息存入etcd中来记录,然后根据记录来工作,以保证对象处于定义的期望状态。
那么在对对象的管理时,大致有如下三种方式:
- 命令式命令
- 命令式对象配置
- 声明式对象配置
命令式命令
命令式命令就是使用直接使用kubectl通过命令实现对象的创建,修改,删除等,如下,就是直接创建一个deployment对象:
kubectl create deployment nginx --image nginx
命令式对象配置
就是使用kubectl的命令,通过对象的yaml配置文件,实现对对象的操作,如:
# 通过文件来创建对象
kubectl create -f nginx.yaml
# 通过l文件来删除对象
kubectl delete -f nginx.yaml
# 通过文件覆盖对象的配置来更新对象
kubectl replace -f nginx.yaml
声明式对象配置
与上类似,也是通过对象的yaml配置文件来实现对象的操作,不同在于用户未定义要对该文件执行的操作,而是由k8s自行检测,不存在对象则创建,存在则覆盖更新。如:
kubectl apply -f nginx.yaml
这几种管理对象的方式中,命令式对象配置和声明式对象配置是最常用,也是最方便的。通过配置yaml文件,来实现对象的管理,这样在发现问题,排错故障时,能够有文件记录,且可以通过文件模版来实现类似对象的批量创建和修改等,方便使用脚本来操作k8s集群中的对象已完成目的。
总结
k8s的里将所有资源都抽象为了对象,对对象的控制也就是对这些资源的控制,这是一个抽象的概念,了解了这个概念后,方便我们后面理解和使用k8s。
这个就讲到这里,有任何疑问,欢迎留言交流。