DockOne微信分享(一三九):基于Kubernetes的应用编排实践

本文讲的是DockOne微信分享(一三九):基于Kubernetes的应用编排实践【编者的话】近年容器的使用越来越深入,越来越多的服务采用容器的方式进行部署。但随着服务数量的增加,如何管理服务之间的依赖关系,如何对多个服务之间的更新与部署进行管理,如何在新的环境中实现多个服务的快速部署。这些问题都希望通过基于Kubernetes应用编排管理来解决,从而实现对于复杂多服务系统的快速部署和高效管理。

【烧脑式Kubernetes实战训练营】本次培训理论结合实践,主要包括:Kubernetes架构和资源调度原理、Kubernetes DNS与服务发现、基于Kubernetes和Jenkins的持续部署方案 、Kubernetes网络部署实践、监控、日志、Kubernetes与云原生应用、在CentOS中部署Kubernetes集群、Kubernetes中的容器设计模式、开发Kubernetes原生应用步骤介绍等。

本次交流主要分享腾讯云容器服务基于Kubernetes在服务管理与应用编排领域的探索与实践。

为什么需要应用编排

“微服务”架构大家都知道,他具有开发效率高,扩展性好,稳定性好,维护简单等优点。越来越多的软件,开始采用微服务的方式进行开发和部署。

但任何事情都是有利有弊的,微服务架构有诸多好处。但微服务软件的部署和运维对传统的自动化运维体系提出了新的挑战。

微服务部署带来的挑战: 

  1. 服务数量急剧增多。比较常见的情况是,一个系统可能会被拆分成多达数十个微服务。如何管理一个系统中这么多的微服务,对于运维部署系统是一种挑战。
  2. 服务自身的配置问题。配置问题一直是服务管理中的难点。随着服务数量的增多,对服务配置的管理也提出了更高的要求。如何去管理诸多服务,不同环境中存在差异部分以及在系统运维阶段需要灵活变更的部分,这些都是服务配置管理中需要解决的问题。
  3. 服务依赖关系的管理。随着服务数量增加,服务依赖关系也变得更加复杂。
  4. 环境信息的管理,如何在多个环境中快速复制,如何在新的环境快速的部署一个复杂的系统。

由于服务数量的增多,同时需要多环境部署。采用原有对单个的服务进行部署和管理的方式,会出现一定的部署运维上的瓶颈。

而应用编排,通过应用模板,配置管理和服务组管理的方式。能够很好的简化微服务部署管理的复杂度,实现复杂系统在多个环境中的快速部署和高效管理。

开发,测试,预发布,正式环境多环境的管理,进一步加剧了微服务管理的复杂度。

但这些都可以通过应用编排得到简化,实现对系统的高效管理和快速部署(复制)。

Kubernetes社区应用编排发展现状

Kubernetes原生的方案中,基于服务粒度对系统组件进行管理,支持服务注册发现和路由管理。对于一个服务提供多种不同的资源描述类型,比较常用的有Deployment、Job、CronJob、Stateful、Daemonset。

每种类型都表示一种特定的部署方式。Kubernetes支持通过Yaml对服务的资源进行描述,也支持通过Label(标签)的方式对服务之间的关联关系进行管理。

随着服务数量的增多,描述一个系统需要组合使用大量的Kubernetes资源,这个过程会相当复杂。于是社区就可以引入可以在更高维度对资源进行描述的管理工具,将多个服务组合成应用进行描述和编排。

Kubernetes社区编排方案中,Helm基于Charts包的实现方案占主导地位。目前Helm已经成为kubernetes下应用编排的唯一子项目。推出Helm项目的Deis公司已经被微软收购。说明大家比较看好这个项目的未来。

上图是一个Chart包的示例,主要包括templates文件夹,values.yaml文件,Chart.yaml文件等部分。

Templates夹里面有含应用的多个服务资源描述的模版。资源描述的模板指的是在Kubernetes原始YAML的基础上,将GoTemplate的语法进行嵌入产生的一种描述文本形式。

Values.yaml 用来存储配置项,不同的环境可能会有不同的配置项。在Helm处理时候,会首先使用GoTemplate对Templates中的文件进行渲染,生成对应Kubernetes的资源文件。文件渲染的过程,本质上是一个变量替换的过程,使用values.yaml中变量的值替换掉Templates中预留的变量。

Chart.yaml是一个说明文件,描述chart包的一些基本信息。在某些Chart包中还会有requirements.yaml,requirements.yaml用于描述依赖的其他的。

上图是一个Charts包的示例,Helm Template文件支持的语法包括,基本语法:1、 {{.Value}}的方式来表示一个变量,支持基本的变量替换。2、支持{{.Release.Service}}等默认的内置变量。高级语法:1、支持分支语句;2、支持管道和函数处理等。

