《 Kubernetes进阶实战》一3.2.5资源对象管理方式
Kubernetes的API Server遵循声明式编程(declarative programming)范式而设计,侧重于构建程序程序逻辑而无须用户描述其实现流程,用户只需要设定期望的状态,系统即能自行确定需要执行的操作以确保达到用户期望的状态。例如,期望某Deployment控制器管理三个Pod资源对象时,而系统观察到的当前数量却是两个,于是系统就会知道需要创建一个新的Pod资源来满足此期望。Kubernetes的自愈、自治等功能都依赖于其声明式机制。
与此对应的另一种范式称为陈述式编程(imperative programming),代码侧重于通过创建一种告诉计算机如何执行操作的算法来更改程序状态的语句来完成,它与硬件的工作方式密切相关,通常,代码将使用条件语句、循环和类继承等控制结构。为了便于用户使用,Kubernetes的API Server也支持陈述式范式,它直接通过命令及其选项完成对象的管理操作,前面用到的run、expose、delete和get等命令都属于此类,执行时用户需要告诉系统要做什么,例如,使用run命令创建一个有着3个Pod对象副本的Deployment对象,或者通过delete命令删除一个名为myapp的Service对象。
Kubernetes系统的大部分API对象都有着spec和status两个字段,其中,spec用于让用户定义所期望的状态,系统从中读出相关的定义;而status则是系统观察并负责写入的当前状态,用户可以从中获取相关的信息。Kubernetes系统通过控制器监控着系统对象,由其负责让系统当前的状态无限接近用户所期望的状态。
kubectl的命令由此可以分为三类:陈述式命令(imperative command)、陈述式对象配置(imperative object conf?iguration)和声明式对象配置(declarative object conf?iguration)。第一种方式即此前用到的run、expose、delete和get等命令,它们直接作用于Kubernetes系统上的活动对象,简单易用,但不支持代码复用、修改复审及审计日志等功能,这些功能的使用通常要依赖于资源配置文件,这些文件也称为资源清单。在这种模式下,用户可以访问每个对象的完整模式,但用户还需要深入学习Kubernetes API。
如3.2.4节所述,资源清单本质上是一个JSON或YAML格式的文本文件,由资源对象的配置信息组成,支持使用Git等进行版本控制。而用户可以资源清单为基础,在Kubernetes系统上以陈述式或声明式进行资源对象管理,如图3-4所示。
陈述式管理方式包括create、delete、get和replace等命令,与陈述式命令的不同之处在于,它通过资源配置清单读取需要管理的目标资源对象。陈述式对象配置的管理操作直接作用于活动对象,即便仅修改配置清单中的极小一部分内容,使用replace命令进行的对象更新也将会导致整个对象被替换。进一步地,混合使用陈述式命令进行清单文件带外修改时,必然会导致用户丢失活动对象的当前状态。
声明式对象配置并不直接指明要进行的对象管理操作,而是提供配置清单文件给Kubernetes系统,并委托系统跟踪活动对象的状态变动。资源对象的创建、删除及修改操作全部通过唯一的命令apply来完成,并且每次操作时,提供给命令的配置信息都将保存于对象的注解信息(kubectl.kubernetes.io/last-applied-conf?iguration)中,并通过对比检查活动对象的当前状态、注解中的配置信息及资源清单中的配置信息三方进行变更合并,从而实现仅修改变动字段的高级补丁机制。
陈述式对象配置相较于声明式对象配置来说,其缺点在于同一目录下的配置文件必须同时进行同一种操作,例如,要么都创建,要么都更新等,而且其他用户的更新也必须反映在配置文件中,不然其更新在一下次的更新中将会被覆盖。因此,声明式对象配置是优先推荐给用户使用的管理机制。
然而,对于新手来说,陈述式命令的配置方式最易于上手,对系统有所了解后易于切换为使用陈述式对象配置管理方式。因此,若推荐给高级用户则推荐使用声明式配置,并建议同时使用版本控制系统存储所期望的状态,以及跨对象的历史信息,并启用变更复审机制。另外,推荐使用借助于kube-applier等一类的项目实现自动化声明式配置,用户将配置推送到Git仓库中,然后借助此类工具即能将其自动同步于Kubernetes集群上。
- 点赞
- 收藏
- 关注作者
评论(0)