DockOne微信分享(七十九):基于容器技术构建企业级PaaS云平台实践

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文讲的是DockOne微信分享(七十九):基于容器技术构建企业级PaaS云平台实践【编者的话】企业级容器化PaaS平台旨在为企业应用提供底层支撑能力,覆盖应用开发、应用交付、上线运维等环节,包括代码的管理、持续集成、自动化测试、交付物管理、应用托管、中间件服务、自动化运维、监控报警、日志处理等,本次分享主要介绍基于容器技术构建PaaS平台所采用的相关技术、涉及的核心功能模块以及相关方案。
本文讲的是DockOne微信分享(七十九):基于容器技术构建企业级PaaS云平台实践【编者的话】企业级容器化PaaS平台旨在为企业应用提供底层支撑能力,覆盖应用开发、应用交付、上线运维等环节,包括代码的管理、持续集成、自动化测试、交付物管理、应用托管、中间件服务、自动化运维、监控报警、日志处理等,本次分享主要介绍基于容器技术构建PaaS平台所采用的相关技术、涉及的核心功能模块以及相关方案。

为满足以上需求,MoPaaS企业版基于Cloud Foundry及Kubernetes等开源技术框架和智能化云平台专利技术来构建。 此外,平台提供各种标准化或非标准的运行环境以及各种运维管理功能,用户可以在秒级按需获取各类资源和环境,平台最大的价值在于解放开发、测试、运维人员,降低用户对应用软件的交付成本及时间。

MoPaaS企业版由Cloud Foundry提供标准运行环境、标准中间件服务接入方式、认证授权、软路由、组织管理、资源分配等功能。但Cloud Foundry新的运行时Diego虽然支持运行Docker镜像,但是功能相对较弱,并且运行在Diego中的应用架构必须符合一定的标准。MoPaaS 企业版 使用Kubernetes来提供对非标准运行环境及中间件服务的支持;所以对于不符合Cloud Foundry架构标准的应用,可以方便地运行到Kubernetes 的环境中。这样,MoPaaS企业云平台相对比较灵活,对应用运行环境和应用架构没那么多限制,所以一些老的应用迁移至云平台变得非常容易。MoPaaS管理Cloud Foundry和Kubernetes资源,进行统一的管理和调度。

MoPaaS平台助力用户根据业务需要实现计算资源的动态调配和应用的快捷交付,特别是帮助用户显著节省 IT 支出和应用提供的成本,缩短应用上线时间以及简化IT和应用的管理。此外,作为用户持续创新数字平台以及业务连续性的保证,MoPaaS也帮助企业用户有效地应对市场的变化,通过持续创新不断保持市场竞争力。

MoPaaS平台(企业版)总体架构如下:
001.jpg

应用运行环境和中间件服务

002.jpg

应用运行环境和中间件服务是PaaS平台的核心功能模块,用户发布应用至平台时,只需发布应用本身,应用所依赖的操作系统、软件环境、中间件服务等都由平台提供,通过自动化方式配置和部署。

应用运行环境

PaaS平台需要支持不同类型的应用,应用架构及所依赖的软件环境各有不同。MoPaaS平台目前支持三大类应用运行环境,以及三种应用发布方式。

三类应用运行环境包括:
  1. 基于Cloud Foundry的标准运行环境
    标准运行环境由平台预先制作好,优化相关配置后提供给用户使用,适合对环境没有个性化要求的应用,用户无需自己制作运行环境和进行相关配置,申请标准运行环境后,只需要将可执行包推送至平台即可。
    • 多语言和框架:覆盖Go、Ruby、Python、Java、JS、PHP的多语言运行及框架
    • 语言和框架的扩展机制和BuildPack扩展
    • 服务插件及扩展机制:提供多种基础,如代码托管(Git)、数据库(MySQL、PostgreSQL、MongoDB)、缓存(Redis和MemCached)、消息队列(RabitMQ等)、Jenkins,以及众多的第三方服务扩展
  2. 基于Docker的MoPaas镜像
    MoPaaS镜像,适合对环境配置有个性化要求的应用,用户可以基于MoPaaS基础镜像构建自己的应用镜像来运行,构建时还可以修改基础镜像配置。通过MoPaaS镜像运行环境可以节省用户构建基础镜像的时间,通过用户自定义应用镜像,支持更多的应用类型运行至MoPaaS平台中。
  3. 基于Docker的自定义镜像
    自定义镜像需要用户自行制作运行环境,由用户在本地制作完成镜像后推送至平台运行,自定义镜像方式所有环境完全由用户自己定义,相对比较灵活,可以完全满足用户的个性化需求。

