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

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

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

扫描二维码登录本站

QQ登录

只需一步,快速开始

搜索
查看: 420|回复: 0

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

[复制链接]
来自- 巴西

参加活动:0

组织活动:0

发表于 2018-10-31 10:15:22 | 显示全部楼层 |阅读模式 来自- 巴西
本帖最后由 adminlily 于 2018-10-31 10:17 编辑
# Y5 M$ s6 b/ g. y  n0 X4 {" X& P, i( h; \* g3 H
1.png
Docker们手拉手,互相聊天互相吹牛,以确保所有工具和微服务都能装一个锅里。
- 国外大厨名语录

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

" O3 W" u; y- D) X
7 X4 n  G) D$ K, |8 |
今天,我们来交流如何以流行的软件自动化工具(Jenkins)为微服务实例创建基本的持续交付流程。
3 b- B" c: s& f( j; h: n& f. d  ^

4 _, p0 S: _& R4 p' l* f
1. 微服务实例构建

+ j2 m$ O8 X$ U8 e8 r8 [
4 T6 f$ _4 m6 ]0 I$ j6 `8 Y
开篇,我先简要讲讲用于创建微服务实例的结构思路和工具。实例应用由两个彼此通信的微服务(帐户,客户),发现服务器(Eureka)和API网关(Zuul)组成,用Spring Boot和Spring Cloud框架实现,而且你可以在GitHub上download到源码。Spring Cloud支持微服务发现和网关的开箱即用 - 只要在maven项目配置文件中定义正确的依赖关系(pom.xml)。

1 \2 `: H) O! S  [; U% M' b2 {

  w2 ~. S! C/ }. G" j
客户、帐户REST API服务、发现服务器和gateway都在Docker里分别跑着。网关是微服务系统的切入点,它与所有其他服务交互,将请求发送到所对应的微服务器,在发现服务中搜索其地址。在每个帐户或客户微服务器有不止一个实例的情况下,请求Ribbon与Feign客户端负载平衡。
- a7 n9 R" K# z( y# X8 P7 s3 a
* f0 @7 B: z/ P# _4 v& w
帐号和客户服务在启动后自动注册到发现服务器,之间有交互的可能 - 例如,如果我们想查找并返回所有客户的帐户详细信息。
, o) ?, c9 f- @; |2 c) m; Y7 r) y
: [5 f, f( Q6 t5 l& e! ]1 Y/ Y" W8 X
解决方案架构如下图所示。
1.png

/ P. z$ T+ I+ C  H- O* Q; Q. O7 J2 v

2 Y' p* m' v0 C7 l4 L
其实我不太想用Spring Boot和Spring Cloud框架了解这些微服务实现的细节。不过,通常Spring框架完全支持所有Netflix OSS工具(如Ribbon,Hystrix和Eureka)的微服务。

' [" i/ q) P6 _

  m/ ]  R( w; N4 v2 B) T8 }8 x
2. Dockerfiles
* K1 d& ~$ s5 t" F; K- r
" K  G( C8 e6 X/ `2 V
示例源码中每个服务都具有DockerfileDocker映像构建定义。这个Dockerfile的帐户服务,理解起来不难。我们用OpenJDK作为基础镜像,目标JAR文件添加到映像中,然后用java -jar命令运行,随后占用2222端口,暴露至外网。
) C: c- p( H2 y( w
$ m- T8 ~( d  v. h, y  d, q! A
  ^, w  D4 O  }4 ^" Q1 D+ Y% i
1.png

' A8 X, H: d' L
$ m% V) W. ]" ]- d' c8 W

2 \. O' e/ g( x! P8 o
我们还得在JAR manifest里面设置主类,在模块pom.xml中用spring-boot-maven-plugin来实现它。片段在下方可见。我们还要设置构建finalName切断目标JAR的版本号。Dockerfile和Maven构建定义与所有其他微服务相似。
2 R  }# \3 e/ ~' q" E
4 A3 `- h: T2 A0 o$ v1 \
1.png
" w& o" h) Z" q: _, |

" n- q" i' ]# M- o; A" b
3. Jenkins Pipelines

; \1 v6 W$ d! h8 X8 C

1 H7 u4 k& |0 x5 f) F
我们用pipeline插件为我们的微服务构建连续交付。除了Jenkins上的标准插件,我们还要个叫CloudBees的Docker Pipeline插件。我已经定义了四条流水线,如下图。
# J5 ]: a0 x3 T+ @, ~( r$ T6 x. t1 j
6 B  ~/ |0 L$ X/ \7 |% [
1.png
# ?& i5 X7 [7 z

4 L0 Q! s; ^8 d" c: e
6 }/ d# {7 }# `; d
这是用Groovy语言写的用于发现服务的流水线定义。这里有五个执行阶段,在Checkout阶段,我们正在为项目的远程Git仓库提取更改。然后使用MVN clean install命令构建项目,并从pom.xml中读取Maven版本。在Image阶段,从发现服务Dockerfile构建Docker镜像,然后推送到本地注册表。在第四步里,我们在运行默认公开端口的内置镜像,这时候大家可以在对应的Docker看到主机名。最后,帐户pipeline的等待选项消失,也就是源pipeline构建完成。
7 U$ u* g& {5 }& @
$ i  K" ~7 g+ q. o$ N; X% J' k
1.png

