模板引擎配置管理,一个可供参考的容器部署框架

0?wx_fmt=jpeg  
作者|李宁
编辑|木环
繁杂的部署配置  

在大家使用容器的过程中,都会有一种经历,容器配置项众多大概有四五十项,且需要一定技术背景才能理解。部署过程中,常常会因为使用者对配置参数缺乏理解,导致容器启动、应用部署或者升级时遇到各种各样的问题。如何加快对不同参数的理解并且能够根据不同的应用类型和场景,做相应扩展,是本文重点要探讨和解决的问题。本文重点讲述如何构建模板引擎,以及以模板引擎为核心构建容器部署框架的运行原理。

容器部署框架  

容器创建或者应用部署配置繁杂且存在变数,为了保证系统灵活性和复用性,我们决定模板引擎为核心,构建统一的容器部署框架。模板引擎中,符合一定格式规范的文件是基础,对于可能有变化或者根据部署流程需要变化的位置,使用参数标识站位。模板文件结尾追加参数标识的定义,用来执行参数标识语义转化。模板或者参数标识的具体内容,可以通过特定配置文件读取或者接收客户端请求参数。

模板引擎由模板定义、模板解析、模板转换、模板执行四个模块组成。模板定义依赖于容器集群的管理框架,是非可执行的文件。模板解析器负责把模板一分为二:一部分形成非可执行的部署模板;一部分形成部署模板中参数的定义说明,参数定义说明通过唯一的站位标识符与部署模板中的站位标识符一一对应。模板转换器接受参数值,结合解析器中生成的部署模板,参数值标识与模板中占位标识关联,参数值通过占位标识替换,生成可执行文件。模板执行器负责根据模板创建对象,一般有调度框架或者容器引擎承担。

模板引擎的执行原理如图 1 所示:

0?wx_fmt=jpeg

   模板定义

模板定义包括两类信息:部署模板;参数标识。

以 kubernetes 的部署模板为例,部署模板涉及到 4 种不同类型定义,分别是:资源,版本,信息说明,数据配置。

  • 资源表示 kubernetes 中定义的对象类型。

  • 版本表示对象的版本

  • 信息说明包括对象名称,标签,注释等,为对象查找或者调度提供索引。

  • 数据配置负责定义容器处于运行态遵循的标准,包括端口、环境变量、资源、调度、健康检查等。

参数标识由 6 个属性组成,分别是 parameters,name,description,displayname,value,type。

  • parameters:参数定义起始标志

  • description:参数的提示信息

  • displayname:具体语义信息

  • name:与引用参数名称对应,表示描述信息为对应的引用参数

  • value:参数默认值

  • type:代表不同的样式,客户端根据 type 类型,呈现具体样式

以 kubernetes 中的 namespace 对象为例,模板的完整定义如下代码所示:

apiVersion: v1
kind: Namespace
metadata:
  name: ${name }
---
{"parameters":
  [
    {
      "description": "命名空间",
      "displayName": "命名空间",
      "name": "name",
      "value": "",
      "type": "String"
    }
]}

由上述代码中,包含两部分内容:部署模板,参数说明。部署模板如下代码块所示:

apiVersion: v1
kind: Namespace
metadata:
  name: ${name }

部署模板定义对象创建的所有内容,模板中字段含义描述如下:

  • apiVersion:通用选项,定义版本信息

  • Kind:定义对象类型,区别不同的对象

  • Metadata:定义部署时指定的参数键值对

  • ${}: 表示参数的引用值,即可替代参数

参数标识,定义了客户端动态获取参数后的展现形态,下面代码示例参数标识定义:

{"parameters":
  [
    {
      "description": "命名空间",
      "displayName": "命名空间",
      "name": "name",
      "value": "",
      "type": "String"
    }
]}

参数标识定义统一的格式。通过语义转化,把繁杂的配置转变为用户易于理解的方式。客户端读取到 parameters 标识,通过模板解析器抽象可输入参数,展示需要的 form 表单,提供用户输入的功能。

模板定义由对 kubernetes 或者 docker 熟悉的专业人员编写。可以根据具体的业务场景,进行实时和动态调整,保证部署的灵活性和扩展性。同时,系统根据不同的对象,提供基础模板。用户在具备一定知识背景的基础上同样可以进行模板制作和维护。

   模板解析