三种应用发布方式:
  1. 可执行包发布(war、zip)
    用户首先需在本地将应用编译打包成可执行包,然后在平台上申请运行环境和中间件服务,通过Web UI或命令行操作将可执行包推送至平台,平台接收到可执行包后会将其Build成一个应用镜像后发布到平台运行。
  2. 源码发布
    用户将代码提交至平台的Git源码仓库或者平台应用关联的一个Git源码仓库,通过手动或者自动触发一个持续集成流程后将应用Build成镜像后发布到平台运行。
  3. 镜像发布
    用户将自己制作的镜像推送到MoPaaS平台发布。

中间件服务

中间件服务是应用运行必不可少的软件资源,比如数据库,平台通过两种方式提供中间件服务:
  1. 平台内部提供的中间件服务
    平台内部提供的中间件服务以容器方式运行,目前运行在Kubernetes,可提供集群或主从方式保证中间件服务的高可用性。中间件服务运行在容器跟应用很大的不同是,我们可以要求应用在设计时尽量无状态,但是大部分中间件是需要在本地存储数据的,不可能是无状态的,因此在容器中运行中间件服务的关键是要解决数据本地存储的问题,目前Kubernetes支持多种PersistenceVolume,可以将数据存储到外挂的网络存储服务上来解决这个问题。
  2. 平台接入外部提供的中间件服务
    有些第三方中间件服务暂时不适合运行到容器,特别是第三方提供的中间件,比如Oracle,或者有专门的运维团队运维,像这样的中间件可以独立于平台部署,通过比较松耦合的方式接入到平台供用户使用。具体方案如下:
    003.jpg

应用外部接入方式

部署在Diego或Kubernetes上的应用,都是以容器方式运行,容器会被调度和管理,因此我们访问应用时,不能直接访问容器的IP+Port。

Cloud Foundry将容器的IP+Port动态更新至Route管理的路由表实现外部接入,默认支持HTTP(S) 协议。Kubernetes的Service能够提供很强大的功能,通过提供ClusterIP作为Pod的对外访问接口,并提供软负载均衡。但是Service的Cluster IP地址只能在集群内部访问,可以通过NodePort方式对外暴露服务。一旦采用NodePort,整个集群的所有节点都可以通过指定的端口访问到应用。

如果需要域名访问这个应用的话,只需要将Kubernetes节点的IP+NodePort注册到Route的路由表中实现。如果应用需要支持TCP协议访问,对于Diego管理的容器可以将容器IP+Port动态更新到前端负载均衡。对于Kubernetes,将集群的节点IP+NodePort动态更新至前端负载均衡。实现原理如下:
004.jpg

MoPaaS平台提供独立的 Router Proxy 模块,动态加载路由表,支持TCP 和 HTTP 的负载均衡,域名映射灵活,可快速变更。
005.jpg

CI/CD在PaaS平台中的应用

平台集成了Git作为源码管理仓库,当用户在平台上新建一个应用时,自动会为此应用分配一个Git仓库。应用也可以关联平台外部的Git仓库,源码仓库一旦和应用关联之后,就可以实现将源代码自动发布至平台运行的整个流程。

发布之前需要经过一个持续集成流程,持续集成流程可以预先定义,不同的交付团队可能会有差异,只有所有阶段都通过才能发布成功。在开发测试阶段,可以开启自动构建功能,当代码发生变更时自动触发构建流程,并及时反馈集成状态和结果。

功能截图如下:
006.jpg

平台通过Jenkins配置整个持续集成流程,整个流程由代码质量检查、单元测试、构建、部署等几个阶段组成。当触发部署时,先判断当前应用在Jenkins平台上是否已经创建对应的持续任务,如果已经存在的话就触发第一个任务,如果不存在则创建这些任务。每一个任务成功执行才会触发下一个任务的执行,组成持续集成流程的所有任务执行过程。任务执行过程中的启动、成功、失败等状态会通过Webhook反馈给平台,平台会记录这些状态,并根据执行结果改变执行流程。

实现原理如下:
007.jpg

