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搭建和管理企业级网站应用
相关文章
|
3月前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
18天前
|
供应链 安全 Cloud Native
阿里云容器服务助力企业构建云原生软件供应链安全
本文基于2024云栖大会演讲,探讨了软件供应链攻击的快速增长趋势及对企业安全的挑战。文中介绍了如何利用阿里云容器服务ACK、ACR和ASM构建云原生软件供应链安全,涵盖容器镜像的可信生产、管理和分发,以及服务网格ASM实现应用无感的零信任安全,确保企业在软件开发和部署过程中的安全性。
|
1月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
2月前
|
Kubernetes 监控 数据中心
容器化与微服务:构建高效开发环境的双剑合璧
【10月更文挑战第20天】本文探讨了容器化技术(如Docker和Kubernetes)与微服务架构的结合,如何共同构建高效、灵活的开发环境。容器化解决了环境一致性、快速部署和资源隔离的问题,而微服务架构则提升了系统的可维护性和可扩展性。通过容器编排工具、CI/CD流程和服务网格,两者的结合进一步优化了开发和运维效率。文章还分享了实施这两项技术的最佳实践和职业心得。
|
2月前
|
Kubernetes Cloud Native 云计算
云原生之旅:构建你的第一个容器化应用
【8月更文挑战第75天】在数字化浪潮中,云原生技术成为推动企业创新和效率提升的关键动力。本篇文章将引导你开启云原生之旅,通过一个简易的步骤指南,帮助你构建并部署第一个容器化应用。我们将一起探索Docker容器的魅力,以及如何利用Kubernetes进行集群管理,实现服务的自动化部署、扩展和管理。无论你是云原生新手还是希望深化理解,这篇文章都将为你提供实践操作的启示和深入思考的契机。
|
2月前
|
监控 Kubernetes 测试技术
掌握Docker网络模式:构建高效容器通信
【10月更文挑战第3天】本文深入探讨了Docker的网络模式,包括它们的工作原理、使用场景以及如何配置和优化容器间的通信。希望能够帮助开发者在项目中有效地应用Docker网络模式,构建高效的容器化应用。
|
3月前
|
供应链 安全 Cloud Native
阿里云容器服务助力企业构建云原生软件供应链安全
针对软件供应链的攻击事件在以每年三位数的速度激增,其中三方或开源软件已经成为攻击者关注的重要目标,其攻击方式和技术也在不断演进。通过供应链的传播,一个底层软件包的漏洞的影响范围可以波及世界。企业亟需更加标准和完善的供应链风险洞察和防护机制。本文将结合最佳实践的形式,面向容器应用完整的生命周期展示如何基于容器服务ACK/ACR/ASM助力企业构建云原生软件供应链安全。
|
2月前
|
运维 Kubernetes 开发者
构建高效后端服务:微服务架构与容器化技术的结合
【10月更文挑战第18天】 在数字化转型的浪潮中,企业对后端服务的要求日益提高,追求更高的效率、更强的可伸缩性和更易于维护的系统。本文将探讨微服务架构与容器化技术如何结合,以构建一个既灵活又高效的后端服务体系。通过分析当前后端服务面临的挑战,介绍微服务和容器化的基本概念,以及它们如何相互配合来优化后端服务的性能和管理。本文旨在为开发者提供一种实现后端服务现代化的方法,从而帮助企业在竞争激烈的市场中脱颖而出。
33 0
|
2月前
|
运维 Kubernetes 监控
掌握Docker容器化技术:构建、部署与管理的高效实践
【10月更文挑战第14天】掌握Docker容器化技术:构建、部署与管理的高效实践
93 0
|
3月前
|
网络协议 安全 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基础知识,包括网络驱动、端口映射和命名等核心概念,并深入探讨了 Bridge、Host、Overlay 和 Macvlan 四种网络类型的特点及应用场景。此外,还提供了创建、连接、查看和删除自定义网络的命令示例,以及高级网络配置方法,如网络命名空间、DNS 解析和安全通信配置,帮助开发者构建更健壮的容器化应用。