为什么要用云自动化方案?

根因是解决单主问题,自动化是DevOps落地的基石,平台必须要考虑大规模场景问题,传统的Jenkins存在单主问题,而云原生的主节点可弹性伸缩的。

用云原生还能很好的解决资源管理、多仓库依赖构建、多服务依赖发布等问题,同时扩展性良好,易维护

我是怎么实现的?

基础架构

基础架构是编排+DAG(云原生)+插件

DAG(云原生)

有向无环图,有效控制任务执行的顺序和依赖

业界开源的主要有两款产品:argo Workflowtekton

目前采用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、自动化测试任务。

  1. CI:
    1. common(公共依赖库)
      1. 下载common代码
      2. 编译:同时上传jar包到私服
    2. user包含api和service模块):common任务结束后执行
      1. 下载代码
      2. 编译user-api
      3. 编译user-service:依赖user-api和common-api
      4. 构建user镜像:同时上传镜像到镜像库
  2. CD:部署user服务
    1. 先更新服务配置
    2. 部署服务
    3. 检查服务:面向用户端,非localhost
    4. 更新数据库
  3. 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多平台发布

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