Kubernetes社区应用编排发展现状中存在的问题:原生Kubernetes仅支持通过服务和label进行管理,在服务数量较多的对服务的管理会比较困难。

Helm编排,更加侧重于包管理;语法复杂,学习成本高;不支持按照服务更新和管理;差异化比较功能弱。

考虑到社区方案中的一些问题,腾讯云容器服务参考社区Helm的实现形式,在容器服务中实现了完整的应用编排管理功能。

腾讯云容器服务编排服务主要分为配置管理,应用模板管理,基于应用的服务组管理几个主要部分。

配置管理:将应用中常变的值以变量的形式替代,配置项支持多版本,方便用户进行更新和回滚应用。

应用模板:包括多个服务的定义加一个默认配置,通过应用模板+配置项的组合,方便用户部署相同应用的不同环境。

应用:包括描述多个服务以及这些服务间的相互调用依赖关系 ,方便用户管理多个服务。

如上图所示使用应用模板对复杂系统中各个服务进行描述,通过配置项区分不同环境中差异化信息,从而实现在多环境中快速部署,快速回滚,环境快速复制。通过应用实例对服务进行分组,简化服务的管理。

配置管理的主要作用包括:

  1. 通过提取出多个环境中不同的部分,支持同一套系统在多个环境中部署。
  2. 提取出服务中经常变更的部分,实现服务的灵活变更。

    例如一般会将服务实例数量,实例的镜像tag提取成为一个配置项。修改这些参数时,修改对应的配置项就可以实现变更。并且通过配置文件的版本管理,可以很好的对变更进行追溯和回滚。

  3. 通过配置项,可以隐含的实现多个服务直接依赖关系的管理。例如:服务A需要访问服务B的,一般情况下依赖于服务B的名称。

    这种情况下,将服务B的名称提取成为一个配置项,而将配置项传递给服务A。这样在不同环境中,服务B名称的改变,服务A能自动感知,不需要单独修改服务A的参数。

配置管理的实现,我们支持三种:

  1. Helm的模板文件支持变量渲染
  2. Kubernetes的ConfigMap中环境变量方式
  3. Kubernetes的ConfigMap通过Volume方式进行数据填充

为了简化配置管理本身的复杂度,我们将三种配置管理都统一成了“Key/Value”形式。

在用户指定应用相对应的配置文件后,使用同一份配置文件,我们会先对应用的Template文件进行渲染,然后会进行环境变量替换。

最后会在Kubernetes中创建对应的ConfigMap资源,支持用户通过Volume的形式挂载ConfigMap中的Key。

这样做的好处是,没有多种形式的配置项形式,应用也不需要指定多个配置文件。应用在不同环境中的复制,只需关联对应的配置文件就可以了,不需要考虑配置文件的组合。

上图是腾讯云容器服务中配置管理操作的UI界面。配置管理支持多版本。应用的变更先修改配置,然后再通过配置触发对应的服务更新,这样对服务的更新实现规范化和可追溯。

后面我们还将实现通过配置项更新,自动触发服务的更新。可以结合CI/CD流程,通过CI编译生成新的镜像,修改配置项中镜像tag的参数,自动触发对应服务的更新。

应用模板用于描述一个或多个服务的定义,服务的定义支持原生的Yaml语法,但可以通过GoTemplate的方式定义对应的变量。

应用模板的主要作用包括:

  1. 实现应用的快速克隆。由于应用的相关信息已经通过对应的Template文件进行了描述,复制应用的过程只需要针对性的修改应用的配置,其他结构信息不需要进行改变。
  2. 应用的多环境部署。在多个环境中,实现应用的部署,也不需要关系每个服务具体的部署信息,只需要在不同环境下修改环境对应的配置,即可以通过应用模板实现在新环境应用的快速部署。
  3. 更高阶的功能,通过应用市场可以下载通用的模板,快速的部署应用。例如:在Helm(Charts)的应用市场https://kubeapps.com/,已经打包好了100+应用的模板文件。直接下载对应的应用模板就可以实现应用的部署。

上图是腾讯云容器服务中应用模板操作的UI界面。在应用模板中包含一个或者多个服务,一个服务对应于一个或者多个Kubernetes的资源。但建议将一个deployment,stateful,deamonset这样的资源,单独作为一个服务进行管理。

服务使用一个Template文件进行描述,服务的Template中的变量,通过一个统一的配置文件进行管理。

应用可以理解为多个服务的组合,多个服务会统一进行展示,服务支持按照应用进行搜索。多个服务的配置项,统一的通过同一个配置进行管理。通过服务组的方式,管理多个服务。可以简化多个服务管理的复杂度。

前面两张图是腾讯云容器服务中应用操作的UI界面。

