持续集成(CI)和容器管理 学习笔记

506 阅读1分钟

1. DockerMaven插件

微服务部署方式:

  1. 手动部署:基于源码打包生成jar,上传到服务器。
  2. 通过Maven插件自动部署。

1.1 Maven插件自动部署步骤:

  1. 修改宿主机docker配置,让其可以远程访问。在docker.service文件的ExecStart=后添加-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
vi /lib/systemd/system/docker.service	

在这里插入图片描述

  1. 刷新配置,重启服务
systemctl daemon-reload
sudo systemctl restart docker
docker start registry

  1. pox.xml 文件中添加以下内容
<build>
    <finalName>dockerDemo</finalName>
    <plugins>
        
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        
        <plugin>
            
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>0.4.13</version>
            
            <configuration>
                
                <imageName>192.168.2.11:5000/${project.artifactId}:${project.version}</imageName>
                
                <baseImage>jdk1.8</baseImage>
                
                <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
                <dockerHost>http://192.168.2.11:2375</dockerHost>
            </configuration>
        </plugin>
    </plugins>
</build>

以上配置会自动生成 Dockerfile 文件

FROM jdk1.8
ADD dockerDemo.jar /
ENTRIPOINT ["java","-jar","/dockerDemo.jar"]

  1. 在cmd下,进入项目工程,进行打包和上传镜像。
mvn clean package docker:build -DpushImage

示例:

[INFO] Building image 192.168.2.11:5000/springboot-demo:0.0.1-SNAPSHOT
Step 1/3 : FROM jdk1.8

 ---> 79f8c221d4f6
Step 2/3 : ADD /dockerDemo.jar //

 ---> d0a85948e94f
Step 3/3 : ENTRYPOINT ["java","-jar","/dockerDemo.jar"]

 ---> Running in ded9a19061e8
Removing intermediate container ded9a19061e8
 ---> 61d57ebbc410
ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built 61d57ebbc410
Successfully tagged 192.168.2.11:5000/springboot-demo:0.0.1-SNAPSHOT
[INFO] Built 192.168.2.11:5000/springboot-demo:0.0.1-SNAPSHOT
[INFO] Pushing 192.168.2.11:5000/springboot-demo:0.0.1-SNAPSHOT
The push refers to repository [192.168.2.11:5000/springboot-demo]
9f8f970adb5a: Pushed
5739a69f0bb7: Mounted from jdk1.8
f967d613a659: Mounted from jdk1.8
174f56854903: Mounted from jdk1.8
0.0.1-SNAPSHOT: digest: sha256:39f341edef265ddfbfab7227c63ffa12e41862e5601198f7a530cbc29061ab79 size: 1161
null: null
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  37.979 s
[INFO] Finished at: 2021-11-01T23:16:33+08:00
[INFO] --------------------------------------------------------

  1. 进入宿主机centos查看镜像:docker images
  2. 启动容器:
docker run -di --name=dockerDemo -p 88:8080 192.168.2.11:5000/springboot-demo:0.0.1-SNAPSHOT

  1. 访问:http://192.168.2.11:88/hello

注:这里编写了一个SpringBoot的程序。

@RestController
public class HiController {
    @RequestMapping("/hello")
    public String k8s(){
        return "<h1>HELLO</h1> <h1>HUATHY</h1>";
    }
}

2. 持续集成与Jenkins

2.1 什么是持续集成

  1. 持续集成Continuous integration,简称CI
  2. 如何更好的协同工作,确保软件开发质量。敏捷开发,如何在不断变化的需求中保证质量。
  3. 持续集成是针对此类问题的一种开发实践。倡导团队经常集成。每次集成都通过自动化构建来验证,包括自动编译、发布、测试,从而尽快的发现集成的错误,使团队更快的开发内聚的软件。
  4. 持续集成的特点:
    • 是一个自动化的周期性集成测试过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成,无需人工干预。
    • 需要有专门的集成服务器来执行集成构建。
    • 需要有代码托管工具支持,eg:GitHub、Gitee、GitLab、Gogs。
  5. 持续集成的作用:
    • 保证团队开发人员代码提交的质量,减轻软件发布时的压力。
    • 持续集成中任何一个环节都是自动完成,无需太多人工干预,有利于减少重复过程以节省时间、费用、工作量。

