东方国信基于kubernetes构建容器云平台的实践和思考

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本次,我分享的主题是《东方国信基于Kubernetes构建容器云平台的实践和思考》。 先讲一下背景,国信之前的软件部署方式是找台机器,把war包或者jar包往机器上一扔,启动就可以了,所有功能都在一个包里面,模块之间相互耦合,导致新功能开发上线周期很长,客户的需求得不到及时满足。

本次,我分享的主题是《东方国信基于Kubernetes构建容器云平台的实践和思考》。


先讲一下背景,国信之前的软件部署方式是找台机器,把war包或者jar包往机器上一扔,启动就可以了,所有功能都在一个包里面,模块之间相互耦合,导致新功能开发上线周期很长,客户的需求得不到及时满足。

所以我们把我们的应用微服务化改造,微服务化以后,原来一个应用现在变成了十几个,每个应用功能相对独立,开发人员需要了解的东西变少,开发新功能也比以前简单了;

但是软件部署运维变得困难了,原来一个软件包,现在成了十几个。了解过DevOps的同学一定知道,开发和运维之间有一道墙,现在这道墙更高了。

所以我们希望有一款产品能解决我们这些痛点,最后我们把目标锁定在docker和kubernetes上,我们希望基于这个平台来实现DevOps的部分流程,来减轻部署运维的负担,同时能提高我们的资源利用率。

最后我们制定了下面这样一个架构:

这张图的最左边是我们控制台,叫BCM,用户所有的操作都在BCM的界面上面完成,包括镜像的构建,服务的发布、升级等,这种界面的东西各公司根据业务和服务对象不同会有所不同,但是主要功能都差不多,所以不展开说了,后面会贴几张界面。

我们先说最核心的k8s部分,因为所有工作都是围绕着k8s展开的。

云平台的主体基于K8S+Docker构建;通过KubeDNS来为集群内的应用程序提供域名解析;

通过heapster收集性能信息,写入influxDB,然后是BCM读取influxDB信息进行展示,我们没有使用grafana,主要是考虑到我们的平台是多租户的,不同的租户只能看到自己系统的性能指标;

而且我们通过对kubelet和heapster的修改,增加了对容器内应用的线程数和socket连接数的监控,为什么要增加?

因为我们在使用过程中发现有些应用代码质量不高,乱用线程,有的文件句柄打开后忘记关闭,导致运行一段时间后连接数据库失败,所以我们增加了这两项监控,当然严格执行代码质量检查和review才是更重要的。

大家也看到我们使用了prometheus,我们主要使用了prometheus对cpu和内存使用率进行告警,同时对prometheus和alertmanager增加了配置接口,在应用部署时,把阈值配置下去,同时重载prometheus的配置,完成监控功能。

我们使用fluent来收集容器的日志,写入elasticsearch,通过kibana进行检索。

同时bcm的web界面上可以查看实时日志,这本来是个小功能,但是开发过程也是一波三折,开始我们使用了k8s的api进行日志获取,当日志文件很大的时候,发现读取很慢,接着我们又修改成通过docker的api获取,但是还是很慢。有时候我们只想查看一个特定时间段的日志,这个日志量应该不会太大,应该很快才对。

于是我们查看了docker源码,发现有两点需要优化,第一是读取缓冲区,太小了,只有1KB;

第二就是每次都从第一条日志进行读取,反序列后进行时间比较,看看是否在时间段内,其实docker不支持结束时间,我们自己加的。

针对第一点,修改方法很简单,增大一下读取缓冲区就可以了;

第二点,修改策略是把日志分成多个文件,并且记录每个文件的开始日志时间和结束日志时间,通过查询记录信息,定位到第一个需要读取的日志文件和最后一个需要读取的文件,减少不必要的io。

下面我们再说一下我们的服务发现:

我们使用了Nginx来做反向代理,同时我们开发了KubeNg这样一个后台程序,为每个Nginx服务器配置一个KubeNg,KubeNg通过kube-ApiServer实时监控服务的变化,更新nginx的配置文件,reload nginx配置。

kubeNg是一个后台程序,没有界面,生成的nginx配置都是固定格式的,有些用户对自己应用程序的nginx配置有特殊的要求,需要修改,我们又没有界面来修改,这不行啊,所以我们又开发了一个NgFront前端程序,NgFront满足下面几点要求:

