从0开始部署Rancher2.0到微服务容器部署与持续集成

Rancher是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。今天分享一下我从0开始部署Rancher2.0到微服务容器部署与持续集成的历程。

想要解锁更多新姿势?请访问我的个人博客https://tengshe789.github.io/(😘

docker安装

请看我上篇博文

容器下安装rancher

基础环境配置

切换到受支持的docker版本

1
sudo ros engine switch docker-17.03.2-ce

关闭防火墙(可选)或者放行相应端口

对于刚刚接触Rancher的用户,建议在关闭防火墙的测试环境或桌面虚拟机来运行rancher,以避免出现网络通信问题。

  • 关闭防火墙

    1、CentOS

    systemctl stop firewalld.service && systemctl disable firewalld.service

    2、Ubuntu

    ufw disable

  • 端口放行

    端口放行请查看端口需求

CentOS关闭selinux

1
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

配置主机时间、时区、系统语言

  • 查看时区

    date -R或者timedatectl

  • 修改时区

    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

  • 修改系统语言环境

    sudo echo 'LANG="en_US.UTF-8"' >> /etc/profile;source /etc/profile

  • 配置主机NTP时间同步

Kernel性能调优

1
2
3
4
5
6
7
cat >> /etc/sysctl.conf<<EOF
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.neigh.default.gc_thresh1=4096
net.ipv4.neigh.default.gc_thresh2=6144
net.ipv4.neigh.default.gc_thresh3=8192
EOF

Hosts

配置每台主机的hosts(/etc/hosts),添加host_ip $hostname/etc/hosts文件中。

安装运行rancher

网络组件

安装rancher以后可能会碰到一些莫名其妙的连接问题,譬如找不到命名虚拟机下能使用curl命名访问其他虚拟机,但是容器却不能访问其他容器,这时候就需要先安装weave网络组件了。

1
docker pull weaveworks/weave-npc:2.5.0

正式安装

可以参考如下命令安装rancher

1
sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher

当然命令可以扩展,详情规则如下:

1
$sudo docker run -d -v <主机路径>:/var/lib/rancher/ --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher:stable

登陆rancher

Rancher Server容器启动很快速,不到一分钟你就可以通过https://<server_ip>访问Rancher UI。

第一次登录会要求设置管理员密码,默认管理员账号为: admin。一旦Rancher Server成功安装,用户界面将指导你添加第一个集群

创建K8S集群

首先,右下角找语言选项,选中文。点击添加集群。

添加集群

接下来写一下集群的名称,点开如图所示的选项,把命令复制一下,粘贴到宿主机中运行。

注意,rancher2.0基于k8s,而k8s需要etcd节点和control节点。现在,rancher会自动帮你勾选上worker节点,如果你是单机环境,必须要全部勾选这三个主机角色在复制命令。

添加集群

Docker私有仓库

私有仓库搭建与配置

(1)拉取私有仓库镜像(此步省略)

1
docker pull registry

(2)启动私有仓库容器

1
docker run -di --name=registry -p 5000:5000 registry

(3)打开浏览器 输入地址http://192.168.190.137:5000/v2/_catalog 看到

1
2
3
{
repositories: [ ]
}

表示私有仓库搭建成功并且内容为空

(4)修改docker的daemon.json

1
vim /etc/docker/daemon.json

添加如下内容:

1
2
3
{
"insecure-registries":[<server ip>:5000]
}

(5)重启docker 服务
注意,如果上面的daemon.json格式出错,此使docker会报错,启动起不来。请仔细查看。

1
systemctl restart docker

镜像上传至私有仓库

(1)标记此镜像为私有仓库的镜像

1
docker tag <imgName> <server ip>:5000/<仓库 name>

(2)再次启动私服容器

1
docker start registry

(3)上传标记的镜像

1
docker push <server ip>:5000/<仓库 name>

更多

私有仓库经历过版本迭代,也有授权认证等功能,想要了解更多资料请看博文,https://www.cnblogs.com/wade-luffy/p/6590849.html

dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个
新的镜像。

  1. 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
  2. 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新
    的镜像开始工作了;
  3. 对于运维人员:在部署时,可以实现应用的无缝移植

dockerfile内容详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# FROM : 指定基础镜像,要在哪个镜像建立
FROM anapsix/alpine-java:8_server-jre_unlimited ## 我要的微服务需要依赖jre环境
# 容器卷,持久化的环境
VOLUME /tmp
# MAINTAINER:指定维护者信息
MAINTAINER randyvan007@qq.com
# RUN:在镜像中要执行的命令 这个命名是同步容器内时间,防止部分操作出错的。不需要可以不执行
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

