如何快速部署容器化应用

标签: 云计算 kubernetes paas平台 开源软件 | 发表时间:2019-10-29 14:09 | 作者:宜信技术学院
出处:https://segmentfault.com/blogs

摘要:容器化推行的过程中,研发、运维学习及使用成本都非常高,那有没有一款简单易用的平台呢?本文介绍基于Kubernetes的应用管理平台-开普勒云平台。

一、背景

为了快速适应和满足市场需求,小而快的应用越来越多,“这些零碎的应用如何部署、管理?”成为让大家头疼的问题。若全部上虚拟机,资源消耗太大。这时,将应用容器化,显然是一个非常不错的选择,但很多公司又都面临着一个同样的问题,那就是容器化推行难。

容器化推行的过程中,研发、运维学习及使用成本都非常高,那有没有一款简单易用的平台呢?

开普勒云平台是 宜人金科-财富技术部 开源的一款基于Kubernetes的应用管理解决方案。致力于解决公司的上容器难、上Kubernetes难、运维成本高等问题。应用只需要加一个非常简单的Dockerfile文件通过开普勒云台就能将应用部署在Kubernetes上,大大降低了使用的难度。

二、开普勒云平台

之前的一篇文章 Kubernetes+Docker+Istio 容器云实践对开普勒平台做了一些基本介绍。

经过一段时间的调整,我们终于把这个平台开源了: https://github.com/kplcloud/kplcloud

开普勒云平台是一款面向研发、运维等人群的平台,只需要具备简单知识就可以快速将应用部署到Kubernetes上,以下是平台的基础架构:

开普勒平台既可以通过容器的方式跑在Kubernetes上,也可以独立部署。

在kubernetes master节点上执行即可完成部署,当然,在此之前需要增加app.cfg配置文件。

  $ git clone github.com/kplcloud/kplcloud && cd kplcloud/
$ kubectl apply -f install/kubernetes/kpaas/

下图是开普勒云平台所对接的平台及流程。

开普勒云平台通过调用Jenkins、Gitlab(Github)、Kubernetes等API的方式对应用进行操作。

将Consul的KV功能作为配置中心来使用,在开普勒云平台上可以直接调用Consul API进行操作,可以在配置文件决定是否启用Consul KV功能。

Jenkins目前只担任代码编译及将Docker镜像上传仓库的功能。开普勒通过调用JenkinsAPI来创建Job或Build Job,并监听Job状态。

开普勒平台还可调用Github或Gitlab API获取项目的分支及需要上线的tags。并将相关信息传给jenkins,Jenkins拉取代码并执行相关构建过程。

三、使用

平台调用Kubernetes API的资源及Jenkins API或告警都是以模版的方式进行处理,管理员可以根据自己公司所处的环境随意调整相关资源的模版。

除了对生产最基本的需求外,还增加了对测试环境测试人员的需求支持。

  • 应用克隆: 测试人员可能需要做到一个版本多套环境的场景。在平台可以假设一个空间就是一种场景,在一个空间下部署完所有应用之后,需要在其他空间下也生成一样的应用,为了方便操作,可以直接使用“工具集-克隆”功能完成一键克隆。
  • 调整容器时间: 金融产品应该都会遇到调整时间的问题。通常测试一个功能需要对服务的时间进行修改,由于Docker使用的是宿主机的内核时间,容器无法对内核时间进行调整,那就需要借助其他工具来完成这项工作。推荐使用一款开源的工具 https://github.com/wolfcw/libfaketime,我们将该工具编译到宿主机上,通过挂载的方式挂入容器里,就能对单个容器进行调整而不影响其他容器了。