持续集成可以帮助我们频繁地、自动化地构建应用软件,构建完成后需要将应用发布到平台运行。随着频繁的发布应用到生产环境,风险也会随之增加。所以要做到持续发布,需要通过灰度发布、回滚等机制保证发布过程的安全性。

MoPaaS平台支持灰度发布和应用回滚策略,实现应用发布的平滑过渡,保证系统整体的稳定性,避免频繁发布对用户所造成的影响。

实现原理如下:
008.jpg

上线流程原理如下:
009.jpg

弹性伸缩与自动化运维

弹性伸缩

MoPaaS平台提供两种方式实现弹性伸缩:手动和自动。

用户可以根据自己的需求,设置相关的定时或周期性的策略,在适当的时机增加或减少资源,从而节约人力和资金成本,保证应用健康平稳运行。

手动方式需要人为触发,可以进行横向和纵向伸缩,横向伸缩是指调整应用的实例数量,也就是组成应用集群的容器数量,平台提供智能化的负载均衡。

纵向伸缩是指扩展应用单个容器的资源配额,比如内存、CPU等。

MoPaaS 平台目前可提供横向伸缩方式。平台可根据应用资源的使用情况,如:CPU、内存,或访问情况,如:QPS,对应用进行横向的扩容或缩容。开启自动扩容后,平台将结合用户自己配置的策略,联合监控数据,自动的创建和释放实例,全程无需人工参与,实现资源合理利用最大化。通过对最小实例数的设定,可保证应用实时可用数量。

自动弹性伸缩的实现方案如下:
010.jpg

Route组件将访问日志记录至文件,通过LogAgent实时采集访问日志数据发送至消息队列。日志结构包括域名、请求时间、Method、URI、协议、响应状态、下行流量、请求来源、浏览器信息、请求容器信息、响应时间等。

通过这些日志数据可以统计出外部对应用的并发访问量、下行流量、成功率、响应性能等指标。

MoPaaS收集到这些访问日志数据之后,通过定时执行数据库存储过程进行统计、分析、合并、清理。

MoPaaS统计最近10秒内的平均每秒并发量,根据用户预先设置好的弹性伸缩规则,计算得出当前并发量所需实例数量,然后通过下发指令给容器平台如Cloud Foundry、Kubernetes实现弹性伸缩功能。功能截图如下:
011.jpg

自动化运维

自动化运维主要包括健康检查和故障恢复。

健康检查包括对平台的自动化监控和检测,一旦监控到性能超标或宕机故障,则触发相关事件。如应用出现故障,则重新启动实例,物理机故障时,实例将迁移至其他主机,相当于一次部署过程。
012.jpg

在传统监控基础上,增加健康检查机制,用户能够一目了然的看到整个流程的各个节点运转情况,实例自动重启与迁移,报警大量减少,人力减少,只有自动恢复失败时才报警。不仅仅减少了人力的投入,也是一种降低成本的表现。
013.jpg

监控报警和日志管理

运行在Cloud Foundry的容器监控数据由Doppler组件统一收集,我们通过Firehose组件可以采集到所有应用的性能数据,如健康状态、CPU使用率、内存使用率、IO、磁盘使用率等等。运行在Kubernetes上的容器通过cAdvisor采集,并统一汇总至Heapster,Heapster可以将数据存储至时序数据库Influxdb中,平台通过查询数据库进行报表展示以及根据预先设置的阈值进行报警。
014.jpg

开发测试阶段,日志打到标准输出stdout,可以通过平台提供的Webconsole实时输出,如果需要持久化日志信息,平台提供一个Log4j SDK,这个SDK支持日志输出到一个消息队列中,应用需要持久化日志,只需要通过这个日志SDK输出日志即可,日志被打到消息队列后,由ELK存储日志,平台可以通过ElasticSearch提供的接口搜索需要的日志。
015.jpg

应用云化的设计原则

在我们实施的多个PaaS 项目中,遇到的最大的问题是将应用迁移到云平台上。由于客户有些应用迁移时要求应用架构、软件版本等与未迁移前保持一致,因此并不是100%的应用都可以原封不动地往PaaS平台上迁移,平台支持非标准化运行环境已经在很大程度上支持了不同环境要求不同架构的应用迁移,但是如果有可能的话,比如应用方允许修改依赖的环境或应用架构以更好的迁移至PaaS平台,或者新开发的应用,像这样的应用的话最好符合一些云化的设计原则,具体要求如下:
  1. 容器和应用实例定位
    • 容器和实例与 IaaS 和物理机的解耦,依赖域名或配置管理来对其定位
  2. 数据持久化
    • 持久化数据存放在 DB、NFS、或其它共享存储
    • 日志保存至第三方服务
    • 实例迁移时内部数据不必保留和迁移
  3. 状态管理
    • 平台不提供状态保存管理,也不依赖Proxy 会话保持功能
    • 状态保存至第三方服务,以支持水平扩展、负载动态均衡和故障转移
  4. 优化 MTTR
    • 使实例的重启和重建变得更快捷