2.2 Jenkins简介

  1. 开源持续集成工具。
  2. 特点:
    • 易安装:java -jar jenkins.war即可运行。无需数据库。
    • 易配置:提供友好的GUI界面。
    • 变更支持:Jenkins能从(SVN/CVS)中获得产生代码更新列表,并输出到编译输出信息中。
    • 支持永久连接:用户是通过web来访问Jenkins的,web地址是永久的,可以在各种文档中使用地址。
    • 集成E-Mail,RSS,IM:当完成一次集成时,可以通过这些工具实时告诉集成结果。
    • Junit/TestNG测试报告:以图表等形式提供详细的测试报表功能。
    • 支持分布式构建:Jenkins可以把集成构建等工作分发到多台计算机中完成。
    • 文件指纹信息:Jenkins会保存哪次集成构建产生了哪些jars文件, 哪一次集成构建使用了哪个版本的jars文件等构建记录;
    • 支持第三方插件:使得Jenkins变得越来越强大。

2.3 Jenkins安装

2.3.1 JDK安装

  1. 将jdk1.8安装包上传至服务器(这里我下载的是Oracle的Jdk8版本)
    附下载地址:www.injdk.cn/
  2. 执行安装命令rpm -ivh jdk-8u301-linux-x64.rpm
    RPM方式安装的JDK其根目录为/usr/java/jdk1.8.0_301-amd64。会自动配置环境。

示例:

[root@localhost ~]
警告:jdk-8u301-linux-x64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ec551f03: NOKEY
准备中...                          
正在升级/安装...
   1:jdk1.8-2000:1.8.0_301-fcs        
Unpacking JAR files...
	tools.jar...
	plugin.jar...
	javaws.jar...
	deploy.jar...
	rt.jar...
	jsse.jar...
	charsets.jar...
	localedata.jar...

2.3.2 开始Jenkins安装

  1. 下载Jenkin镜像上传服务器: mirrors.tuna.tsinghua.edu.cn/jenkins/red…
    或使用命令
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.249.3-1.1.noarch.rpm

  1. 安装Jenkins rpm -ivh jenkins-2.249.3-1.1.noarch.rpm
[root@localhost softPkg]
警告:jenkins-2.249.3-1.1.noarch.rpm:V4 RSA/SHA512 Signature, 密钥 ID 45f2c3d5: NOKEY
准备中...                          
正在升级/安装...
   1:jenkins-2.249.3-1.1              

  1. 配置Jenkins
vi /etc/sysconfig/jenkins

JENKINS_PORT="8888"		
JENKINS_USER="root"	


在这里插入图片描述
同时还要改一下 vi /etc/init.d/jenkins 配置文件。将/usr/bin/java修改为jdk安装目录。
在这里插入图片描述

2.3.3 启动Jenkins

  1. 启动命令sudo service jenkins start
  2. 访问 http://192.168.2.11:8888/
    在这里插入图片描述
  3. 查看密码并解锁
[root@localhost /]
8a8c90252fb493f9918d35beba5ed2

  1. 选择左边的安装推荐的插件,进入入门界面
    在这里插入图片描述
  2. 创建一个管理员账户。
  3. 安装配置完成。

2.4 Jenkins插件安装

在Jenkins主界面下,找到系统管理(管理Jenkins)并进入,选择管理插件,安装maven插件。
在这里插入图片描述

2.5 全局工具配置

2.5.1 安装maven与本地仓库

  1. 下载并将Maven压缩包上传至服务器
    dlcdn.apache.org/maven/maven…
  2. 解压: tar zxvf apache-maven-3.8.3-bin.tar.gz
  3. 移动目录:mv apache-maven-3.8.3 /usr/local/maven
  4. 编辑setting.xml配置文件,vi /usr/local/maven/conf/settings.xml,配置本地仓库目录,内容如下:
<localRepository>/usr/local/maven/maven_jar</localRepository>

  1. 将开发环境的本地仓库上传到服务器maven仓库。这么操作是为了后面打包的时候不必要的重新下载,缩短打包时间。

2.5.2 全局工具配置

  1. 选择系统管理(管理Jenkins),全局工具配置。
    在这里插入图片描述
  2. JDK配置:
    在这里插入图片描述3. Maven配置:在这里插入图片描述
  3. Git配置:先执行 yum -y install git 命令安装git
    注意:使用yum安装的git路径是/usr/bin/git

