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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 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中文社区-东方国信基于kubernetes构建容器云平台的实践和思考

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
4天前
|
人工智能 Prometheus 监控
使用 NVIDIA NIM 在阿里云容器服务(ACK)中加速 LLM 推理
本文介绍了在阿里云容器服务 ACK 上部署 NVIDIA NIM,结合云原生 AI 套件和 KServe 快速构建高性能模型推理服务的方法。通过阿里云 Prometheus 和 Grafana 实现实时监控,并基于排队请求数配置弹性扩缩容策略,提升服务稳定性和效率。文章提供了详细的部署步骤和示例,帮助读者快速搭建和优化模型推理服务。
42 7
使用 NVIDIA NIM 在阿里云容器服务(ACK)中加速 LLM 推理
|
6天前
|
Cloud Native 持续交付 Docker
云原生技术实践:Docker容器化部署教程
【9月更文挑战第4天】本文将引导你了解如何利用Docker这一云原生技术的核心工具,实现应用的容器化部署。文章不仅提供了详细的步骤和代码示例,还深入探讨了云原生技术背后的哲学,帮助你理解为何容器化在现代软件开发中变得如此重要,并指导你如何在实际操作中运用这些知识。
|
11天前
|
Kubernetes Cloud Native Docker
云原生入门:从容器到Kubernetes的旅程
【8月更文挑战第31天】云原生技术正改变着应用的开发、部署和运维方式。本文将带你走进云原生的世界,从容器的基础开始,探索Docker和Kubernetes如何助力现代软件开发与运维。你将学会如何使用Docker创建和管理容器,以及如何通过Kubernetes进行集群管理,实现服务的自动化部署、扩展和管理。准备好让你的应用在云端自由翱翔了吗?让我们启航!
|
11天前
|
运维 Kubernetes 监控
自动化运维:使用Python脚本实现系统监控云原生技术实践:Kubernetes在现代应用部署中的角色
【8月更文挑战第31天】在现代IT运维管理中,自动化已成为提高效率和准确性的关键。本文将通过一个Python脚本示例,展示如何实现对服务器的自动监控,包括CPU使用率、内存占用以及磁盘空间的实时监测。这不仅帮助运维人员快速定位问题,也减轻了日常监控工作的负担。文章以通俗易懂的语言,逐步引导读者理解并实践自动化监控的设置过程。 【8月更文挑战第31天】本文旨在探索云原生技术的核心—Kubernetes,如何革新现代应用的开发与部署。通过浅显易懂的语言和实例,我们将一窥Kubernetes的强大功能及其对DevOps文化的影响。你将学会如何利用Kubernetes进行容器编排,以及它如何帮助你的
|
11天前
|
运维 Kubernetes Cloud Native
拥抱云原生:Kubernetes 在现代应用部署中的实践
【8月更文挑战第31天】在数字化转型的浪潮中,云原生技术成为推动企业创新和效率提升的关键力量。本文将深入探讨如何利用 Kubernetes,这一强大的容器编排工具,来部署和管理现代应用。我们将从基础架构搭建开始,一步步引导您配置集群,并通过实际代码示例演示如何部署一个简单的应用。无论您是云原生新手还是希望深化理解,这篇文章都将为您提供实操经验和理论知识的融合之旅。
|
11天前
|
容器 iOS开发 Linux
震惊!Uno Platform 响应式 UI 构建秘籍大公开!从布局容器到自适应设计,带你轻松打造跨平台完美界面
【8月更文挑战第31天】Uno Platform 是一款强大的跨平台应用开发框架,支持 Web、桌面(Windows、macOS、Linux)及移动(iOS、Android)等平台,仅需单一代码库。本文分享了四个构建响应式用户界面的最佳实践:利用布局容器(如 Grid)适配不同屏幕尺寸;采用自适应布局调整 UI;使用媒体查询定制样式;遵循响应式设计原则确保 UI 元素自适应调整。通过这些方法,开发者可以为用户提供一致且优秀的多设备体验。
27 0
|
11天前
|
Kubernetes Cloud Native 应用服务中间件
云原生技术入门与实践:Kubernetes的简易部署
【8月更文挑战第31天】云原生技术已成为现代软件部署的黄金标准,而Kubernetes作为其核心组件之一,在容器编排领域独领风骚。本文将引导您通过简单的步骤,快速部署一个Kubernetes集群,并运行一个简单的应用,让您轻松迈入云原生的世界。
|
11天前
|
Kubernetes Cloud Native 应用服务中间件
云原生入门:Kubernetes 和容器化技术的实践之旅
【8月更文挑战第31天】 在这篇文章中,我们将踏上一场探索云原生世界的旅程。我们将从基础的容器化技术讲起,逐步深入到Kubernetes这个强大的容器编排工具。文章会通过一个实际的例子,带领大家了解如何将一个简单的应用容器化并在Kubernetes集群上运行起来。无论你是云原生领域的新手,还是希望巩固知识的开发者,这篇文章都会为你提供一次实操的机会,让你对云原生有一个更加直观的认识。
|
11天前
|
Cloud Native 云计算 开发者
云原生技术实践:Docker容器化部署示例
【8月更文挑战第31天】本文通过深入浅出的方式,介绍了如何在云计算时代利用Docker容器技术实现应用的快速部署和高效管理。文章不仅解释了Docker的基本概念和优势,还提供了详细的操作步骤和代码示例,帮助初学者轻松入门。让我们一起探索云原生的世界,解锁应用部署的新姿势!
|
11天前
|
Kubernetes Cloud Native JavaScript
云原生之旅:Kubernetes 集群搭建与应用部署实践
【8月更文挑战第31天】云原生技术正在改变软件开发和运维的方式,而Kubernetes作为其核心组件之一,提供了一个强大的平台来编排容器化的应用。本文将引导你了解如何搭建一个基本的Kubernetes集群,并通过一个简单的Node.js应用示例,展示如何在集群中部署和管理应用。我们将从零开始,逐步构建起对Kubernetes的直观理解,并在实践中学习其核心概念。

相关产品

  • 容器服务Kubernetes版