本帖最后由 FYIRH 于 2021-12-25 00:16 编辑
! F: G5 C) G2 {
: g @( n& A$ q( ~3 T5 p一、DevOps 的理解DevOps 的概念在软件开发行业中逐渐流行起来。越来越多的团队希望实现产品的敏捷开发,DevOps 使一切成为可能。有了 DevOps ,团队可以定期发布代码、自动化部署、并将持续集成 / 持续交付作为发布过程的一部分。一句话概括就是提高生产力,快速交付。 / I! `- `/ ?& U( z5 n- m8 a, o0 ^
二、引入 DevOps 的背景
! z8 J! z( I! O, U
$ V; b) b' E6 f( r9 p) q; s+ {! c7 x
2.1 福禄技术栈介绍
$ v; ^$ ?, M2 ]; [( m8 s+ j2.2 后端服务的 CICD 现状
$ t9 W5 d; }6 B( F4 h
7 d! L) V4 U2 _3 c$ g
' L0 |) P; ~6 J" X' h9 q5 M* b0 G2 l [3 h+ K l8 D! {/ Q; f8 P
CICD 流程说明
' N/ N- `1 P5 D) w% s4 [( u- j3 V
每一次的代码 push,根据创建的分支,根据在 Gitlab 的 CICD 文件 gitlab.yml 定义构建步骤,触发 runner,从单元测试、通过 dockerfile 进行编译和生成镜像版本、将新镜像部署到 K8S 生成 pod,然后触发接口自动化测试任务的执行 ( l1 t2 F9 ]5 y% v) ^: _( v- j, |: d
!!#00ffff 好像缺了点什么 !! , J9 X$ W$ l. n3 Q# _# A. M
- 初次部署应用到 Kubernetes 怎么做的?
- 服务的 configmap 在哪里维护的?
- 每个服务的 gitlab.yml 文件都不一样,如何维护的?
- 应用的域名解析怎么做?5 |$ B2 z! D( q3 `3 \& A
, |4 [7 h2 q, z目前有6套环境进行管理,其中开发、测试、集成、压测都是测试人员维护,预发布和生产运维人员维护;这也就要求每一个测试人员都必须对整个cicd流程和配置绝对掌握;所以当新人入职,需要掌握整个流程才能进入项目测试中,这是一个学习成本;, p5 ]7 ]9 s$ B7 p4 y; H$ {' _6 E6 B
' O. |! V/ K1 ?; k# \4 {+ h5 E: L0 G% O0 m3 [& {
预发布和生产的 Kubernetes 只有运维能够操作,当有新的服务需要上线上述环境,或者 configmap 有变动,或者有时候排查问题需要查看容器日志,我们只能通过运维的工单系统描述作业操作,中间文字描述可能存在理解差异,沟通成本和时间成本很大;, ~2 _6 D+ c0 W6 `9 D0 I" A
4 H4 t# r# H. u6 v4 G& l5 s" U
" l3 |2 ?* ^/ i
有的新应用我们去设置 CICD 的相关文件,比如 dockerfile,我们发现应用的代码目录结构各种各样,这样往往就没法套用一个模板快速配置完成。' w" C/ Y/ ~* w! O2 N3 C/ p/ H" G
6 A/ h7 S: K3 q, i
2.3 前端站点的 CICD 现状5 \$ ~( H3 R; y. |; A; V
, R- {( W) e- c+ I, h- e. k9 F
# V D; u6 L0 L9 _$ u% z: E i4 T$ C. h% k" w( \
前端 CICD 流程说明
8 b: U/ }2 {) |/ \3 X8 q: p# m 开发人员 push 代码到 Gitlab,测试人员通过 Jenkins 拉取最新的代码到 Jenkins 本地,然后通过 Jenkins 与服务器之间的传输管道,将要部署的文件更新到目标服务器,并触发 UI 自动化的 Job
6 g7 d7 s# z3 y0 U; B& V! x& [& W# \2 d
2 P) B0 Z6 {: A8 H- E6 @完整的过程来看,也缺点内容
# }1 N3 r% k" K5 X5 F3 {+ K/ Z R7 K! ], ]! ^, u. E* {
- 一个新的站点部署,Nginx 需要做一些配置初始化工作,比如域名、路径的配置
- 前端的配置文件是如何管理的
. v9 ?' z, M4 D& t6 `& ?' V3 ]
4 f$ K: Y0 b5 `6 B7 H跟后端应用一样,前端的 PRE 和生产环境也是运维处理,所以当一个新的应用上线我们也需要发工单,描述具体操作,然后运维执行工单;配置文件一般不会变更,所以我们在 Jenkins 推送更新文件到目标服务器的时候,将配置文件做了过滤处理。后续需要变更通过工单执行 . {# L C3 K3 |! T% e
2.3 痛点你看到了吗' N3 a+ [8 O# z: k
5 \: f3 W/ U3 v) i" \2.3.1 安全管控缺位9 ~# U! X: k+ H* |7 z, Y9 d
2.3.2 管理成本- 维护账号多:Gitlab账号、Jenkins 账号、Kubernetes 账号(本地和阿里云),每一个人员都需要上述账号,运维管理麻烦,大家每个平台维护自己的账号也麻烦
- 工单沟通:工单编写、沟通过程花费时间较多
- 代码规范:项目组多,微服务也多,代码框架各自发挥,无论是流程维护还是问题排查都增加了难度& f! g4 n1 y: g! b' v6 x
; J3 |) Z: I6 A7 k: J+ `7 T5 K三、研发管理平台(RDMS)应运而生
. Y( k9 z7 b! \& I) r6 X" D9 c! Z0 Z% Z
3.1 如何理解这个平台
5 m$ |* h7 g! F3 z; w4 C* b; A0 @!!#ff0000 工具链到平台的转变 !!
* K$ a# @9 `2 {( e" { 当前的 CICD 是对工具链进行了打通,但需要大家登录各个工具平台操作,我们希望对工具集进行功能整合,打造一个系统平台,并且将 CICD 的技术细节进行屏蔽,开发人员能够专心进行业务需求的开发,测试人员能够专注到需求测试任务中,而运维人员能够解放繁重的工单内容,投入到服务高可用的建设上!
: j' _8 h) V: a& g2 H
7 `& D* q. f/ ]/ M2 S; U3.2 业务功能设计
2 e8 K1 Q1 N+ Q1 `6 Q! q( I1 ]: e' M3 A. o+ _! _% y- g
2 a: W, o( V9 S3 A2 e% J8 A5 ]9 C$ U' V2 J$ F. A
3.2.1 功能说明- 项目管理:项目的创建和维护,默认提供了.netcore 的 API 和控制台,Java 的 API 和前端站点的应用初始化代码框架,开发人员开发新的应用直接根据应用类型选择对应的模板就可以在 Git 默认创建代码仓库和初始化框架代码,并自动生成应用的 http 和 https 的域名
- 构建记录:获取 Gitlab 的 pipeline,展示所有分支的构建记录信息,可以一键跳转到 Git 仓库
- 部署管理:部署构建的镜像到指定的环境,提供实时部署和定时部署功能
- 容器管理:提供容器的查看功能,可以看到容器的存活状态和容器实时日志
- 配置字段权限申请:针对 PRE 和生产环境查看配置,需要先走钉钉审批申请流程
- 配置信息:进行配置的维护,包括新增、编辑、删除,PRE 和生产环境操作需要钉钉流程审批
- 操作日志:针对应用的操作日志记录
- 用户设置:在使用 rdms 前,需要先将用户 git 仓库的 token 设置在 rdms 上,这样用户在 rdms 操作与 Gitlab 相关的业务才能正常使用
/ W8 Y: |1 s0 U4 d$ Y& J& A 7 _% c( I8 e9 v! v; V. w' j& S* [
3.2.2 RDMS 几个核心页面的展示" r3 e$ p4 l- L4 N% G
首页-创建应用
, b# Y* J* ^% Z0 x# O' ~9 ^
6 W. V) X0 J+ W; ?2 b' D
构建记录
( Z* n8 K6 I7 _# K+ ]; S
1 t* [: n2 m' g5 {6 x部署管理
- t. Y" E$ y3 d0 b8 ?
5 w7 Y9 ]: N, A" y
容器管理
. i! y8 q i3 S- {; F
) m5 _ {+ b3 F2 v8 q6 D
4 [8 l* {, w* p9 m0 z; q9 p
3.3 技术架构
3 v5 t+ j- o; J9 a7 @6 T G; r
' ~% f8 b! w2 c9 { o& s
( u' U! L' [, d2 }0 c: ^( S; k" A; o, K) _. e% ^% f
对接系统的说明
+ w) ~. S. s. K ]2 V1 L9 U. ]
- 通行证: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 的接口,进行前端站点文件目录的维护
& I: b U8 f# ~2 n 5 h4 A# v0 W( w6 [/ Y
3.4 后端应用的 DevOps 实现详解
4 ^8 w1 [& @8 ~9 M/ c
c5 j3 z) Z0 f4 a. D6 h/ z! ~8 X( \6 ?4 N8 t3 g
& I2 ~$ Y8 ~/ a" K4 R" V
举个栗子进行介绍
$ i5 T- J* c" {
根据模板,创建一个应用 9 L" [: q2 D; m1 H
! s! \9 r4 Y5 C- _, V! L+ m
根据名称默认生成域名
9 ~" k# F$ j2 U8 D9 }
) J }2 I, x0 b6 H* ^
初始化代码仓库,默认生成 Develop 分支
# D4 l# N$ H5 V2 c/ f' h
% M& X0 s" _( {+ x
在 rdms 第一次部署到对应环境(开发、测试、生产等)时,会默认读取 appsettings.Development.json 的文件,并写入 kubernets 的 configmap 0 g) v [/ [0 D" }. P2 x$ ]4 s
构建完成,进行部署
1 p9 E# t" w. y
% M- t: Y$ O4 w" c4 A; I* @3 {% `; D5 ^- {" i, f2 T
4 J1 U& I7 [" ]: L* \
在 kubernets 生成 pod & ?3 V5 N6 P/ C2 ^) F
% y/ g! O! ?$ N: t# o4 c
% d, H$ }, \& [' ^$ j
通过域名访问接口文档
0 i/ `0 D$ H& z$ [% f7 z) y4 P
" `' ~8 ?, ?) Z- v1 t% m, S4 p( M4 a& e, y7 u
# k5 y" l, I. N" W; |( Q5 y
- c$ q/ ^: n7 i q+ v' N5 H6 D+ P3.5 前端站点的 DevOps 实现详解
: G; l" ~6 {) c+ K6 r; z: Y( n
3 k* o+ d3 ~/ e" Q, W# V& `4 @: o
9 B/ X. j' J3 T C1 n
; r% W# g/ D) _3 }2 p同样的,举个栗子介绍 3 N) O$ S/ J8 |6 J. J7 u9 m8 Z# G, B
首页-创建前端站点 ' M) C5 S* z) Z& s( E% V: Z7 ]
1 ^: y( l: W* s0 E9 U: x
根据名称生成域名
0 J9 N2 A; s$ |2 X @- M* D- z: H
初始化代码仓库,默认生成 Develop 分支 / G1 H* ?0 K9 Z1 W
0 l2 p5 w& p* u" B, {
+ c. o" @! j' o) N5 t4 X% E/ C& f8 D& c. d: G- K
配置文件,默认生成几套环境的配置文件,站点的配置维护就是维护这几个文件
9 E+ n& i. O8 U% { O) c, o; P3 p
5 U. L4 |* g" S- g
4 y. a S k- U1 ]4 z! a! W1 Q& \# s. m0 C( I( G* I G
部署应用
/ g+ {2 v5 ~! [; p
# J- b$ c; c2 f' n! M/ o ^( `1 X) G- ~8 o
2 `4 i- [9 }& r% V. m* |7 x0 d( _& a4 N9 h' ?" R
Kubernetes 的 nginx 容器内可以看到部署的文件,实际就是挂载的 oss 到该 pod 上% K) G3 U0 v; l( O1 |
. O. n5 l4 ^1 J3 u( m2 v8 ?$ X( B) X
1 Y# E) ?3 K1 e3 B
; z2 W8 o& ?) H4 p7 |
" X% J) f( `. c(转自福禄渣渣辉)
7 V' C3 O+ Q8 S+ ?; k( ~- n
8 z8 V+ {# `. H: o- I4 d+ C4 z
" `& d+ b8 t7 V X$ c( v- d/ D4 E% U: u9 t r# J: I/ N4 [- b) B
8 o3 m p3 b% |0 `( ?1 q6 o+ z& Z
0 g( @% O4 H! P- d1 D1 y9 l$ r$ Y
|