2.6 代码上传到服务器

2.6.1 Gogs搭建与配置

  1. 下载镜像:docker pull gogs/gogs
[root@localhost java]
Using default tag: latest
latest: Pulling from gogs/gogs
ddad3d7c1e96: Pull complete 
98bfa715d475: Pull complete 
41833e5090f7: Pull complete 
0eaa2e62e844: Pull complete 
099dafadbd3c: Pull complete 
a65e863c4361: Pull complete 
6f047877c3f9: Pull complete 
Digest: sha256:1c42233010268ef058cd98ca42e4940d20ff2276f01a7db83f9114b1dd8e17ed
Status: Downloaded newer image for gogs/gogs:latest
docker.io/gogs/gogs:latest

  1. 创建容器:docker run -di --name=gogs -p 10022:22 -p 3000:3000 -v /var/gogsdata:/data gogs/gogs

[root@localhost java]
WARNING: IPv4 forwarding is disabled. Networking will not work.
ffa8059dfe7893e2ac6ee9f1eb38d5fd3726e497448099ca77d26971a73ea880

  1. 安装提示进行基本配置与账号注册登录。
    在这里插入图片描述
  2. 点击右上角的+号可以创建一个新的仓库。并按照创建后的提示上传代码。
    在这里插入图片描述

2.7 任务创建与执行

  1. 回到Jenkins首页,点击新建Item,输入名称,选择新建一个Maven项目。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3 容器管理工具Rancher

3.1 什么是Rancher

Rancher是一个企业级全栈化容器部署及管理平台。为容器提供基础架构服务、CNI兼容的网络服务、存储服务、主机管理、负载均衡、防火墙…并可以使上述服务跨越公有云、私有云、虚拟机、物理机,实现一键式部署和管理。

3.2 Rancher安装

  1. 下载Rancher镜像: docker pull rancher/server
  2. 创建Rancher容器: docker run -di --name=rancher -p 18080:8080 rancher/server
  3. 等待容器启动后,访问宿主机IP:18080,可以看到欢迎界面。

3.3 Rancher初始化

3.3.1 添加环境

  1. 作用:起到配置隔离的作用。开发环境、测试环境、生产环境。
  2. 配置步骤:Default菜单 -> 环境管理 -> 添加环境 -> 填写名称与描述 -> 创建
    在这里插入图片描述

3.3.2 添加主机

选择基础架构 -> 主机菜单 -> 点击添加主机 -> 拷贝脚本 复制到服务器执行。
在这里插入图片描述
在这里插入图片描述

3.3.3 添加应用

  1. 应用指的是某一开发的项目。
  2. 添加步骤:点击应用 -> 选择用户 -> 点击添加应用

3.4 应用部署

3.4.1 mysql部署

在这里插入图片描述

3.4.2 RabbitMQ部署

镜像:rabbitmq:management
端口映射:5671 5672 4369 15671 15672 25672
在这里插入图片描述
访问:宿主机IP:15672

3.4.3 Redis部署

在这里插入图片描述

3.4.4 微服务部署