通过NgFront可以管理多套Nginx集群,因为有些租户公用一套nginx,有些租户单独使用一套nginx。

2、可以修改抓取到的配置,解决租户对配置有特殊的要求。

3、可以增加没有使用容器进行部署的服务的反向代理,因为不是所有服务都会使用容器进行部署,起码刚开始不会,但是这些服务还想共用容器的nginx,当然运维人员可以登录到每台nginx机器上进行配置,但是这样很容易出错,直接在界面上面编辑完成,下发到所有机器就可以了。

4、Reload之前进行配置文件语法检查。

5、可以下载配置文件,有时候会有运维人员绕过NgFront进行操作,导致Nginx集群内各节点的配置不一致,有些用户可以正常访问,有些不能正常访问,取决于LVS把用户的请求负载均衡到哪台nginx上面了,所以出现这种情况的时候,我们点击下载,用文本对比工具对比一下,很快就能发现问题。

下面我们再说说ttyEntry:

这个主要是解决用户调试方便的需求。用户在刚开始使用容器的时候,碰到最多的问题就是配置文件忘记修改了,导致系统启动失败。用户需要重新上传个jar包到BCM平台,进行镜像构建,所以他们需要有一个环境像使用虚拟机一样,可以使用vi进行编辑,修改完成后,执行java –jar进行测试,如果正常,直接打包成镜像,推送到仓库。

BCM使用了xterm来做了一个web版的终端,TtyEntry主要功能就是把xterm发过来的请求转发到容器内部。

下面再说说pinpoint功能:

这个是一个很赞的工具,在不需要修改代码的情况下,可以给出应用之间的调用关系和花费的时间,而且性能损失很小。

下面是pinpoint的架构图,我们把红色框中的Pinpoint Agent做到了容器内,通过BCM界面上的开关控制是否开启监控。

精华也在Pinpoint Agent,Agent会在我们应用程序的class加载的时候,进行jvm虚拟机代码的注入,在class执行的时候采集执行时间发送给Collector,后面的HBase就是存储,WebUi就是展示。

深入的原理还是要看google的论文,Pinpoint是根据google的Dapper论文研发的。

再回到我们刚开始的整体框架图,里面有个Ceph,Ceph用来提供高性能的网络存储。我们的应用程序不全是无状态的,有很多应用程序需要用户上传脚本、说明文档等,这些东西显然不能存储在容器内部的存储上。

大家知道docker容器重启后,里面存储的数据就会丢失,所以我们就把ceph挂载到容器内部,把这些需要持久化的东西存储到ceph,即使pod被重新调度到其他节点,存储在ceph里面的文件也不会丢失。另外Ceph的块存储也可以为我们的mysql、redis等的容器化提供存储。

我们还有一部分没有介绍,就是下面这块:

这其实就是个简配的DevOps,之所以做一个简配版,主要是考虑到两方面:一、实现简单;二、推广简单。一个工具一旦复杂了,就很难推广落地,所以我们前期先做一最简单的,先让大家上船,后面才好往下走。

我们开发了一个持续集成工具SheRa,就是动画片里面的“希瑞请赐予我力量吧”的希瑞。SheRa只是一个后台服务,提供restful的接口,BCM实现配置页面。下面是界面:

界面配置Git的地址、maven编译命令,sonar代码质量检查是可选的配置,如果选择了,最后生成的镜像就有一个相应的质量标签,最后是dockerfile,我们的shera自带了几个工具,如果最后生成的镜像有问题,可以把shera自带的工具打包进去,协助进行调试。

比如,连接mysql不成功,可以把mysql客户端打包到镜像内,通过ssh进入镜像,进行连接测试。因为刚开始使用容器,研发很容易把屎盆子扣在容器头上,我们可以通过这些工具有理有据的告诉他们,数据库连接没有问题,你们是不是打包配置错了jdbc。

下面是配置完成,编译后的界面:

点击项目名称,进入详情

点击快速部署按钮,进行部署。

这样一个服务也就配置完成了。