应用中的服务支持单独编辑,部署和更新。同时服务支持差异化比较,方便用户查看两次修订之间的差异。

在服务编辑时,自动提取出对应的变量,简化配置的过程。支持服务回滚功能,支持服务回滚到上一个版本。

后期展望包括下面几个部分:

  1. 启动项管理,这个对应在启动上有先后顺序依赖的应用来说,是一个强诉求。目前Docker Compose支持通过depends_on标签实现多个组件间启动顺序的管理。

    Kubernetes目前还不支持指定启动顺序的,只能通过init_container,在实例容器启动前对依赖的服务进行检测,检测到依赖的服务启动后再启动相应的容器。

  2. 应用下的日志聚合,其实这里应该还包括监控数据聚合。这个需求应该是系统基于服务组管理后的一个延展诉求,可以进一步强化服务组管理的能力。
  3. 调用关系展示,这个需求进一步在应用中突出服务与服务之间的依赖关系。更进一步对于调用链的追踪也是一个强诉求。
  4. 公共模板与应用市场,这个是应用编排更高阶的一个形式。通过应用市场可以快速的实现通用软件的容器化部署。

Q&A

Q:腾讯云Kubernetes网络用的是哪个组件呢?

A:我们用的是全局路由的方式,直接和我们腾讯云的VPC网络打通。

Q:使用ConfigMap的时候,在配置修改完,需要重启服务。腾讯云容器服务配置文件的变更如何触发服务的重新启动?

A:通过触发器的模式,可以在修改配置时触发服务的更新。

Q:应用配置如何实现版本控制的?

A:对于每一个配置文件,我们支持每一次修改默认创建一个新的版本,具有唯一的版本号。

Q:应用里的服务具体要怎么更新呢?

A:一般建议的更新方法是,先修改配置,会生成配置的一个新的版本,这样这次修改在配置中是可以记录的。然后更新应用汇总配置文件的版本。触发或者手动更新对应的服务。在修改配置文件的版本后,我们会比较出哪些服务有变化,需要更新。

Q:外部访问集群是通过Nginx转发到Pod还是通过Kubernetes本来都DNS服务来转发,两者优缺点是什么?

A:外部访问,支持两种方式。一种是通过服务的LB直接转发到对应的Pod,但需要在创建服务时指定访问方式为外部访问(对应于Kubernetes中的LoadBanace方式)。另外一种是通过ingress的方式。这种方式会有一个统一的LB作为入口。然后配置对应的后端域名转发规则。可以将外部的访问按照配置的规则转发后端的服务。

Q:应用的扩容缩容通过什么监控,有什么指标可以参考?

A:自动扩容和缩容我们参考的是社区HPA的方案。指标目前考虑的是CPU和内存。

Q:状态化的容器怎么做的?

A:目前看到的有三种方式:一种是社区推荐的Stateful资源+headles service,另外一种是将服务的每一个实例拆分成独立的headless service ,第三种是采用CoreOS提出的operater方式。存储部分一般推荐使用PVC的方式,但有其他的存储方式也可以。

以上内容根据2017年08月22日晚微信群分享内容整理。如需了解更多,可以进入https://www.qcloud.com/product/ccs。 分享人颜卫,腾讯云容器服务研发工程师。专注于容器服务应用编排与微服务部署,现负责腾讯云容器服务应用编排产品的开发。 DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesa,进群参与,您有想听的话题或者想分享的话题都可以给我们留言。

原文发布时间为:2017-08-25

本文作者:颜卫

原文标题:DockOne微信分享(一三九):基于Kubernetes的应用编排实践

时间: 2024-11-01 01:12:53

DockOne微信分享(一三九):基于Kubernetes的应用编排实践的相关文章

DockOne微信分享(一二〇):基于Kubernetes的私有容器云建设实践

本文讲的是DockOne微信分享(一二〇):基于Kubernetes的私有容器云建设实践[编者的话]本次分享将为大家介绍易宝支付私有容器云从0到1的建设之路.包括技术选型.理论基础.基于Kubernetes的容器云和CI/CD落地过程中的挑战和踩过的坑. 建设背景及目标 在Docker技术流行开来之前,保证软件交付的质量和速度对于大多数企业来说都是困难的.业务的复杂性带来了应用的复杂性,面对成千上万的不同应用,运维部门需要时刻应对来自不同应用.不同环境的挑战.特别是在自动化运维程度不高的企业,"

DockOne微信分享(一零六):乐视云基于Kubernetes的PaaS平台建设