注:如果已经进行过的步骤可以省略

  1. 搭建私有仓库

    • 启动私有仓库容器 docker run -di --name=registry -p 5000:5000 registry打开宿主机IP:5000/v2/_catalog,看到{"repositories":[]}表示成功。
    • 修改 daemon.json
      vi /etc/docker/daemon.json 添加以下内容并保存退出。
    {"insecure-registries":"宿主机IP:5000"}
    
    
  2. 修改docker配置,允许远程访问。
    vi /lib/systemd/system/docker.service,在ExeStart= 后添加如下配置信息:``` -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

    修改之后要刷新配置,重启服务 systemctl daemon-reload sudo systemctl restart docker docker start registry

  3. 修改微服务工程,添加DockerMaven插件

  4. 添加微服务项目

  5. 测试微服务,打开地址。

  6. 另外如果发现端口填写错误,可以点击升级按钮,进行修改配置。

注意:这里的镜像名称和版本要填写正确,否则可能报错没有合适的镜像,或docker要登录。 附录:错误日志如下: ErrTest (Failed to allocate instance [container:1i149]: Bad instance [container:1i149] in state [error]: Error response from daemon: no such image: index.docker.io/ErrTest: invalid reference format: repository name must be lowercase)

在这里插入图片描述
在这里插入图片描述

3.5 扩容与缩容

3.5.1 扩容

  1. 在rancher将创建的demo服务删除
  2. 重新创建demo服务,不设置端口映射
    在这里插入图片描述
  3. API -> Webhooks -> 扩缩容服务 -> 扩容 -> 选择需要扩容的服务 -> POST请求触发地址 在这里插入图片描述
    在这里插入图片描述

3.5.2 负载均衡器

上面容器完成了扩容,但是要怎么访问呢?Rancher提供了负载均衡器。
在这里插入图片描述
在这里插入图片描述

4. influxDB

4.1 什么是influxDB

是一个分布式时间序列数据库。常用于存储系统监视数据,而不应用于系统应用开发。运维常使用的数据库。
cAdvisor仅现实实时信息,但不存储监视数据。因此,需要提供时序数据库来存储cAdvisor组件所提供的监控信息。以便显示除实时信息以外的时序数据。

4.2 influxDB安装

  1. 下载镜像:docker pull tutum/influxdb
  2. 创建容器:(端口概述:8083-web访问端口;8086-数据写入端口)
docker run -di -p 8083:8083 -p 8086:8086 \ 
	--expose 8090 --expose 8099 \
	--name=influxsrv tutum/influxdb

  1. 访问:宿主机IP:8083

4.3 influxDB常用操作

4.3.1 创建数据库

输入:CREATE DATABASE "cadvisor" -> 回车执行 -> 使用SHOW DATABASES查询数据库
在这里插入图片描述
在这里插入图片描述

4.3.2 创建用户并授权

  1. 创建用户:``` CREATE USER "cadvisor" WITH PASSWORD ' a' WITH ALL PRIVILEGES

  2. 查看用户:``` SHOW USERS

  3. 用户授权:grant privilege on databaseName to userName```

    grant all privileges on cadvisor to cadvisor grant WRITE on cadvisor to cadvisor grant READ on cadvisor to cadvisor

4.3.3 查看采集的数据

切换到cadvisor数据库,使用以下命令查看采集的数据

SHOW MEASUREMENTS

现在我们还没有数据,如果想采集系统的数据,我们需要使用Cadvisor软件来实现。

5 cAdvisor

5.1 什么是cAdvisor

cAdvisor是Google开源用于监控容器基础设施应用的监控工具。不需要任何配置就可以通过运行在docker容器上来监控docker容器。且可以监控docker主机。数据存放于influxDB。

5.2 cAdvisor安装

  1. 下载镜像``` docker pull google/cadvisor

  2. 创建容器``` docker run --volume=/:/rootfs:ro
    --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro
    --volume=/var/lib/docker:/var/lib/docker:ro
    --publish=8080:8080 --detach=true
    --link=influxsrv:influxsrv --name=cadvisor google/cadvisor
    -storage_driver=influxdb -storage_driver_db=cadvisor
    -storage_driver_host=influxdbsrv:8086

  3. web前端访问地址:宿主机IP:8080/containers

  4. 再次查看influxDB,可以看到里面已经有很多数据了。

  5. 性能指标含义参照如下图所示。引用自:blog.csdn.net/liumiaocn/a…

  6. 此处附录一本文踩坑记录第二点。如果启动不起来可提供参考!

在这里插入图片描述

6 Grafana

6.1 什么是Grafana

