本帖最后由 FYIRH 于 2021-12-25 00:16 编辑
/ Y4 g- L: }5 e- F- E& @& g+ P8 P7 {- J$ D
一、DevOps 的理解DevOps 的概念在软件开发行业中逐渐流行起来。越来越多的团队希望实现产品的敏捷开发,DevOps 使一切成为可能。有了 DevOps ,团队可以定期发布代码、自动化部署、并将持续集成 / 持续交付作为发布过程的一部分。一句话概括就是提高生产力,快速交付。
* C$ x# d& P' H+ H7 V 二、引入 DevOps 的背景# } s/ X( F4 m& d4 o
; h& W5 F) `9 e- `& z
+ p! a0 U+ H j, b3 @
2.1 福禄技术栈介绍
8 @" k' A2 b4 c9 S2 a2.2 后端服务的 CICD 现状
# Q5 s, _4 F3 k: P3 T
0 t s5 v( v2 n$ S% q4 ]" |7 D; ~+ Z# _ c2 @8 Q0 Q
# T* c: X8 I& S1 b0 wCICD 流程说明
9 p% a! |9 T4 T. G( C) n7 g( |- b: K
每一次的代码 push,根据创建的分支,根据在 Gitlab 的 CICD 文件 gitlab.yml 定义构建步骤,触发 runner,从单元测试、通过 dockerfile 进行编译和生成镜像版本、将新镜像部署到 K8S 生成 pod,然后触发接口自动化测试任务的执行 & X2 @* C4 g& e/ J* X! r U8 s4 J5 v5 U
!!#00ffff 好像缺了点什么 !!
2 h$ n( z+ G! L
- 初次部署应用到 Kubernetes 怎么做的?
- 服务的 configmap 在哪里维护的?
- 每个服务的 gitlab.yml 文件都不一样,如何维护的?
- 应用的域名解析怎么做?, {; N1 G4 e( H+ \8 i& ?& G
/ ? S6 ]9 [" M% s+ t7 U
目前有6套环境进行管理,其中开发、测试、集成、压测都是测试人员维护,预发布和生产运维人员维护;这也就要求每一个测试人员都必须对整个cicd流程和配置绝对掌握;所以当新人入职,需要掌握整个流程才能进入项目测试中,这是一个学习成本;+ [2 n ~+ P" p+ {; q/ e
& T* K" g: {: g) L9 }9 j" i/ Q
7 w) p3 u' v4 |! `- }! ^
预发布和生产的 Kubernetes 只有运维能够操作,当有新的服务需要上线上述环境,或者 configmap 有变动,或者有时候排查问题需要查看容器日志,我们只能通过运维的工单系统描述作业操作,中间文字描述可能存在理解差异,沟通成本和时间成本很大;0 U5 ~. }7 F& E& C2 b$ O4 m
) y% X% X/ O2 _# C, y' N! Z6 b5 i
, d* w% `, ^4 D9 o' @. [* y: S2 E
有的新应用我们去设置 CICD 的相关文件,比如 dockerfile,我们发现应用的代码目录结构各种各样,这样往往就没法套用一个模板快速配置完成。# M1 `3 z- k/ ^ y& a# Q! r
" F! Z3 K$ ~2 h. C F3 Q' J$ R2.3 前端站点的 CICD 现状
1 ]* o6 z! ^; G) G! @: E
d2 \* g7 O' l) A5 d5 x4 ]6 v2 I) f# _# k: }* `- l# y7 t9 z: u1 y* O
1 V7 K' U7 u8 s/ g
前端 CICD 流程说明 , i" Q4 s3 l* d7 I* m" B! g: \
开发人员 push 代码到 Gitlab,测试人员通过 Jenkins 拉取最新的代码到 Jenkins 本地,然后通过 Jenkins 与服务器之间的传输管道,将要部署的文件更新到目标服务器,并触发 UI 自动化的 Job
: u3 E+ O# S0 ^9 m4 s; u5 a. ]/ c- A* o5 w3 ?* f' M
3 p- v: \" u* W" D+ t4 M9 j- [4 ~
完整的过程来看,也缺点内容
2 Z* q5 ~+ b% c* C2 o! |, V! l' {% G
- 一个新的站点部署,Nginx 需要做一些配置初始化工作,比如域名、路径的配置
- 前端的配置文件是如何管理的
( {, T% G0 K0 ], w2 | 5 b8 O0 X- N# V) g8 _
跟后端应用一样,前端的 PRE 和生产环境也是运维处理,所以当一个新的应用上线我们也需要发工单,描述具体操作,然后运维执行工单;配置文件一般不会变更,所以我们在 Jenkins 推送更新文件到目标服务器的时候,将配置文件做了过滤处理。后续需要变更通过工单执行 ' T! @. `/ m3 I# t
2.3 痛点你看到了吗" Q' X* O8 U6 K. D' n
; G- Z6 `* C: B
2.3.1 安全管控缺位! q: T" {1 ]) p5 r! i( r
2.3.2 管理成本- 维护账号多:Gitlab账号、Jenkins 账号、Kubernetes 账号(本地和阿里云),每一个人员都需要上述账号,运维管理麻烦,大家每个平台维护自己的账号也麻烦
- 工单沟通:工单编写、沟通过程花费时间较多
- 代码规范:项目组多,微服务也多,代码框架各自发挥,无论是流程维护还是问题排查都增加了难度
6 d8 ~7 O7 y" [( G2 c
" k$ p* d" J- r% L" ~三、研发管理平台(RDMS)应运而生
8 ~! w2 ?5 L) C) Q+ A/ f( o m2 K: C
3.1 如何理解这个平台( O! x' G; z$ @1 o; S
!!#ff0000 工具链到平台的转变 !!
! h# \( h. ]( r9 _! h 当前的 CICD 是对工具链进行了打通,但需要大家登录各个工具平台操作,我们希望对工具集进行功能整合,打造一个系统平台,并且将 CICD 的技术细节进行屏蔽,开发人员能够专心进行业务需求的开发,测试人员能够专注到需求测试任务中,而运维人员能够解放繁重的工单内容,投入到服务高可用的建设上!1 \/ x% j% }+ q1 ?: @( G, W$ q
( c# J3 c4 G9 F) b; n/ B4 {
3.2 业务功能设计5 k, k- @$ z9 u! r R Y5 N
2 j; O1 L6 n3 W' \+ W3 M
1 {5 f. j7 P! m* y- q$ I
( O, ?' @, Q8 u9 ~( A; o6 X% s3.2.1 功能说明- 项目管理:项目的创建和维护,默认提供了.netcore 的 API 和控制台,Java 的 API 和前端站点的应用初始化代码框架,开发人员开发新的应用直接根据应用类型选择对应的模板就可以在 Git 默认创建代码仓库和初始化框架代码,并自动生成应用的 http 和 https 的域名
- 构建记录:获取 Gitlab 的 pipeline,展示所有分支的构建记录信息,可以一键跳转到 Git 仓库
- 部署管理:部署构建的镜像到指定的环境,提供实时部署和定时部署功能
- 容器管理:提供容器的查看功能,可以看到容器的存活状态和容器实时日志
- 配置字段权限申请:针对 PRE 和生产环境查看配置,需要先走钉钉审批申请流程
- 配置信息:进行配置的维护,包括新增、编辑、删除,PRE 和生产环境操作需要钉钉流程审批
- 操作日志:针对应用的操作日志记录
- 用户设置:在使用 rdms 前,需要先将用户 git 仓库的 token 设置在 rdms 上,这样用户在 rdms 操作与 Gitlab 相关的业务才能正常使用
2 h( L1 y: B% d5 @ }# J' M/ E
6 Y$ D7 n) Y# q2 {8 b) {) c3.2.2 RDMS 几个核心页面的展示: b @& k2 {, W% q4 e% ~
首页-创建应用 7 I! z4 M! v/ I0 u* W
4 D6 t! a+ s, F. W4 H
构建记录
0 m: b$ ^& D; S( |/ V( | " J3 ?/ T3 \8 }# Q% ` i- [. H
部署管理 " i3 O; @8 x8 s6 r2 M4 V
" ?5 a* _. K4 J# t
容器管理 $ S$ ^% G5 {6 [: Y' V& o5 K5 T( l& X
# T8 R3 W# G7 i& r$ H5 A
6 J% ^) |$ p6 \! x9 V( K
3.3 技术架构6 C! J; T3 a4 H3 d4 K, H$ z+ G0 e; Z
# M, j- I7 Q" e$ r& {
7 s7 z) g. U- m: y
# D: m& l7 Z: N7 j3 z8 _+ x) {对接系统的说明
0 H/ M' c8 ^) y6 g6 G: I/ T
- 通行证:RDMS 的目标用户是研发中心人员,这些人员在通行证中都有默认的账户信息,与通行证打通,可以直接登录使用
- GitlabAPI:目前 RDMS 的 CI 还是采用的 gitlab 的 ci 支撑,包括新应用在 rdms 的创建到 git 仓库的代码初始化等,都需要调用 gitlab 的 api 接口
- 钉钉 flow:安全管控的原因,PRE 和生产的任何操作都会触发钉钉审批流,所属项目的项目经理审批通过后才会获取到数据或者执行操作指令
- 福禄开放平台:提供了网关相关的功能和菜单、角色等维护功能,公司所有后端服务都需要入驻开放平台
- 蜂巢:公司的调度作业平台,rdms 的定时部署功能依赖该服务的支撑
- 运维工单系统:rdms 的 CD 流程没有直接与 Kubernetes 进行交互,而是通过运维的工单系统包装了运维底层的 shell 脚本层,然后提供给 rdms 相关的 api 接口,也是基于安全控制的考虑
- shell 脚本层:shell 脚本层会调用 Kubernetes 的 API 进行 Kubernetes 的相关操作(部署、配置更新、容器重启、日志查看等);调用阿里云的 dns 解析接口,对应用的域名自动解析;调用 oss 的接口,进行前端站点文件目录的维护
( [8 ^' H. |5 \5 D% Q 5 N& l" h s( o: l
3.4 后端应用的 DevOps 实现详解
# q: p, ^& e" G5 t: f8 @) a4 X9 j3 R5 `9 w1 E& \- k6 x8 o
% g# ^( B7 {+ v1 B
+ Q0 m# k6 s, z N* B: g举个栗子进行介绍
' B5 s4 x# {, X( `' f
根据模板,创建一个应用
/ _# N; a) Y) A- t# y. U. \" G
' \2 k- p i* P% u& l
根据名称默认生成域名
$ P) @/ P4 M9 v3 }- A! q
: ?' d! @, R( S
初始化代码仓库,默认生成 Develop 分支 7 r* t- V: B \( \' y( o* s$ F
# ^. s9 R. y1 h4 I) c# y6 h
在 rdms 第一次部署到对应环境(开发、测试、生产等)时,会默认读取 appsettings.Development.json 的文件,并写入 kubernets 的 configmap
& u1 U: j X0 Y- _# v
构建完成,进行部署 ! C6 X' o# G: f; e1 L+ F; b
0 i- r! e. G# g8 ?$ D" D' R! O/ z8 P( a1 p6 ^/ Q
( X7 ?% @, v8 [) ^8 ]在 kubernets 生成 pod 5 F0 S( ?* ]% e
8 c5 C( f0 r$ j) v( J
- K& {" P4 a9 O/ p" n' ?! ]
通过域名访问接口文档
$ R$ R+ T. ~, p4 ?* X7 p P2 s) ]; x! @1 Q, {
, m+ ]% [* X% a' J+ H; u9 f# Y5 {
% D( p5 z3 p5 {0 O0 j
( h0 H) F* [2 A/ }* O3 [2 P. c7 V3.5 前端站点的 DevOps 实现详解! O' D5 \7 f: N& J, H; o& G) {4 |. }
) r7 q w* J# f
7 G3 z H( v" n s3 B
4 u# E, c8 p6 f Q/ i% w
+ }# d- A+ w, U
同样的,举个栗子介绍 4 |/ } Q4 H" ~" ]9 h
首页-创建前端站点 2 f! I1 T: Q8 t Q+ t- T6 S1 P
: C; \" _4 \5 J5 [( e, `根据名称生成域名
+ u x1 g* H& b9 g% @
% L! V2 X4 T+ z( ^+ M初始化代码仓库,默认生成 Develop 分支 0 h0 Z4 j: s O W9 F
. V4 T0 K" k% [1 Y% d% I5 Z8 e3 n+ G7 h' w
- J# ?4 v8 Z6 V$ a7 e
配置文件,默认生成几套环境的配置文件,站点的配置维护就是维护这几个文件 0 Z1 I4 a& ~4 y$ P5 y$ I6 f
! s7 V# a* Y; k: d; P# s: q7 P4 v8 q9 V4 ]+ h) t$ o4 s
3 V |/ n$ a: ^( u7 s部署应用8 H- \# x' w* F7 {% p7 K
# u. R, E5 m$ l! k- s
2 Q& Q. Y. E) _) L
9 {" f9 a; f! ^9 q& }: F
! t+ k$ q6 |- b$ r% fKubernetes 的 nginx 容器内可以看到部署的文件,实际就是挂载的 oss 到该 pod 上3 i5 z1 \9 g* Q# k, B2 v
8 A+ _6 v/ w, d' N0 e1 C4 U6 A( M) ^$ L5 R! t9 y
! \; G. a) \! C$ n% Y# `6 E' R q( O. m' Q3 \3 @6 t# {+ }
(转自福禄渣渣辉)
3 J3 ?- v. m: h) k
" {2 a2 D- H+ `4 @
% m( a6 |5 I$ H/ c# |4 H
1 m2 T+ E+ e: H7 ?' ?4 n, O. r' n( p2 W J7 S: ~) D' e" k" [$ L! b; k
7 a* v! k6 q. j; s7 E
' c) G, V; j9 r: R7 w |