请选择 进入手机版 | 继续访问电脑版

IT运维管理,ITIL,ITSS,ITSM,ISO20000-ITIL先锋论坛

 找回密码
 微信、QQ、手机号一键注册

扫描二维码登录本站

QQ登录

只需一步,快速开始

艾拓先锋
搜索
查看: 220|回复: 0

DevOps系列之国外大厨用Docker和Jenkins演示微服务的持续交付

[复制链接]
来自- 巴西

参加活动:0

组织活动:0

发表于 2018-10-31 10:15:22 | 显示全部楼层 |阅读模式 来自- 巴西
本帖最后由 adminlily 于 2018-10-31 10:17 编辑 3 `# t0 v* U! v: _3 g$ x& H3 D' _8 t
: z. j# f' L, V+ I6 u, E( b
1.png
Docker们手拉手,互相聊天互相吹牛,以确保所有工具和微服务都能装一个锅里。
- 国外大厨名语录

% Y( s, i* u5 E/ z' s* X6 \3 F4 w

. N% @6 O) Y" n3 F' ?' z
Docker,微服务,持续交付是地球上目前运维圈子里最受欢迎的话题了。在由数十个微服务相互通信的环境中,测试,构建和部署过程的自动化显得尤为重要。Docker,当红小生是微服务的理想解决方案,它可以创建和运行带服务的隔离容器。

' \: Q, i# }( c
( Y* Z: s1 Q+ @; ]; l
今天,我们来交流如何以流行的软件自动化工具(Jenkins)为微服务实例创建基本的持续交付流程。
2 Y+ V& w8 \, j9 d! d
) o; L! A6 }9 X" M* e
1. 微服务实例构建

( N/ ^- K. i1 R# m8 s
4 _& A- b( t+ Q/ e( t; ^
开篇,我先简要讲讲用于创建微服务实例的结构思路和工具。实例应用由两个彼此通信的微服务(帐户,客户),发现服务器(Eureka)和API网关(Zuul)组成,用Spring Boot和Spring Cloud框架实现,而且你可以在GitHub上download到源码。Spring Cloud支持微服务发现和网关的开箱即用 - 只要在maven项目配置文件中定义正确的依赖关系(pom.xml)。
9 ?0 M4 L# g$ ?& X# J
# @% F2 T/ L( R' j
客户、帐户REST API服务、发现服务器和gateway都在Docker里分别跑着。网关是微服务系统的切入点,它与所有其他服务交互,将请求发送到所对应的微服务器,在发现服务中搜索其地址。在每个帐户或客户微服务器有不止一个实例的情况下,请求Ribbon与Feign客户端负载平衡。

8 Y/ t4 b! Z: L( t' h/ V
  s$ {6 g# j1 e
帐号和客户服务在启动后自动注册到发现服务器,之间有交互的可能 - 例如,如果我们想查找并返回所有客户的帐户详细信息。
2 m! f! `, p2 b$ `
: D7 E( j7 I. a; B& b8 V* ^3 \
解决方案架构如下图所示。
1.png
6 k1 r( z4 w0 v0 o. [  X7 [

9 @% H2 }! |3 s# F  a" Y
其实我不太想用Spring Boot和Spring Cloud框架了解这些微服务实现的细节。不过,通常Spring框架完全支持所有Netflix OSS工具(如Ribbon,Hystrix和Eureka)的微服务。
: ?' u+ Y3 H& D7 ~4 ?( @
: a: e6 X+ y' j' J" T2 ?, w
2. Dockerfiles

/ H- F; J# E  O- Q/ y% _) \
- R8 c5 n. k- @2 b* }
示例源码中每个服务都具有DockerfileDocker映像构建定义。这个Dockerfile的帐户服务,理解起来不难。我们用OpenJDK作为基础镜像,目标JAR文件添加到映像中,然后用java -jar命令运行,随后占用2222端口,暴露至外网。
. B3 n( y3 h8 G5 m0 Z2 I; c' t+ z

5 e) x2 u' D4 B* {7 j# b

+ p" ?. y8 ]- Z$ |% b
1.png
  P, s0 `: J( ^  {% C; _

- I+ h5 b! s% U
: {2 `- q7 P: L* G5 N1 j
我们还得在JAR manifest里面设置主类,在模块pom.xml中用spring-boot-maven-plugin来实现它。片段在下方可见。我们还要设置构建finalName切断目标JAR的版本号。Dockerfile和Maven构建定义与所有其他微服务相似。

0 L4 ?8 Z& k4 y& R

! Y  G- x5 ?% r$ R  z3 o) I# W
1.png

* z3 x, E3 I! n$ ]5 G7 |: Q
7 ^% n% x7 E6 J; h) U' w& L8 V
3. Jenkins Pipelines

6 t+ k; ]  }$ e: @" ^1 {& C  V1 t8 m! }
2 Z9 H" ?4 }# j9 _
我们用pipeline插件为我们的微服务构建连续交付。除了Jenkins上的标准插件,我们还要个叫CloudBees的Docker Pipeline插件。我已经定义了四条流水线,如下图。

& ]1 _" Q2 t' ~

4 M8 v  A- w. B2 l
1.png

- s0 S# M1 [. H- T- U3 n' N1 C& B; g- m: @
7 M; m  ?- G9 E+ q
这是用Groovy语言写的用于发现服务的流水线定义。这里有五个执行阶段,在Checkout阶段,我们正在为项目的远程Git仓库提取更改。然后使用MVN clean install命令构建项目,并从pom.xml中读取Maven版本。在Image阶段,从发现服务Dockerfile构建Docker镜像,然后推送到本地注册表。在第四步里,我们在运行默认公开端口的内置镜像,这时候大家可以在对应的Docker看到主机名。最后,帐户pipeline的等待选项消失,也就是源pipeline构建完成。
- F8 T" x3 x8 W% T
% J" U; @* G; O* V- c4 D: k, t" [7 F
1.png
' m: R* `( O1 z, f0 [

& c$ U' q+ Z2 O
% i. t/ b: J& a% U. V7 L
帐户pipeline看起来很像。不过主要区别在于第四阶段,让帐户服务容器与发现容器做关联。这些容器要链接起来,因为account-service要求在发现服务器注册,并且必须能够使用主机名连接。

% R, G; m' `! s0 [8 V1 g" F) y

( M0 t- ]6 k. X
1.png
) H* y% w- @, W8 w( L" k9 q7 {: E

! |  d4 f( E5 r

0 K' U; c$ B% c. X( |' Z+ h" V' i
客户和网关也定义了类似pipeline,它们在每个微服务器的主项目目录中都可以作为Jenkinsfile。在执行期间构建的每个镜像也被推送到本地Docker注册表里。
" Z# p' e  k, f% T6 A
1 O0 j7 s, }! I* b: q  W
要在主机上启用本地注册表,则需要拉取和运行Docker注册表镜像,而且要在拉取或推送时将该注册表地址用作图像名称前缀,本地注册表会显示在默认的5000端口上。
/ X# b* f% [. ?7 _

7 A& I1 n2 w0 r: r; k
你可以通过调用REST API(例如http:// localhost:5000 / v2 / _catalog)来查看推送的镜像列表到本地注册表。

: B2 ?7 e7 _, W% q8 v0 Z

4 k. V  J; X: _; u$ K2 L; ?
docker运行-d --name注册表-p 5000:5000注册表

/ |; e3 J% i) w6 F+ K
( ?6 g0 p3 [2 p2 c* o6 G+ l
4. 测试
+ V7 i* G: A) x
. `  M& ?; n5 t) q- n. k
启动构建discovery-service-pipeline,这个流水线不仅可以为发现服务运行构建,还可以在最后调用start下一个pipeline build(account-service-pipeline)。
/ N! k( |: d7 f: A  \
- r3 K8 O) e# s0 w2 ?1 o
配置一套gui'zeaccount-service-pipeline和customer-service-pipeline配置一套相同的规则,为customer-service-pipeline和gateway-service-pipeline也配置一套相同的规则。在所有流水线完成后,你就可以通过调用docker ps命令来检查运行的docker列表。此时你应该能看到五个容器:本地注册表和我们的四个微服务器。
% S' m  ?: ?* P. T6 Y, T
+ p/ `7 c: m+ y% A* }7 V3 l
当然你还可以通过运行命令检查每个容器的日志docker logs。例如docker logs account。如果一切正常,你应该能向http:// localhost:2222 / accounts或通过Zuul网关http:// localhost:8765 / account / account调用一个服务。
) M  {9 S! q' c3 j
# v" C5 d- s. ^; \* M
1.png
1 A- f) n; O" Z

$ H1 D: b# C0 |# D8 m$ D
5. 结论

  g4 j0 M1 s9 p( h

2 @2 M) w: s5 l+ A% [6 f
好了,基于Docker和Jenkins的微服务持续交付的示例忽悠完成。

0 |# P1 [* R3 r8 B& C
+ S& r# l4 p# v: h$ d" H- a4 E
我觉得如果看明白了,你应该可以轻松发现这个方案的潜在局限性。例如,实例已经把Docker串起来实现通信了,又或者实例中所有工具和微服务都在同一台机器上跑。

2 A2 t. e% C) T, A8 f( k
1.png

% O4 [2 I3 W" S5 k% L: }/ a5 Q6 u
对于更高级的栗子,比如我们可以用运行在不同机器或Docker里的Jenkins附件来编排各种眼花缭乱的集群,包括Kubernetes工具的应用,又或者可以用Docker-in-Docker容器来虚拟一大堆Docker……

7 E# Z4 Z% p! X" C/ s& A7 Q/ u

% d! E: _( L5 A, x1 T' M
扯得有点远了……但是我希望这篇文章是对微服务和持续交付的一个很好的介绍,帮助你了解一些基础知识。文中提到的大神级工具,未来一定有更多更闪亮的应用场景。
7 J) J  k& D/ y

3 t1 t4 Q0 F6 ]4 I5 ?9 l$ F9 s  v" g' L
原创: DevOps研究院
9 ]/ A2 x4 k. e
6 {0 U, D4 a, g* p2 i' _! T

本版积分规则

选择云运维时代的王牌讲师-长河老师,助你轻松入门ITIL Foundation培训课程

QQ|小黑屋|手机版|Archiver|艾拓先锋网 ( 粤ICP备11099876号-1|网站地图

Baidu

GMT+8, 2019-2-24 13:51 , Processed in 0.225850 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表