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

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

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

扫描二维码登录本站

QQ登录

只需一步,快速开始

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

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

[复制链接]
来自- 巴西

参加活动:0

组织活动:0

发表于 2018-10-31 10:15:22 | 显示全部楼层 |阅读模式 来自- 巴西
本帖最后由 adminlily 于 2018-10-31 10:17 编辑 5 @; _$ {0 F" v7 \) J) ~6 R
* ~- H; [; n9 m0 S( x8 G
1.png
Docker们手拉手,互相聊天互相吹牛,以确保所有工具和微服务都能装一个锅里。
- 国外大厨名语录
# m. g& U4 _3 {. j9 X( Q# H
/ _. a' U# g' N% |3 ^
Docker,微服务,持续交付是地球上目前运维圈子里最受欢迎的话题了。在由数十个微服务相互通信的环境中,测试,构建和部署过程的自动化显得尤为重要。Docker,当红小生是微服务的理想解决方案,它可以创建和运行带服务的隔离容器。
, j- k" L8 |4 c+ i# o

0 ~+ r% e' F; O9 _  p
今天,我们来交流如何以流行的软件自动化工具(Jenkins)为微服务实例创建基本的持续交付流程。
* h; C' O( L6 Z! B% e# A
' h: f2 n4 o/ Z2 I
1. 微服务实例构建

4 n+ t+ R0 L7 h  W4 l* Y6 I

% `9 g1 r! `* {6 W0 M0 {
开篇,我先简要讲讲用于创建微服务实例的结构思路和工具。实例应用由两个彼此通信的微服务(帐户,客户),发现服务器(Eureka)和API网关(Zuul)组成,用Spring Boot和Spring Cloud框架实现,而且你可以在GitHub上download到源码。Spring Cloud支持微服务发现和网关的开箱即用 - 只要在maven项目配置文件中定义正确的依赖关系(pom.xml)。
1 U+ Y' s, W1 }0 _$ N/ R

! L. ]5 N: r" |) m; p: \" ?  [
客户、帐户REST API服务、发现服务器和gateway都在Docker里分别跑着。网关是微服务系统的切入点,它与所有其他服务交互,将请求发送到所对应的微服务器,在发现服务中搜索其地址。在每个帐户或客户微服务器有不止一个实例的情况下,请求Ribbon与Feign客户端负载平衡。
; \& z1 w4 a6 P

; }  @3 V% z- L" ^% \) M% Q6 O
帐号和客户服务在启动后自动注册到发现服务器,之间有交互的可能 - 例如,如果我们想查找并返回所有客户的帐户详细信息。
3 n- @& \( X! u$ m) s5 N
9 \2 v8 o' G; N/ ~$ _
解决方案架构如下图所示。
1.png

& F$ T- _6 t1 i
& {1 J. N: B1 N
其实我不太想用Spring Boot和Spring Cloud框架了解这些微服务实现的细节。不过,通常Spring框架完全支持所有Netflix OSS工具(如Ribbon,Hystrix和Eureka)的微服务。
; f; `5 y) G! e4 m/ d5 B3 `
9 y7 y  u5 ?& K" s/ V% J$ ^' w
2. Dockerfiles
, |8 C) B* w2 ^3 T
" ~2 o, ?3 N9 X2 u
示例源码中每个服务都具有DockerfileDocker映像构建定义。这个Dockerfile的帐户服务,理解起来不难。我们用OpenJDK作为基础镜像,目标JAR文件添加到映像中,然后用java -jar命令运行,随后占用2222端口,暴露至外网。5 F* Z5 W: d6 p
: `2 V7 f# U" i( Z% b1 N/ K

5 _' X7 q5 y- x  H3 U: g" C
1.png
& z/ N, \& P0 C+ N2 w
% I4 V1 ]5 L! R$ y: d# y, F" e

+ |3 X0 H* v* Z3 P( X
我们还得在JAR manifest里面设置主类,在模块pom.xml中用spring-boot-maven-plugin来实现它。片段在下方可见。我们还要设置构建finalName切断目标JAR的版本号。Dockerfile和Maven构建定义与所有其他微服务相似。

1 V4 d' e% _  c( y) }2 E

/ A( x2 r' ]% v3 n) a! V, x' y. a
1.png

$ J( n% X* W! W% N. `5 }

' {5 _& r' Y1 _: i8 u. F$ p5 j$ \
3. Jenkins Pipelines

& i: N$ V' _" d* C# j* d$ f
  W- Z: s2 X* Q9 m
我们用pipeline插件为我们的微服务构建连续交付。除了Jenkins上的标准插件,我们还要个叫CloudBees的Docker Pipeline插件。我已经定义了四条流水线,如下图。

1 r7 Z0 c7 n: D) m. P6 }- ~
4 b- L+ M# l2 R' ~
1.png
' x9 j- }' A9 g* z  d! l
$ F7 ?; \, s8 L5 r5 u
' U( E- a% g; [6 y
这是用Groovy语言写的用于发现服务的流水线定义。这里有五个执行阶段,在Checkout阶段,我们正在为项目的远程Git仓库提取更改。然后使用MVN clean install命令构建项目,并从pom.xml中读取Maven版本。在Image阶段,从发现服务Dockerfile构建Docker镜像,然后推送到本地注册表。在第四步里,我们在运行默认公开端口的内置镜像,这时候大家可以在对应的Docker看到主机名。最后,帐户pipeline的等待选项消失,也就是源pipeline构建完成。