Grafana是一个可视化面板( Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器。支持Graphite、zabbix、InfluxDB、 Prometheus和OpenTSDB作为数据源。
Grafana主要特性:灵活丰富的图形化选项;可以混合多种风格;支持白天和夜间模式;多个数据源。

6.2 Grafana安装

  1. 下载镜像``` docker pull grafana/grafana

  2. 创建容器``` docker run -d -p 13000:3000 -e INFLUXDB_HOST=influxsrv
    -e INFLUXDB_PORT=8086 -e INFLUXDB_NAME=cadvisor
    -e INFLUXDB_NAME=cadvisor -e INFLUXDB_PASS=cadvisor
    --link influxsrv:influxsrv --name grafana grafana/grafana

  3. 访问宿主机IP:13000 。用户名密码均为admin。
    结果发现了这个问题。问题的原因是浏览器不兼容。升级到最新的谷歌,或者使用其他浏览器打开试试。
    在这里插入图片描述

6.3 Grafana的使用

6.3.1 添加数据源

  1. 点击设置 -> DataSource -> add data source -> Time series databases -> InfluxDB
    在这里插入图片描述
    在这里插入图片描述
  2. 依次配置名称、URL、数据库名、用户名、密码。
    在这里插入图片描述

6.3.2 添加仪表盘

  1. Dashboards -> Manage -> New dashboard -> Add an empty panel ->
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

6.3.3 预警通知设置

  1. Alerting -> Notification channels -> Add channel
    在这里插入图片描述
  2. 进行通知配置
    在这里插入图片描述
  3. 通知的使用:进入Dashboards -> 选择刚创建的面板 -> 点击Alert -> 进行配置
    在这里插入图片描述

附录及说明:

附录一:踩坑记录

一、Jenkins配置完成后,发现Jenkins构建出错Cannot run program "git"

  1. 问题原因:Jenkins中的git配置错误。
  2. 关键信息:
    Cannot run program "git" (in directory "/var/lib/jenkins/workspace/bookstore"): error=2, 没有那个文件或目录
  3. 错误日志:
Started by user huathy
Running as SYSTEM
Building in workspace /var/lib/jenkins/workspace/bookstore
The recommended git tool is: NONE
No credentials specified
Cloning the remote Git repository
Cloning repository http://192.168.2.11:3000/huathy/bookstore_springBoot.git
 > git init /var/lib/jenkins/workspace/bookstore 
ERROR: Error cloning remote repo 'origin'
hudson.plugins.git.GitException: Could not init /var/lib/jenkins/workspace/bookstore
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$5.execute(CliGitAPIImpl.java:997)
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$2.execute(CliGitAPIImpl.java:752)
	at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1221)
	at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1299)
	at hudson.scm.SCM.checkout(SCM.java:505)
	at hudson.model.AbstractProject.checkout(AbstractProject.java:1206)
	at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:574)
	at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:86)
	at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:499)
	at hudson.model.Run.execute(Run.java:1894)
	at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:543)
	at hudson.model.ResourceController.execute(ResourceController.java:97)
	at hudson.model.Executor.run(Executor.java:428)
Caused by: hudson.plugins.git.GitException: Error performing git command: git init /var/lib/jenkins/workspace/bookstore
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2457)
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2380)
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2376)
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:1923)
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$5.execute(CliGitAPIImpl.java:995)
	... 12 more
Caused by: java.io.IOException: Cannot run program "git" (in directory "/var/lib/jenkins/workspace/bookstore"): error=2, 没有那个文件或目录
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
	at hudson.Proc$LocalProc.<init>(Proc.java:252)
	at hudson.Proc$LocalProc.<init>(Proc.java:221)
	at hudson.Launcher$LocalLauncher.launch(Launcher.java:996)
	at hudson.Launcher$ProcStarter.start(Launcher.java:508)
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2443)
	... 16 more
Caused by: java.io.IOException: error=2, 没有那个文件或目录
	at java.lang.UNIXProcess.forkAndExec(Native Method)
	at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
	at java.lang.ProcessImpl.start(ProcessImpl.java:134)
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
	... 21 more
ERROR: Error cloning remote repo 'origin'
Finished: FAILURE

二、docker run启动cAdvisor失败,docker ps不显示

  1. 我们利用 docker logs cadvisor 命令来查看错误日志
  2. 检查发现报错问题:flag provided but not defined: -storeage_driver_db 系参数没有指定,这里是我一开始写错了的问题。修改容器创建命令,再次启动。
[root@localhost ~]
flag provided but not defined: -storeage_driver_db
Usage of /usr/bin/cadvisor:
  -storage_driver_db string
        database name (default "cadvisor")


附录二:说明

本文所采用环境:jdk1.8,centos7,VM15,周志明老师的凤凰架构中的系统做案例。

本文引用文章地址

  1. Monitor:单节点监控之Cadvisor
  2. Fenix’s BookStore后端:以单体架构实现
    // TODO 未完待续

本文使用 文章同步助手 同步