从0开始部署Rancher2.0到微服务容器部署与持续集成 | tEngSHe789の小站

标签: | 发表时间:2020-04-05 21:42 | 作者:
出处:https://blog.tengshe789.tech

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

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

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 : 指定基础镜像,要在哪个镜像建立            
FROManapsix/alpine-java:8_server-jre_unlimited## 我要的微服务需要依赖jre环境
# 容器卷,持久化的环境
VOLUME/tmp
# MAINTAINER:指定维护者信息
MAINTAINER [email protected]
# 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官方文档

相关 [rancher2 微服务 容器] 推荐:

微服务和DevOps和容器关系(12.28)

- - 人月神话的BLOG
前面自己写过很多微服务,DevOps,容器化PaaS平台方面的文章,今天再梳理下几者之间的关系问题. 首先看下微服务,我们把微服务里面的一些关键组件拆分出来,其中包括了注册中心,配置中心,网关,限流熔断,服务链监控,可以看到这些组件都是可以独立的关键组件. 其次我们看下DevOps平台,在我原来的介绍里面也可以看到,我们将DevOps平台做为一个大的支撑平台,但是拆分后可以看到里面包括了敏捷研发管理,持续集成,容器化PaaS,测试平台等几个关键内容.

个推 Node.js 微服务实践:基于容器的一站式命令行工具链

- - DiyCode - 致力于构建开发工程师高端交流分享社区社区
由于工程数量的快速增长,个推在实践基于 Node.js 的微服务开发的过程中,遇到了如下问题:. 每次新建项目都需要安装一次依赖,这些依赖之间基本相似却又有微妙的区别;. 每次新建项目都要配置一遍相似的配置(比如 tsconfig、lint 规则等);. 本地 Mac 环境与线上 Docker 内的 Linux 环境不一致(尤其是有 C++ 依赖的情况).

从0开始部署Rancher2.0到微服务容器部署与持续集成 | tEngSHe789の小站

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

初识微服务

- - ITeye博客
微服务架构越来越火,有必要学习一下. 软件开发过程中碰到什么问题. 一个简单的应用会随着时间推移逐渐变大. 在每次的sprint中,开发团队都会面对新“故事”,然后开发许多新代码. 几年后,这个小而简单的应用会变成了一个巨大的怪物. 一旦你的应用变成一个又大又复杂的怪物,那开发团队肯定很痛苦. 敏捷开发和部署举步维艰,其中最主要问题就是这个应用太复杂,以至于任何单个开发者都不可能搞懂它.

谈微服务架构

- - 人月神话的BLOG
其实在前面很多文章谈到SOA,特别是系统内的SOA和组件化的时候已经很多内容和微服务架构思想是相同的,对于微服务架构,既然出现了这个新名称,那就再谈下微服务架构本身的一些特点和特性. 从这个图可以看到微服务架构的第一个重点,即业务系统本身的组件化和服务化,原来开发一个业务系统本身虽然分了组件和模块,但是本质还是紧耦合的,这关键的一个判断标准就是如果要将原有的业务系统按照模块分开部署到不同的进程里面并完成一个完整业务系统是不可能实现的.

微服务性能模式

- - 互联网 - ITeye博客
前言:基于微服务系统越来越普遍. 下面我们就来看看五种常见的特定微服务性能的挑战,以及如何应解他们. 背景:在IT界微服务架构为基础的系统越来越多, 每一个应用系统都集成了不同的组件和服务,几乎所有的特定业务应用程序都需要集成一个或更多的应用服务. 但是一个综合性系统集成不同的服务这无疑是一个巨大的挑战.

微服务与架构师

- - 乱象,印迹
因为工作的关系,最近面试了很多软件架构师,遗憾的是真正能录用的很少. 很多候选人有多年的工作经验,常见的框架也玩得很溜. 然而最擅长的是“用既定的技术方案去解决特定的问题”,如果遇到的问题没有严格对应的现成框架,就比较吃力. 这样的技能水平或许适合某些行业,但很遗憾不符合我们的要求. 软件架构师到底应该做什么,又为什么这么难做好,这都是近来的热门问题,我也一直在和朋友们讨论.

从Excel到微服务

- - 乱象,印迹
Excel很老,Excel很土,Excel一点也不sexy;微服务新,微服务很潮门,微服务很高大上. 那么,Excel和微服务有什么关系. 上个月看了篇文章,The Unbunlding of Excel. 作者认为,对于初创公司(尤其是非“纯IT”初创公司)来说,Excel几乎包办各种工作. 想做轻量级的CRM,可用Excel.

微服务拆分之道

- - DockOne.io
微服务在最近几年大行其道,很多公司的研发人员都在考虑微服务架构,同时,随着 Docker 容器技术和自动化运维等相关技术发展,微服务变得更容易管理,这给了微服务架构良好的发展机会. 在做微服务的路上,拆分服务是个很热的话题. 我们应该按照什么原则将现有的业务进行拆分. 接下来一起谈谈服务拆分的策略和坚持的原则.

微服务之saga模式

- -
你已经使用 database ber service 模式. 每个service拥有自己的database. 一些业务事务会跨越多个service,所以你需要来确保data consistency. 例如,假设你正在构建一个电子商务网站,这个网站的用户的会有一个最大欠款限制,应用程序必须确保一个新订单不能超过用户的最大前款限制,但是orders表和customers表不在同一个数据库,所以应用程序不能简单的使用本地的ACID事务.