DevOps自动化一:我的云解决方案
平台必须要考虑大规模场景问题,传统的Jenkins存在单主问题,而云原生的主节点可弹性伸缩的。编译user-service:依赖user-api和common-api。user包含api和service模块):common任务结束后执行。是对计算机系统、应用及服务的自动化配置、管理和协调,编排可以。检查服务:面向用户端,非localhost。构建user镜像:同时上传镜像到镜像库。任务顺序说明:箭
·
为什么要用云自动化方案?
根因是解决单主问题,自动化是DevOps落地的基石,平台必须要考虑大规模场景问题,传统的Jenkins存在单主问题,而云原生的主节点可弹性伸缩的。
用云原生还能很好的解决资源管理、多仓库依赖构建、多服务依赖发布等问题,同时扩展性良好,易维护。
我是怎么实现的?
基础架构
基础架构是编排+DAG(云原生)+插件。
DAG(云原生)
有向无环图,有效控制任务执行的顺序和依赖。
业界开源的主要有两款产品:argo Workflow和tekton。
目前采用
argo Workflow
落地,因为它一切都是模板
,概念简单,功能强大且灵活。
编排
编排是对计算机系统、应用及服务的自动化配置、管理和协调,编排可以更轻松地管理复杂任务和工作流。
下面为一个简单任务的编排示例
kind: Engine
apiVersion: api/v1
metadata:
name: demo # 指定任务名称
namespace: ops-mz830 # 指定运行命名空间,按项目划分
envs: # 同时部署开发和测试环境
- dev
- sit
labels: # 为任务打标签
app: demo
annotations:
title: '测试devops功能(不影响服务)'
spec:
global: # 全局配置,主要配置工作流和k8s
workflow:
templates:
- name: whalesay # 定义执行任务的模板:测试用 打印消息 功能类似shell echo ${msg}
inputs:
parameters:
- name: msg
container:
image: docker/whalesay
command: [ cowsay ]
args: [ "{{inputs.parameters.msg}}" ]
oneStep: # 定义执行的任务:oneStep(一步任务,优化展示效果和性能,适用于简单任务),stages(多阶段任务,适用于复杂任务场景)
exec:
- name: pull-code
template: whalesay
arguments:
parameters:
- name: msg
value: '下载代码'
- name: compile-api
template: whalesay
arguments:
parameters:
- name: msg
value: '编译api'
depends: [ pull-code ] # 需等 `pull-code`执行结束再执行compile-api
工作流
执行日志
插件
除编排能力建设外,其它能力建设都由插件完成,包括脚本、配置、镜像制作、容器运行、三方接口对接等等。
比如前面执行echo ${msg}
的容器
一个完整编排示例
流程简述
模拟CI、CD、自动化测试任务。
- CI:
- common(公共依赖库)
- 下载common代码
- 编译:同时上传jar包到私服
- user包含api和service模块):common任务结束后执行
- 下载代码
- 编译user-api
- 编译user-service:依赖user-api和common-api
- 构建user镜像:同时上传镜像到镜像库
- common(公共依赖库)
- CD:部署user服务
- 先更新服务配置
- 部署服务
- 检查服务:面向用户端,非localhost
- 更新数据库
- test:自动化测试,同时**接口(仅user)和UI(整个系统)**自动化测试
完整编排
kind: Engine
apiVersion: api/v1
metadata:
name: demo
namespace: ops-mz830
envs: # 支持多环境
- dev # 仅部署dev环境
labels:
app: demo
annotations:
title: '测试devops功能(不影响服务)'
spec:
global: # 全局配置,主要配置工作流和k8s
workflow:
taskType: Dag
parallelism: 64
ttlStrategy:
secondsAfterCompletion: 86400 # 1天
secondsAfterSuccess: 86400 # 1天
secondsAfterFailure: 172800 # 2天
templates:
- name: whalesay # 定义执行任务的模板:测试用 打印消息 功能类似shell echo ${msg}
inputs:
parameters:
- name: msg
container:
image: docker/whalesay
command: [ cowsay ]
args: [ "{{inputs.parameters.msg}}" ]
kube:
dnsPolicy: Default
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: ops
operator: In
values:
- public
stages: # 多阶段任务 构建复杂任务
- name: "ci"
desc: "功能包括下载代码、编译、制作镜像"
traits:
kube:
volumes:
- name: workspace
emptyDir: { }
volumeMounts:
- mountPath: /workspace
name: workspace
steps:
- name: common # 下载和编译(上传到私库)公共依赖包
exec:
- name: pull-code
template: whalesay
arguments:
parameters:
- name: msg
value: '下载代码'
- name: compile-api
template: whalesay
depends: [ pull-code ]
arguments:
parameters:
- name: msg
value: '编译api'
- name: user # 一个适配服务
depends: [ common ]
exec:
- name: pull-code
template: whalesay
arguments:
parameters:
- name: msg
value: '下载代码'
- name: compile-api
template: whalesay
depends: [ pull-code ] # 依赖下载代码
arguments:
parameters:
- name: msg
value: '编译api'
- name: compile-service
template: whalesay
depends: [compile-api ] # 依赖编译api
arguments:
parameters:
- name: msg
value: '编译service'
- name: image
template: whalesay
depends: [compile-service ] # 制作镜像并上传到镜像库
arguments:
parameters:
- name: msg
value: '制作镜像并上传到镜像库'
- name: "cd"
desc: "功能包括k8s、nacos"
depends: ["ci"] # 依赖CI结束
steps:
- name: user
exec:
- name: kube
template: whalesay
depends: [ config ] # 先更新服务配置
arguments:
parameters:
- name: msg
value: '部署到k8s user'
- name: health
template: whalesay
depends: [ kube ] # 部署结束后做健康检查
arguments:
parameters:
- name: msg
value: '健康检查 user'
- name: config
template: whalesay
arguments:
parameters:
- name: msg
value: '更新配置 user'
- name: db
template: whalesay
depends: [ health ] # 服务部署成功后更新数据库数据
arguments:
parameters:
- name: msg
value: '更新数据库 user'
- name: "test"
desc: "自动化测试,包含接口自动化、ui自动化、app自动化"
depends: ["cd"] # 依赖服务部署成功后
steps:
- name: "" # 为空字符串或不设置值,则不会拼接到任务名称
exec:
- name: user-interface
template: whalesay
arguments:
parameters:
- name: msg
value: 'user服务接口自动化测试'
- name: ui
template: whalesay
arguments:
parameters:
- name: msg
value: 'ui自动化测试'
任务执行结果
任务顺序说明:箭头方向表示任务执行顺序
CI任务
CD任务
自动化测试任务
【不分】执行日志
结语
云解决方案的核心是编排的设计和实现,规模问题交给k8s解决。
请用微信扫码关注下🙏 ,持续更新云原生DevOps最佳实践。
本文由mdnice多平台发布
更多推荐
已为社区贡献2条内容
所有评论(0)