RUN mkdir -p /miaosha-redis
# WORKDIR:指定当前工作目录,相当于 cd
WORKDIR /miaosha-redis
# EXPOSE:指定容器要打开的端口
EXPOSE 8080
# ADD:相当于 COPY,但是比 COPY 功能更强大 COPY :复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的
ADD ./miaosha-redis/target/miaosha-redis.jar ./
# 容器启动时执行指令
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
# 容器启动时执行指令
CMD ["--spring.profiles.active=test"]

执行命令构建镜像

dockerfile的目录下,输入

1
docker build [options] PATH | URL

  • docker build: 用 Dockerfile 构建镜像的命令关键词。

  • [OPTIONS] : 命令选项,常用的指令包括 -t 指定镜像的名字,
    -f 显示指定构建镜像的 Dockerfile 文件(Dockerfile 可不在当前路径下),
    如果不使用 -f,则默认将上下文路径下的名为 Dockerfile 的文件认为是构建镜像的 “Dockerfile” 。

  • 上下文路径|URL: 指定构建镜像的上下文的路径,构建镜像的过程中,可以且只可以引用上下文中的任何文件 。

查看镜像是否建立完成

1
docker images

创建容器

1
docker run -di --name=景象名称 /bin/bash

微服务部署

微服务部署有两种方法:

  1. 手动部署:
    首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚拟机并拷贝至JDK容器。
  2. 通过Maven插件自动部署。
    对于数量众多的微服务,手动部署无疑是非常麻烦的做法,并且容易出错。所以我们这里学习如何自动部署,这也是企业实际开发中经常使用的方法。

Maven插件自动部署步骤:

(1)修改宿主机的docker配置,让其可以远程访问

1
vi /lib/systemd/system/docker.service

其中ExecStart=后添加配置 ‐H tcp://0.0.0.0:2375 ‐H unix:///var/run/docker.sock

(2)刷新配置,重启服务

1
2
3
systemctl daemon‐reload
systemctl restart docker
docker start registry

(3)微服务的maven工程pom.xml 增加配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
	<build>
<finalName>${project.name}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<finalName>${project.build.finalName}</finalName>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.12</version>
<configuration>
<!-- 注意imageName一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 -->
<!-- 详见:https://github.com/spotify/docker-maven-plugin Invalid repository name ... only [a-z0-9-_.] are allowed-->
<imageName>${registry.url}/${project.name}:0.0.1</imageName>
<dockerHost>${docker.url}</dockerHost>
<dockerDirectory>${project.basedir}</dockerDirectory>
<baseImage>java</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>
<serverId>docker-hub</serverId>
<registryUrl>https://index.docker.io/v1/</registryUrl>
</configuration>
</plugin>

<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
<configuration>
<!--上下文路径配置,此处设置为项目根路径-->
<contextDirectory>${project.basedir}</contextDirectory>
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
<repository>${registryUrl}/hush/${project.build.finalName}</repository>
<tag>${imageVersion}</tag>
<!--作为Dockerfile文件传入-->
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<target>${maven.compiler.target}</target>
<source>${maven.compiler.source}</source>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>

使用以上插件可以自动生成dockerfile

(5)在windows的CMD下,进入微服务工程所在的目录,输入以下命令,进行打包和上传镜像

1
mvn clean package docker:build -DpushImage

(6)去镜像库查看镜像
浏览器访问http://<server ip>:5000/v2/_catalog ,输出了我们上一步命名的镜像名称,则上传成功。

(7)在虚拟机查看镜像与启动容器

1
docker images

打完以后显示镜像名称。下面该启动容器了!

1
docker run -di --name=服务名称 -p 容器内服务的端口号:容器发布的端口号 <server ip>:5000/镜像名称

持续集成持续部署

什么是持续集成

持续集成 Continuous integration ,简称CI
随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来,敏捷(Agile)在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。
持续集成正是针对这一类问题的一种软件开发实践。它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。

持续集成的特点

它是一个自动化的周期性的集成测试过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,无需人工干预;需要有专门的集成服务器来执行集成构建;需要有代码托管工具支持,我们下一小节将介绍Git以及可视化界面Gogs的使用

持续集成作用

保证团队开发人员提交代码的质量,减轻了软件发布时的压力;持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;

rancher和持续集成

rancher支持与GitHub平台与GitLab平台持续集成。接下来我会新开篇文章讲讲git平台私服的搭建以及持续集成。

参考资料

rancher官方文档

-------------本稿が終わる感谢您的阅读-------------