模板解析器,通过输入输出流获取模板中参数标识,进行语义转化,得到易于理解的配置参数。模板解析器的工作原理如下图 2 所示:

0?wx_fmt=jpeg

客户端发起创建对象请求,服务端收到请求以后,会根据请求的对象类型自关联基础模板。通过文件流的方式,读取基础模板,读取过程中以 parameters 标志为起始点,获取参数描述信息。解析完成,参数以 JSON 串的方式返回客户端,客户端根据 JSON 串,动态生成需要用户填写的表单,用户根据表单内容完成参数输入操作。

模板解析器重点解析模板定义中的参数标识。通过语义转化,信息提示,形成易辨识的输入项。对用户而言,解析完成以后能够屏蔽繁杂的技术指标,用户的关心点由技术转变到业务配置。最大程度降低使用成本,增加易用性。

模板转化器  

模板转化器是模板引擎的核心,重点解决三个问题:获取部署模板,参数与值转换,构建可执行文件。客户端把模板解析器中参数赋予真实值,传递到服务端,服务端读取模版内容,遇到参数的标志位结束,把读取的内容通过文件流写到新文件,生成部署文件,接着用参数值对部署文件中的参数做关联替换,生成最终的可执行文件。模板转化器的工作原理如图 3 所示:

0?wx_fmt=jpeg

获取部署模板:由模板定义可知,模板中包含两部分内容:部署模板和参数标识。模板转化器首先需要部署模板,通过文件流的方式读取模板定义中的部署模板,读取过程中以 parameters 标识符分割,获取部署模板。

参数值转化:核心是解决参数与占位符关联和赋值问题。模板转换器通过模板参数定义的 name 属性 key 关联,模板转化器拿到参数值以后,获取参数值对应的 key(key 在部署模板唯一),并且根据 key,替换部署模板中占位标识,完成参数替换。

构建可执行文件:通过文件流的方式,把前两部转化的字符流输出到文件,构建出可执行文件。

模板转换器执行以后,生成的可执行文件如下所示:

apiVersion: v1
kind: Namespace
metadata:
name: ruffy
   模板执行器

模板执行器接收可执行的部署文件,对于文件中定义的部署类型进行解析,拆分成若干个可执行任务。容器引擎根据收到的任务执行操作,最终协同完成部署工作。模板执行器往往依赖于容器调度和执行引擎。以 kubernetes 容器编排框架为例,模板转化器生成的可执行文件,以字符流的方式传输到 kubernetes 的 server 端,kubernetes 根据传入文件,自动解析文件内容,并且做出相关操作。对于模板引擎而言,无论是 kubernetes 还是 swarmkit 都能够得到友好的支持。模板执行器的工作原理如图 4 所示:

0?wx_fmt=jpeg

模板执行器执行以后的结果如图 5 所示:

0?wx_fmt=png

写在最后  

通过模板引擎的方式,可以对容器的配置做灵活使用,无论是容器部署还是其他资源主题对象创建,都有对应模板支持。模板处理引擎不需要根据模板的变动而不断的修改代码。与此同时,用户可以从自己理解的语义关注配置信息,不需要关注具体技术细节和实现方式,简化操作行为,降低使用成本。

作者介绍  

李宁,BoCloud 博云高级架构师,BoCloud 博云核心产品 PaaS/DevOps 产品负责人,负责博云产品的规划、架构、研发等工作。

今日荐文

点击下方图片即可阅读

                           

         腾讯游戏容器云平台的技术演进之路


CNUTCon 全球运维技术大会将于 9 月 10-11 日在上海举行,大会以“智能时代的新运维”为主题,涵盖 AIOps、SRE、DevOps、运维监控与安全等专场,邀请了来自 Google、Uber、eBay、BAT 等公司大咖分享他们在最新运维技术实践过程中遇到的坑与经验,现场为你解疑答惑,点击“阅读原文”了解更多精彩!9 折限时优惠,报名时输入 CNUTCon666 还可再减 200 哦!

0?wx_fmt=jpeg
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值