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 | cat >> /etc/sysctl.conf<<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是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个
新的镜像。
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新
的镜像开始工作了; - 对于运维人员:在部署时,可以实现应用的无缝移植
dockerfile内容详解
1 | # FROM : 指定基础镜像,要在哪个镜像建立 |
执行命令构建镜像
在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 |
微服务部署
微服务部署有两种方法:
- 手动部署:
首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚拟机并拷贝至JDK容器。 - 通过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 | systemctl daemon‐reload |
(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平台私服的搭建以及持续集成。