背景
开发:
代码量不断增加、协同开发难度加大
多样化的编译和运行环境
更快的交付频率
按时发布、按需发布
微服务化后带来的架构复杂度提高
产品整体部署和运维难度增加
随着容器技术的发展,容器技术与微服务逐渐碰撞出火花,业界也普遍认为容器技术和微服务是“天生一对”。在2017年,容器化微服务成为了我们新的选择,优化了开发、交付和运维方式和流程,并一直推动着公司敏捷和DevOps的发展。
微服务
现在越来越多的金融企业使用微服务架构,以应对快速变化的互联网金融挑战。通过微服务改造把应用拆分成很多细小的服务,每个服务专注于单一的功能,服务和服务之间有明确的边际,使用轻量级的通讯协议进行沟通,实现某个相对单一的功能。微服务的到来降低了巨大单体式应用复杂度、每个服务的开发技术自有选择、每个服务可独立扩展、每个服务可独立部署。但使用微服务架构不要低估细粒度分布式应用治理与运维的复杂度。而结合容器技术的微服务则可以给企业带来更高的资源使用率,更加快捷的迭代变更,更加方便的快速扩容能力。
容器是微服务的最佳载体
通过容器将微服务的运行时标准化,每个容器承载一个服务,然后像搭积木一样组合起来,让彼此通信,从而就能很轻松地模拟出复杂的微服务架构。
容器天然做到了应用之间相互隔离,在保证安全隔离的同时,可以有效提高资源使用率;
为微服务的快速扩容提供有效的支撑,容器启动非常快速,秒级实现,通过镜像可以快速启动多个微服务;
对软件和其依赖环境的标准化打包,保证了微服务多个副本之间的绝对一致性,使得我们可以方便运维管理更多的微服务;
容器占用资源少、部署快,每个微服务应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,为每个微服务单独构建镜像,通过镜像可以独立发布一个微服务,不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。
Kubernetes在支撑容器平台和微服务的竞争中依然胜出。传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作。Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
微服务运营管理
配置管理,相同的微服务,部署在不同的环境,如不同的生产中心、灾备中心、测试迭代环境、并行测试环境等,需要有不同的配置,容器云平台通过Kubernetes特有的PV/PVC功能,结合配置中心的统一管理,方便实现配置管理,真正实现“一次打包,到处运行”。
自动扩缩容和灰度发布,利用Kubernetes和容器,华泰容器云平台可以很好的的实现治理微服务需要的自动扩缩容和灰度发布。根据实际的业务需求和策略,容器云平台通过Kubernetes自动“调整”其“弹性资源”的管理服务。通过弹性伸缩功能,业务团队可设置定时、周期、自定义的监控策略,敏捷快速地增加或减少“弹性资源”,并完成实例配置,保证业务平稳健康运行。在满足业务需求高峰增长时无缝地增加“弹性资源”,并在业务需求下降时自动减少“弹性资源”以节约成本。同样结合负载均衡软件,我们可以让流量逐步指向新扩容出来的新版本的微服务,快捷的实现灰度发布全过程。
健康检查,当微服务数量不断增加后,健康检查和服务自动修复是一项重要工作,华泰容器云平台利用容器的特性,提供了容器健康监控和服务自动修复的功能,减少了微服务过程中运维的压力。
CI/CD
持续集成
持续集成是一种软件开发实践,开发人员通过经常性地自动化集成他们的工作,从而尽早地发现IT系统集成错误。持续集成通常包括如下过程:统一的代码库、自动触发、自动构建、单元测试、自动化部署、自动化集成测试等等,这些工作通过Jenkins虽然也能完成,但是需要大量编码工作,而且强依赖底层资源和环境,这使得开发和测试人员花费了大量精力在流程的对接上,而容器云平台的建成大大改善了这种情况。开发和测试人员在容器云平台通过图形化的界面操作便可以完成持续集成的整套流程,将精力聚焦在软件开发细节和测试用例上使用容器云平台不仅屏蔽了底层资源,大大简化了运行时环境准备工作,结合容器的弹性,还大大提高了资源利用率。下图展示了容器云平台的持续集成流程:
持续交付
持续交付是持续集成的自然延续,它完成了产品从开发测试到生产的“质的蜕变”。利用容器云平台上的流水线,我们完成了从提交代码自动化触发构建到最终自动更新生产环境某个微服务版本的整套交付流程。在开发测试环境构建出的应用镜像通过流水线同步至预发布环境,经过测试后再同步至生产环境部署,我们做到了在保证交付质量的前提下,加快交付速度,从而更快地反馈市场需求,赋能业务发展。下图是持续交付流程图:
DevOps
DevOps主要用于开发、测试以及运维之间的协作管理,并且通过自动化流程,更加快捷、频繁、易重复且可靠的构建软件、测试及发布部署。持续集成和持续交付是实现DevOps的一部分,但不等于DevOps。DevOps应该还包括一套完整的持续部署以及持续运营的完整开发测试运维一体化的DevOps方法和工具。DevOps不是一定要用容器,但是有了容器,DevOps变得更加简单。可以说容器云平台的建设既是DevOps实践,也推动了华泰证券DevOps的落地:
借助容器云平台提供敏捷开发能力,让开发端更加敏捷;
通过容器云平台,实现开发测试生产环境一致性,逐步建立标准化、一致性的开发、测试、运维环境,专注于业务应用开发,不分心于资源管理;
实现应用全生命周期管理,满足应用开发、自动化部署、自动化运维等应用服务全生命周期管理需求;
基于容器云平台的能力,实现应用服务的弹性伸缩、灰度发布等能力,满足多种业务需求。
网络模式
为了让用户应用平滑地迁移至容器,比如一些传统应用或者监控应用需要直接使用Host的物理网络,也为了保障网络管理的一致性与网络性能的高效,我们选用了Macvlan网络模式。Macvlan本身是Linxu Kernel的模块,本质上是一种网卡虚拟化技术。其原理是在宿主机物理网卡上虚拟出多个子网卡,并分配独立的IP地址和MAC地址,把子网卡分配给容器实例来实现实例与物理网络的直通,并同时保持容器实例的隔离性。Host 收到数据包后,则根据不同的MAC地址把数据包从转发给不同的子接口。在网络上看起来容器直接连接到物理网络,和物理机和虚机没有区别。Macvlan共有4种模式,我们使用的是高性能的Macvlan Bridge,如下图所示:
弹性伸缩
弹性伸缩是容器云的重要特性和业务场景。容器的封装性使其横向扩展非常方便,但是想做好弹性伸缩这还远远不够。比如要做到基于CPU和内存负载的弹性伸缩,不仅要做好容器的监控,还要配合负载均衡、灰度发布等功能,最重要的是弹性伸缩的时机,这里面有些是技术问题,而有些需要根据不同业务做定制化处理。还有一点实践经验,善用Kubernetes的Liveness和Readiness Probes对增加应用程序的稳定性很有帮助。通过健康检查保障微服务之间的启动顺序,当应用程序准备好的时候,它们才会开始服务通信,这使得自动调度、滚动更新和弹性伸缩运行得十分顺利。
有状态服务
众所周知,因为容器本身的磁盘空间不大,而且容器的可写层数据在容器重启后会丢失,所以容器没办法很好地承载有状态服务,而是被广泛应用于无状态的服务。但是我们的容器云平台基于容器和容器编排技术,并结合分布式存储技术,有效支撑了有状态服务,比如容器化RDS。其核心思想是计算与存储分离,将数据库运行于容器中,而将其数据在外部分布式存储中持久化。结合多种调度策略以及快照功能,可按需创建满足不同业务场景的数据库服务。
中间件市场
随着越来越多的应用系统相继建设,对一些公共中间件的需求越来越强烈,例如Redis、Kafka等等。同时这些中间件的运维工作也越来越繁重,申请底层资源、安装配置中间件、调试等繁琐、重复性的工作占据着中间件运维人员的大部分时间,容器化的中间件出现大大降低了中间件维护人员的工作量,无需关心底层资源和界面化的配置操作显著提高了中间件的发放效率。后续中间件的自服务是我们的努力方向。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/a9484f92d181ccf5147145e72af025fb.jpeg)