本文讲的是DockOne微信分享(一零六):乐视云基于Kubernetes的PaaS平台建设[编者的话]本次分享主要介绍乐视云两代PaaS平台的变迁过程,着重介绍第二代PaaS平台LeEngine的架构设计和遇到的问题. 背景 2014年乐视云开始尝试Docker的推广和使用,我们的团队开始开发第一代容器云平台Harbor (分享网址:http://dockone.io/article/1091 ).(在这里提醒一下,这与VMware公司中国团队为企业用户设计的Docker Registry e

DockOne微信分享(一零八):基于Jenkins和Kubernetes的CI工作流

本文讲的是DockOne微信分享(一零八):基于Jenkins和Kubernetes的CI工作流[编者的话]Jenkins作为最为流行的持续集成工具,在结合使用容器技术,Kubernetes集群的基础上,该如何发挥出新的能力,在应用微服务化的基础上,提供更好的CI方式,值得我们每一个开发人员去持续不断的摸索.本次分享主要介绍我司如何使用Jenkins Pipeline.Container和 Kubernetes Deployment的能力, 通过增加使用文本模版引擎, 扩展Kubernetes

DockOne微信分享(一四三):FreeWheel基于Kubernetes容器云构建与实践:应用编排与服务质量保证

本文讲的是DockOne微信分享(一四三):FreeWheel基于Kubernetes容器云构建与实践:应用编排与服务质量保证[编者的话]随着公司业务不断发展以及逐渐向微服务的转变,我们借助于Kubernetes容器化解决方案来标准化和简化应用发布的整个流程,使原来需要大量人工维护和干预的工作变为自动化.本次内容主要是FreeWheel现阶段基于Kubernetes容器化经验和实践的总结,目标是提供一个持续.稳定.高效的容器云平台. 服务健康检查与自我恢复 对线上业务来说,保证服务的正常稳定是重

DockOne微信分享(一四四):BizCloud:基于Kubernetes的私有云实践

[编者的话]随着搜狗业务的快速增长,需要更有效地控制成本,提升研发效率,我们基于Docker和Kubernetes构建了一站式私有云管理平台--BizCloud,此平台涵盖服务管理.弹性伸缩.灰度发布.自动运维.持续集成等功能.本文将简要介绍BizCloud的设计思路.架构及服务发现.授权.灰度发布等核心功能的实现. BizCloud简介 本文将的是DockOne微信分享(一四四):BizCloud:基于Kubernetes的私有云实践我们基础环境非常复杂,目前有多个版本操作系统共存,应用也常常

DockOne微信分享( 九十四):唯品会基于Kubernetes的网络方案演进

本文讲的是DockOne微信分享( 九十四):唯品会基于Kubernetes的网络方案演进[编者的话]本文主要介绍唯品会云平台PaaS在持续集成和持续部署方面,基于Docker和Kubernetes,对网络方案的选型及应用,以及随着业务需求的增加而经历的网络方案变更,包括: Kubernetes + Flannel: 基于Docker libnetwork的网络定制: Kubernetes + Contiv + kube-haproxy: 基于Kubernetes的应用容器IP固定方案. 背景简

DockOne微信分享(一三四):国内某大型酒店管理集团基于Kubernetes的实践

本文讲的是DockOne微信分享(一三四):国内某大型酒店管理集团基于Kubernetes的实践[编者的话]随着业务的增长,架构变得越来越复杂,服务器和应用数量越来越多,随之应用的管理,配置的管理,后期的运维都受到了极大的挑战.之前通过人工进行服务器配置,后期运维通过监控平台发现故障,人工恢复的模式已经无法适应业务的需求.我们借助Docker+Kubernetes打造的新的容器云平台,将之前90%以上需要人工维护部分的工作变成了自动化,一切变得so easy. [3 天烧脑式基于Docker的C

DockOne微信分享(九十六):爱油科技基于SpringCloud的微服务实践

本文讲的是DockOne微信分享(九十六):爱油科技基于SpringCloud的微服务实践[编者的话]本次分享主要介绍了爱油科技基于Docker和Spring Cloud将整体业务微服务化的一些实践经验,主要包括: 微服务架构的分层和框架选型 服务发现和配置管理 服务集成和服务质量保证 基于领域驱动设计 实施DevOps 从单体应用到微服务 单体应用 对于单体应用来说,优点很多,例如: 小而美,结构简单易于开发实现 部署门槛低,单个Jar包或者网站打包即可部署 可快速实现多实例部署 然而随着业务

DockOne微信分享(一三一):Juice——一种基于MesosFramework的任务云框架

本文讲的是DockOne微信分享(一三一):Juice--一种基于MesosFramework的任务云框架[编者的话]近年来,随着Mesos在生产环境中的普及,使大规模的集群管理变得简单,而基于MesosFramework开发的Juice框架,能够完成分布式任务的分发,处理,对于资源利用率的提高有很大的帮助,今天就为大家介绍一下这套框架. [3 天烧脑式容器存储网络训练营 | 深圳站]本次培训以容器存储和网络为主题,包括:Docker Plugin.Docker storage driver.D