Q&A

Q:弹性扩容的时候怎么区分需要垂直扩容还是水平扩容?
A:自动扩容是水平扩容,根据并发量、CPU、内存的实时数据分析来实现。
Q:所有的扩容都是水平扩容吗?不太清楚自动化的垂直扩容应该怎么判断,有什么想法不?
A:目前所有扩容都是水平扩展,要垂直扩展只能手动,原因是垂直扩展变更内存、CPU后有些情况下需要重新进行实例分布。
Q:水平扩容只是增加实例就可以了,对吧。缩容呢,怎么判断呢?
A:缩容也是一样的,根据最近10秒内的并发量决定需要多少个实例。
Q:现在扩容的依据是基础监控数据和业务的监控数据同时考虑吗?
A:目前平台主要基于基础监控数据来进行扩容,业务数据如果也是导致应用性能瓶颈的一个因素的话,纳入到扩容策略里面也是比较简单。
Q:数据共享卷的解决方案是如何考虑的,基于cinder还是ceph,创建个数据共享卷要先格式化创建文件系统,如何实现和node节点挂载前的前格式化的,node节点故障,容器发生重生共享卷如何挂载到新节点上呢?
A:共享卷是直接挂到容器上的,不是挂载到宿主机上,Glusterfs、Ceph、NFS等都支持。
Q:灰度发布功能,目前我理解的是分为滚动升级和AB测试,这个目前实现的那种,AB测试具体如何理解呢?
A:您说的是蓝绿发布吗?蓝绿发布应该是保证无宕机的前提下,将老版更新到新版。
Q:请问,Kubernetes中的A域名指向一个应用,B域名指向另外一个应用,都要用到80和443端口,这个该怎么做呢?
A:前端加一个route,进行域名和IP+Port的转发。

以上内容根据2016年8月23日晚微信群分享内容整理。分享人沈阅斌,MoPaaS产品研发总监。11年IT从业经验,国内较早一批从事Cloud Foundry等PaaS技术相关研发工作。擅长Java、J2EE、Spring、Hibernate、Struts、JPA、Cloud Foundry、Docker、Kubernetes、RabbitMQ、Jenkins等技术。 2011年加入MoPaaS负责产品研发和管理工作。 DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesz,进群参与,您有想听的话题或者想分享的话题都可以给我们留言。

原文发布时间为:2016-08-28

本文作者:沈阅斌

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:DockOne微信分享(七十九):基于容器技术构建企业级PaaS云平台实践

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
22天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
17天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
5天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
24 4
|
17天前
|
供应链 安全 Cloud Native
阿里云容器服务助力企业构建云原生软件供应链安全
本文基于2024云栖大会演讲,探讨了软件供应链攻击的快速增长趋势及对企业安全的挑战。文中介绍了如何利用阿里云容器服务ACK、ACR和ASM构建云原生软件供应链安全,涵盖容器镜像的可信生产、管理和分发,以及服务网格ASM实现应用无感的零信任安全,确保企业在软件开发和部署过程中的安全性。
|
17天前
|
人工智能 Cloud Native 调度
阿里云容器服务在AI智算场景的创新与实践
本文源自张凯在2024云栖大会的演讲,介绍了阿里云容器服务在AI智算领域的创新与实践。从2018年推出首个开源GPU容器共享调度方案至今,阿里云容器服务不断推进云原生AI的发展,包括增强GPU可观测性、实现多集群跨地域统一调度、优化大模型推理引擎部署、提供灵活的弹性伸缩策略等,旨在为客户提供高效、低成本的云原生AI解决方案。
|
17天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
27天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
61 4
|
27天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
64 3
|
29天前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
51 1
|
29天前
|
运维 Kubernetes Docker
深入理解容器化技术及其在微服务架构中的应用
深入理解容器化技术及其在微服务架构中的应用
59 1