* I9 j& |# S7 s9 B( y; _9 z6 C

7 v! R) t# c& K# q  t
1.png
/ q) w$ O* i( p
8 C5 g6 |7 h% _* s* q

. P+ Q9 c- [1 a% g
帐户pipeline看起来很像。不过主要区别在于第四阶段,让帐户服务容器与发现容器做关联。这些容器要链接起来,因为account-service要求在发现服务器注册,并且必须能够使用主机名连接。
9 L, g8 J/ V- B- `& ?, a7 I% C
0 T+ u. Q& g) y0 G2 w* f9 h. Y0 G* D( S
1.png
$ L6 F8 F( S0 q, \( h4 Z+ B/ A) b

; U- \2 D7 z4 L) x1 s- M3 S! d9 N

7 @. U% f) a# E) Z% P
客户和网关也定义了类似pipeline,它们在每个微服务器的主项目目录中都可以作为Jenkinsfile。在执行期间构建的每个镜像也被推送到本地Docker注册表里。

, R6 \9 h- m) t
, H: A9 j0 z1 U: H5 _7 O( }: r
要在主机上启用本地注册表,则需要拉取和运行Docker注册表镜像,而且要在拉取或推送时将该注册表地址用作图像名称前缀,本地注册表会显示在默认的5000端口上。

9 w- ~1 n3 T! Z/ X. d
9 z  N1 Q: Z# ?
你可以通过调用REST API(例如http:// localhost:5000 / v2 / _catalog)来查看推送的镜像列表到本地注册表。
$ v# R: Y( i% w" \4 B: B

1 z4 Q/ {! q9 l# o) \
docker运行-d --name注册表-p 5000:5000注册表

' ~: C! {) s# G  o
/ D* m; g( _8 S8 Q
4. 测试
. a6 |% O& w6 `" @
& ~6 f$ i" l- A$ J; ~8 I2 z
启动构建discovery-service-pipeline,这个流水线不仅可以为发现服务运行构建,还可以在最后调用start下一个pipeline build(account-service-pipeline)。

4 Q6 E; V0 `9 `" v8 K& z, v8 S
3 U$ s  b' C3 R9 G% z+ ~1 X
配置一套gui'zeaccount-service-pipeline和customer-service-pipeline配置一套相同的规则,为customer-service-pipeline和gateway-service-pipeline也配置一套相同的规则。在所有流水线完成后,你就可以通过调用docker ps命令来检查运行的docker列表。此时你应该能看到五个容器:本地注册表和我们的四个微服务器。
7 C2 s0 _/ B( ~( W7 T& T
! F- S) R6 @# U$ ]1 n: h( u# Q+ J
当然你还可以通过运行命令检查每个容器的日志docker logs。例如docker logs account。如果一切正常,你应该能向http:// localhost:2222 / accounts或通过Zuul网关http:// localhost:8765 / account / account调用一个服务。

& t; b: g0 V; b& }; P

# q( B! E) J1 C7 X& R
1.png
/ b# Q1 N2 o8 ?
/ V$ J# u- U( G9 a- G" i% P$ ~+ N- H$ ]
5. 结论
  ]7 e- z9 M4 p% M; k- y" A0 z2 ~, @

5 S4 I' @' B! L8 ~0 R; p- m
好了,基于Docker和Jenkins的微服务持续交付的示例忽悠完成。

' y6 }' c$ `% @( }8 X
% o7 z: S$ e" L2 t, E+ b. w6 W: t
我觉得如果看明白了,你应该可以轻松发现这个方案的潜在局限性。例如,实例已经把Docker串起来实现通信了,又或者实例中所有工具和微服务都在同一台机器上跑。
; G/ K6 n+ T6 i6 r- Z# i3 C# |
1.png
) t+ }8 m- W$ a4 n3 C8 L, C
对于更高级的栗子,比如我们可以用运行在不同机器或Docker里的Jenkins附件来编排各种眼花缭乱的集群,包括Kubernetes工具的应用,又或者可以用Docker-in-Docker容器来虚拟一大堆Docker……

  Y/ t8 u0 Q$ W& q/ [4 o

9 G2 \$ Y4 m& B4 F, v/ u+ ]
扯得有点远了……但是我希望这篇文章是对微服务和持续交付的一个很好的介绍,帮助你了解一些基础知识。文中提到的大神级工具,未来一定有更多更闪亮的应用场景。
8 y4 J  n2 @( w& q3 J8 E
8 \5 N" Y. r  Y) \& D* N2 p
原创: DevOps研究院

3 U: ]3 m$ u" `1 a/ z  t! o( H
& Q4 S4 h1 _  s; y( U# t$ V. A

本版积分规则

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

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

Baidu

GMT+8, 2018-12-15 20:13 , Processed in 0.235713 second(s), 31 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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