开普勒云平台功能众多,下面挑几个大家比较关心、常用的功能进行简单介绍。(更多的功能介绍请查看文档 https://docs.nsini.com

  • 创建应用
  • 发布新版本
  • 日志采集
  • 监控告警
  • 持久化存储

3.1 创建应用

创建一个应用的流程非常简单,只需要填写一些简单的信息,管理员审核之后就会执行构建。应用升级只需要选择tags,然后执行构建就可以完成。

以创建一个Go应用为例:

Dockerfile:

  FROM golang:latest as build-env

ENV GO111MODULE=on
ENV BUILDPATH=github.com/kplcloud/hello
RUN mkdir -p /go/src/${BUILDPATH}
COPY ./ /go/src/${BUILDPATH}
RUN cd /go/src/${BUILDPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -v

FROM alpine:latest

COPY --from=build-env /go/bin/hello /go/bin/hello

WORKDIR /go/bin/
CMD ["/go/bin/hello"]

将以上Dockerfile放入项目目录,填写相关信息:

一个应用就创建完成了,管理员审核提交的信息是否合格,不合格便驳回;合格了就直接通过并进行部署。

部署应用会根据用户所提交的信息获取我们事先定义好的基础模版,再根据基础模版生成Kubernetes所能识别的资源,然后调用Kubernetes API创建这些资源。创建完成后再调用Jenkins API创建Job,最后执行构建。

Jenkins完成构建,并将Docker Image 上传完仓库之后,开普勒才会更新Kubernetes相关应用的版本。

在这个过程中若想加入更多操作,可以修改 JenkinsCommand模版。

3.2 发布新应用

构建应用的流程是通过创建应用提交一些信息进行处理。

  • 从git 仓库获取tags列表。
  • 调用jenkins API 将应用的相关参数及版本信息传给它并进行构建。
  • Jenkins Job执行Shell命令,执行docker build并上传至Docker Image仓库。
  • 平台监听到job已经成功执行,调用kubernetes API更新应用的Image地址。
  • 监听升级情况。
  • 发送通知。

以上是构建应用的后端流程,而前端就比较简单了,只需要在应用详情页点击"Build"按钮,在弹出的对话框中选择想应用的tags版本并提交就行了,如下图:

点击详情页的build日志选项卡,会显示最近的构建记录,点击左侧相应的版本,可以查看该版本的构建情况,也可以对正在构建的应用进行中断,如下图:

3.3 日志采集

我们的日志收集采用的是低耦合、扩展性强、方便维护和升级的方案。

  • 每个节点Filebeat收集宿主机日志。
  • 每个Pod注入Filebeat容器收集业务日志。

Filebeat会跟应用容器部署在一起,应用也不需要知道它的存在,只需要指定日志输入的目录就可以了。Filebeat所使用的配置是从ConfigMap读取,只需要维护好收集日志的规则。

如果配置了上面的采集器,那么它会向服务所在的Pod注入一个Filebeat采集器对应用服务的业务日志进行采集。把采集到的日志注入到kafka集群,然后logstash进行消息处理及格式化。

处理完后入到ES集群,最终我们就可以通过kibana查询到业务日志了。

Filebeat容器及filebeat的ConfigMap也可以通过模版的方式进行参数调整。

3.4 监控告警

应用监控告警也是非常重要的一个环节,我们采用Prometheus+Grafana的方案进行监控,Prometheus+AlertManager进行告警的处理。

AlertManager所抛出的告警信息会发送至开普勒云平台进行处理,若你在平台订阅了告警类型的消息则会发送至所订阅类型的相关工具。

我们可以在“个人设置-消息订阅设置”里选择需要订阅的类型及接收的工具:

以下是微信接收到的操作通知:

更多的教程请查阅我们提供的文档。 https://docs.nsini.com

3.5 持久化存储

Kubernetes集群管理员通过提供不同的存储类,可以满足用户不同的服务质量级别、备份策略和任意策略要求的存储需求。动态存储卷供应使用StorageClass来实现,允许存储卷按需被创建。
如果没有动态存储供应,Kubernetes集群的管理员将不得不通过手工的方式来创建新的存储卷。
通过动态存储卷,Kubernetes能够按照用户的需求,自动创建其需要的存储。

在菜单找到“配置与存储”->"持久化存储卷声明",选择应用的空间,并点击“创建”按钮,先创建一个存储卷,然后我们找到需要挂载持久化存储盘应用并进入详情页,找到“持久化存储”选项卡,挂载刚刚所创建的持久化存储卷就好了。

四、尾巴

开普勒平台目前已开源,并且已有演示平台可使用,提供完整文档供参考。文档详细地介绍了相关服务的搭建过程,同时,提供了多种部署方案。

作者:王聪

宜信技术学院

相关 [容器 应用] 推荐:

减少使用Java应用服务器,迎接Docker容器

- - ITeye资讯频道
【编者的话】随着Docker的发展,越来越多的应用开发者开始使用Docker. James Strachan写了一篇有关Java开发者如何使用Docker进行轻量级快速开发的文章. 他告诉我们,使用Docker和服务发现的机制,可以有效减轻Java运维人员的负担,进行项目的快速启动和持续迭代. 多年来,Java生态系统一直在使用应用服务器.

容器内应用日志收集方案

- - SegmentFault 最新的文章
应用日志的收集、分析和监控是日常运维工作重要的部分,妥善地处理应用日志收集往往是应用容器化重要的一个课题. Docker处理日志的方法是通过docker engine捕捉每一个容器进程的STDOUT和STDERR,通过为contrainer制定不同log driver 来实现容器日志的收集,缺省json-file log driver是将容器的STDOUT/STDERR 输出保存在磁盘上,然后用户就能使用docker logs 来进行查询.

将 Java 应用容器化改造并迁移到 Kubernetes 平台

- - IT瘾-dev
为了能够适应容器云平台的管理模式和管理理念,应用系统需要完成容器化的改造过程. 对于新开发的应用,建议直接基于微服务架构进行容器化的应用开发;对于已经运行多年的传统应用系统,也应该逐步将其改造成能够部署到容器云平台上的容器化应用. 本文针对传统的Java 应用,对如何将应用进行容器化改造和迁移到Kubernetes 平台上进行说明.

谷歌助力,快速实现 Java 应用容器化

- - IT瘾-tuicool
>>> 加入「后端圈」大家庭 (点击加入)<<<. Google 在 2018 年下旬开源了一款新的 Java 工具 Jib,可以轻松地将 Java 应用程序容器化. 通过 Jib,我们不需要编写 Dockerfile 或安装 Docker,通过集成到 Maven 或 Gradle 插件,就可以立即将 Java 应用程序容器化.

如何快速部署容器化应用

- - SegmentFault 最新的文章
摘要:容器化推行的过程中,研发、运维学习及使用成本都非常高,那有没有一款简单易用的平台呢. 本文介绍基于Kubernetes的应用管理平台-开普勒云平台. 为了快速适应和满足市场需求,小而快的应用越来越多,“这些零碎的应用如何部署、管理. 这时,将应用容器化,显然是一个非常不错的选择,但很多公司又都面临着一个同样的问题,那就是容器化推行难.

Java中的CopyOnWrite容器

- - 酷 壳 - CoolShell.cn
感谢  清英 同学的投稿. Copy-On-Write简称COW,是一种用于程序设计中的优化策略. 其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略. 从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet.

有赞容器化实践

- - SegmentFault 最新的文章
容器化已经成为一种趋势,它可以解决很多运维中的痛点,比如效率、成本、稳定性等问题,而接入容器的过程中往往也会碰到很多问题和不便. 在有赞最开始做容器化是为了快速交付开发测试环境,在容器化的过程中,我们碰到过容器技术、运维体系适配、用户使用习惯改变等各种问题,本文主要介绍有赞容器化过程中碰到的问题以及采取的方案.

美团容器平台架构及容器技术实践

- - 美团点评技术团队
本文根据美团基础架构部/容器研发中心技术总监欧阳坚在2018 QCon(全球软件开发大会)上的演讲内容整理而成. 美团的容器集群管理平台叫做HULK. 漫威动画里的HULK在发怒时会变成“绿巨人”,它的这个特性和容器的“弹性伸缩”很像,所以我们给这个平台起名为HULK. 貌似有一些公司的容器平台也叫这个名字,纯属巧合.

Web容器线程池机制小议

- - ITeye博客
从刚开始学习java,我们就被告知Java是一种支持多线程的语言,每条程序指令都会在一个线程中执行,而启动主线程的入口,是可执行类中的main方法. 我们可以在main方法或其调用的方法中创建新的线程以实现多线程、并发处理的效果. Java入门资料上介绍线程时往往会说明一点,创建线程不是免费的,是有成本的--对内存的消耗、对CPU切换调度的消耗都是成本,所以像数据库连接池这类“创建昂贵型”资源一样,创建好的线程优先被复用而不是每次都创建新的,这就是线程池出现的原因.

虚拟化 VS 容器化 哪家强?

- - ITeye资讯频道
【编者的话】以 Docker 为代表的容器技术一度被认为是虚拟化技术的替代品,然而这两种技术之间并不是不可调和的. 作者分别列举了容器技术以及虚拟化技术的优缺点,并提出将两者结合取长补短的解决方案. 容器为应用程序提供了隔离的运行空间:每个容器内都包含一个独享的完整用户环境空间,并且一个容器内的变动不会影响其他容器的运行环境.