#项目简介 本项目是一个简单的 SpringBoot的WEB项目,用maven编译出jar包,可以直接用java命令执行后启动内置的Tomcat服务。主要用于DEMO Java 项目打出Docker镜像,上传至uhub,然后自动发布到UK8S的全流程。同时,项目中也配置了相应的日志收集以及性能监控所需要的配置文件。
##功能清单
- 支持自动的CI/CD全流程
- 演示自定义的JMX计数器,然后通过 JMX_Exportor暴露,支持Prometheus通过 Metrics查询
- 演示通过 SideCar方式由FileBeat 向Logstash上报APP日志,这里我们用Tomcat Access Log演示
##环境简介
- 一台UHost,安装Docker、JDK、Maven、GitLab runner、Jenkins Slave。 其中GitLab Runner用户与K8S的Master作了ssh互信,可以直接在Gitlab-runner用户下通过 ssh k8s-master kubectl 命令对K8S进行执行。 Docker 中运行的包括 a. Gitlab Docker b. Jenkins Docker
- 一个K8S集群,有default、preproduct、 product三个Namespace,分别模拟应于集成环境、预发布环境、生产环境
- UHub,用于存放Docker镜像
##CI/CD流程简介
项目通过 GitLab Runner的来实现CI/CD,整体流程可以参考GitFlow。在Developer分支上完成开发同时自动部署到K8S的default namespace;在分Developer完成测试以后,提出Merge request;在项目负责人通过以后,打上Tag后自动升级到预发布环境;在预发布环境测试完成后,手工触发部署任务,将相应的版本部署到生产环境。 相应的实现可以参考.gitlab-ci.yaml文件
本项目也提供了一个Jenkins File用于演示如何在Jenkins Pipeline中增加相应的Stage来完成Docker镜像打包的过程。如果你仍然在用SVN或者无法迁移到GitLab Runner,则可以参考这个文件。
应用日志采用tomcat的access 日志来演示,主要流程是在Tomcat中生成accesslog,然后由filebeat发送到logstash进行分析以后再发给ElasticSearch进行最终处理。 架构上包括:
- APP和Filebeat一起作为SideCar,运行在K8S里;
- LogStash Server。在DMEO配置里是运行在UHOST;商用环境中看各自的情况
- Elastic Search 使用用UES
- DockerFile中的CMD一项,有--spring.config.location=/etc/appconfig/hello.properties 指定配置文件在容器中的路径为/etc/appconfig/hello.properties
- 容器中的/etc/appconfig/hello.properties 为K8S的ConfigMap,配置文件为项目中的yaml/app-configmap.yml
- 在hello.properties文件里配置了SpringBoot产生Tomcat 日志的方式,存贮目录为/accesslog
- FileBeat的配置也是K8S的ConfigMap,配置文件为yaml/filebeat-config.yaml,在这个文件里配置了FileBeat的对应的LogStash的服务器地址
- hello_world_filebeat_template.yml是配置app和filebeat作为Sidecar运行的配置文件,包括了ConfigMap的实际 Mount点信息以及两个容器共用 emptydir{}作为配置
- logstash_pipeline.conf是logstash的配置文件,这个文件里配置了UES的地址,放到LogStac应用的/etc/logstash/conf.d 目录下
系统日志通过 DeamonSet方式收集,配置文件不包括在本项目中
参考ucloud官网 UK8S文档的方式安装
在项目中,我直接采用了JMX_Export的方式向Prometheus暴露监控数据,这样扩展性相对好,在增加要监控的应用数据时,只需要注册相应的MBean即可。 要注意的点是配置文件中相应的端口,JMX_Export是采用额外的端口对外提供Metrics,配置在DockerFile的CMD一行中。 JMX_Export的配置文件为 yaml/javaagent.yaml
项目中亦提供了相应的自定义JMX MBean,计数器采用了TimerTask的方式来随机增加。 相应的代码
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
List< MBeanServer > servers = MBeanServerFactory.findMBeanServer(null);
System.out.println("Found MBean Servers : "+ servers);
for (MBeanServer server:servers){
try {
server.registerMBean( jmx_bean , new ObjectName("hello_bean:name=helloworld" ));
} catch (InstanceAlreadyExistsException e) {
e.printStackTrace();
} catch (MBeanRegistrationException e) {
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
e.printStackTrace();
} catch (MalformedObjectNameException e) {
e.printStackTrace();
}
}
以及同目录下对应的HelloworldMBean.java的代码。