* L4 V1 I1 v0 G

, z2 r- Q! X* e
3 ^3 Y7 s$ G; d6 {) l: }2 N
帐户pipeline看起来很像。不过主要区别在于第四阶段,让帐户服务容器与发现容器做关联。这些容器要链接起来,因为account-service要求在发现服务器注册,并且必须能够使用主机名连接。
6 U. e$ O. z+ A+ W
% f" i( t# e7 O1 n+ _  h# s( @
1.png

1 i5 H# B0 j) J; N( }1 [2 z# K

7 Y- r  \7 F! a# ]2 k% @

1 F/ W0 O% N7 y% j/ S) x
客户和网关也定义了类似pipeline,它们在每个微服务器的主项目目录中都可以作为Jenkinsfile。在执行期间构建的每个镜像也被推送到本地Docker注册表里。
- B  z8 K  S2 x  d9 k
8 ?! J  F# _- n- x- T* T$ D
要在主机上启用本地注册表,则需要拉取和运行Docker注册表镜像,而且要在拉取或推送时将该注册表地址用作图像名称前缀,本地注册表会显示在默认的5000端口上。

6 W# S& i7 H6 j9 i: ?  h4 k4 G

2 s+ T! R. U! ^8 f: s
你可以通过调用REST API(例如http:// localhost:5000 / v2 / _catalog)来查看推送的镜像列表到本地注册表。
, {% q/ `0 L4 R8 S% A

5 v6 i+ @0 M4 C: X2 j  ~
docker运行-d --name注册表-p 5000:5000注册表
( p) Y% d2 K3 v' N* C
6 P4 h( {1 A5 }: Y$ R
4. 测试

' D$ r8 y* V& }3 G' v

* o  j: ~. Q8 K8 u( Y# B
启动构建discovery-service-pipeline,这个流水线不仅可以为发现服务运行构建,还可以在最后调用start下一个pipeline build(account-service-pipeline)。

5 g4 H3 b0 D9 E+ I& b" q

+ B$ p! D, D2 }( N9 V
配置一套gui'zeaccount-service-pipeline和customer-service-pipeline配置一套相同的规则,为customer-service-pipeline和gateway-service-pipeline也配置一套相同的规则。在所有流水线完成后,你就可以通过调用docker ps命令来检查运行的docker列表。此时你应该能看到五个容器:本地注册表和我们的四个微服务器。
+ C& B5 E! P6 Z8 @$ x5 T* s

5 N% {+ ^: H  l9 u8 Q8 T; Y
当然你还可以通过运行命令检查每个容器的日志docker logs。例如docker logs account。如果一切正常,你应该能向http:// localhost:2222 / accounts或通过Zuul网关http:// localhost:8765 / account / account调用一个服务。
! V0 \5 {8 u. F0 _; L% v0 z
! G) a) C: f- l" D
1.png

+ u9 H& [- D+ r; z2 z
/ B9 G: r( K$ g( R4 q( _# {7 B" k2 j
5. 结论

5 B4 W4 L6 a- }. C' t3 {* e" A

& \( y4 z2 M, U; e
好了,基于Docker和Jenkins的微服务持续交付的示例忽悠完成。
1 k$ v6 m. |" C5 ~

" E2 O! j) n- }- J
我觉得如果看明白了,你应该可以轻松发现这个方案的潜在局限性。例如,实例已经把Docker串起来实现通信了,又或者实例中所有工具和微服务都在同一台机器上跑。

9 L' K" L- f9 M! c
1.png
  b) @2 M9 t% B6 W0 c
对于更高级的栗子,比如我们可以用运行在不同机器或Docker里的Jenkins附件来编排各种眼花缭乱的集群,包括Kubernetes工具的应用,又或者可以用Docker-in-Docker容器来虚拟一大堆Docker……

! @9 e% s+ [: d& c4 H" Z$ U

( [3 r: p4 S4 _+ P$ K
扯得有点远了……但是我希望这篇文章是对微服务和持续交付的一个很好的介绍,帮助你了解一些基础知识。文中提到的大神级工具,未来一定有更多更闪亮的应用场景。
* V4 H% u4 R4 q' z. j
" [: n8 C5 {$ c# i) C# {* U/ [
原创: DevOps研究院
3 V  ^) d0 \1 N. P* Z- _: N2 Q

0 n9 B4 \0 d' R+ ]( M% @& t

本版积分规则

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

Baidu

GMT+8, 2019-6-17 23:19 , Processed in 0.217629 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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