动态详情

基于模板引擎的容器部署框架

2017-8-14 9:51:57 分类:技术博客

在大家使用容器的过程中,都会有一种经历,容器配置项众多大概有四五十项,且需要一定技术背景才能理解。部署过程中,用户常常会因为对于配置参数缺乏理解,导致容器启动,应用部署或者升级时遇到各种各样的问题。用户如何加快对不同参数的理解并且能够根据不同的应用类型和场景,做相应扩展,本文将重点要探讨和解决这些问题。

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

模板引擎

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

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

图1 模板引擎的执行原理

模板定义

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

以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所示:

图片描述

图2 模板解析器的工作原理

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

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

模板转化器

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

图片描述

图3 模板转化器的工作原理

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

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

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

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

apiVersion: v1 kind: Namespace metadata: name: ruffy

模板执行器

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

图片描述

图4 模板执行器的工作原理

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

图5

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