本文转自中文社区-东方国信基于kubernetes构建容器云平台的实践和思考

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
12天前
|
存储 Kubernetes C++
【专栏】Kubernetes VS Docker Swarm:哪个容器编排工具更适合你?
【4月更文挑战第27天】对比Kubernetes和Docker Swarm:K8s在可扩展性和自动化方面出色,有强大社区支持;Swarm以简易用著称,适合初学者。选择取决于项目需求、团队技能和预期收益。高度复杂项目推荐Kubernetes,快速上手小项目则选Docker Swarm。了解两者特点,助力选取合适容器编排工具。
|
1天前
|
运维 安全 Linux
深入理解Docker自定义网络:构建高效的容器网络环境
深入理解Docker自定义网络:构建高效的容器网络环境
|
1天前
|
存储 弹性计算 运维
Docker数据集与自定义镜像:构建高效容器的关键要素
Docker数据集与自定义镜像:构建高效容器的关键要素
|
1天前
|
Kubernetes Java 调度
Java容器技术:Docker与Kubernetes
Java容器技术:Docker与Kubernetes
10 0
|
1天前
|
算法 计算机视觉 Docker
Docker容器中的OpenCV:轻松构建可移植的计算机视觉环境
Docker容器中的OpenCV:轻松构建可移植的计算机视觉环境
Docker容器中的OpenCV:轻松构建可移植的计算机视觉环境
|
2天前
|
应用服务中间件 持续交付 nginx
【Docker专栏】Docker入门指南:快速构建你的第一个容器
【5月更文挑战第7天】Docker 入门指南:容器化应用利器。了解 Docker 核心概念——镜像、容器和仓库。安装 Docker 后,运行官方 `hello-world` 验证安装,再尝试运行 `nginx` Web 服务器。通过端口映射访问容器内服务,学习管理容器命令。创建自定义镜像,编写 Dockerfile,实现 Python Web 应用容器化。Docker 助力高效开发与运维,探索更多自动化部署与微服务场景。
【Docker专栏】Docker入门指南:快速构建你的第一个容器
|
3天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器化技术融合实践
【5月更文挑战第6天】随着企业IT架构的复杂化以及快速迭代的市场需求,传统的运维模式已难以满足高效率和高质量的交付标准。本文将探讨如何通过结合DevOps理念和容器化技术来构建一个高效的自动化运维体系,旨在实现持续集成、持续部署和自动化管理,提升系统的可靠性、可维护性和敏捷性。
|
8天前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第1天】 随着云计算的普及和企业数字化转型的加速,传统的IT运维模式已无法满足快速迭代和高可用性的要求。本文探讨了如何通过DevOps文化和容器化技术的融合来构建一个高效、稳定且可扩展的云基础设施。文章首先回顾了DevOps的核心理念及其对运维工作的影响,随后详细介绍了容器化技术的基本概念、优势以及在现代云环境中的关键作用。接着,文中以一系列真实案例为基础,分析了将DevOps与容器化相结合时所面临的挑战和解决方案,并提出了一套实施框架。最后,文章总结了这种融合实践对提高运维效率、加快产品上市速度和保障系统稳定性的积极影响,同时对未来的技术趋势进行了展望。
|
9天前
|
敏捷开发 运维 测试技术
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
【4月更文挑战第30天】在数字化转型的浪潮中,企业对软件交付速度和质量的要求日益提高。自动化运维作为提升效率、确保稳定性的关键手段,其重要性不言而喻。本文将探讨如何利用容器技术构建一个高效的自动化运维体系,实现从代码提交到产品上线的持续集成(CI)与持续部署(CD)。通过分析现代容器技术与传统虚拟化的差异,阐述容器化带来的轻量化、快速部署及易于管理的优势,并结合实例讲解如何在实际环境中搭建起一套完善的CI/CD流程。
|
9天前
|
Kubernetes Devops Docker
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第30天】 在当今快速迭代和持续交付的软件发展环境中,传统的IT运维模式已不足以满足企业对效率和稳定性的双重需求。本文将深入探讨如何通过整合DevOps理念和容器化技术来构建一个既高效又稳定的云基础设施。文中不仅阐述了DevOps的核心原则、流程自动化的重要性以及容器化技术的基础知识,还提供了一个详细的实施案例,帮助读者理解这两种技术如何协同工作,以支持复杂的应用程序部署和管理。

相关产品

  • 容器服务Kubernetes版