Home / PostsPost

如何快速容器化应用

嘟噜聪2020/02/17 17:22:37 [Dockerfile] [Docker] [Golang] [Kubernetes] [k8s] [Devops] 534人已阅

简介 > 为了快速度适应市场需求,小而快的应用也越来越多,当这些零碎的应用如何部署、管理都是大家焦头烂额的问题。若全部上虚拟机,显然资源消耗太大。将应用容器化,显然是一个非常不错的选择,但很多发公司都面

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

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

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

开普勒云平台

以前我们有一篇介绍了我们在Kubernetes的实践方案,里有对开普勒平台做了一些基础的介绍:Kubernetes 容器云实践方案

经过一段时间的调整,我们终于把平台开源了: 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进行操作。可以在配置文件决定是否启用ConsulKV功能。

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

  1. 创建应用
  2. 发布新版本
  3. 日志采集
  4. 监控告警
  5. 持久化存储

创建应用

创建一个应用流程非常简单,只需要填写简单一些信息,管理员审核之后就会执行构建。

应用升级只需要选择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模版。

发布新应用

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

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

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

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

日志采集

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

  1. 每个节点Filebeat收集宿主机日志
  2. 每个Pod注入Filebeat容器收集业务日志

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

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

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

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

监控告警

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

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

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

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

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

持久化存储

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

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

尾巴

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

欢迎大家提交代码

很赞哦! (1)

文章评论

站点信息

  • 微信公众号