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:命令空间,提供独立的名称范围,实现环境的隔离,同时方便进行区分和管理。创建集群后,会默认存在defaultkube-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。

这个就讲到这里,有任何疑问,欢迎留言交流。