运维操作

更新时间: 2023-04-11 22:25:58

在云原生的Day2运维中,对于运维工程师来说,经常要进行以下运维操作:例如分批发布、水平扩缩容、垂直扩缩容、断电恢复、主从切换、日志清理、备份还原、故障恢复等,由于运维工程师的语言和背景不同,实现运维操作的方式参差不齐,导致应用运维的复杂度和出错率逐渐上升。ADP底座提供的运维操作正是想解决运维操作的执行难度和准确性的问题。

功能概述

ADP的运维操作可以根据业务场景进行扩展,目前主要解决以下问题:

  • 根据业务流量进行运维变更,比如你发现你的业务应用RT过高,可以进行水平扩缩容;

  • 产品交付升级,可能需要编排一组相互依赖的运维操作去执行变更;

  • 监控告警和故障诊断后需要修复问题,可以通过运维操作编排去执行变更。

接入流程

ADP的运维操作借鉴FaaS理念,分为运维逻辑 + 触发操作两部分,运维逻辑通过Function来实现,触发操作通过Trigger来实现。ADP的运维操作提供了多种触发方式,例如Metrics触发器、定时触发器、K8s事件触发器等。还可以对运维操作编排流水线。可以说Metrics触发器完美地解决了智能运维的问题。目前内置了常用中间件的运维操作(主从备份、扩缩容)、无状态应用的通用运维操作(水平扩缩容、垂直扩缩容、存储扩容、日志清理、灰度部署等)。

image

Spec定义

运维操作定义

概念定义:运维操作定义,设置运维操作的参数定义,执行步骤调用的函数等,可以传入具体参数值出创建执行任务多次执行。

apiVersion: adp.aliyun.com/v1
kind: Operation
metadata:
  labels:
    adp.aliyuncs.com/application-name: demo
    adp.aliyuncs.com/component-name: web
    adp.aliyuncs.com/operation-category: deploy
  name: web-pod-scaleup
  namespace: default
spec:
  title: 水平扩容 # 运维操作标题
  category: deploy  # 运维操作分类
  description: 水平扩容Pod的副本数 # 运维操作描述
  paramsDef:  # 运维操作参数
    - name: productName   # 参数名称
      value: demo # 参数默认值
    - name: productNamespace
      value: default
    - name: componentName
      value: web
    - name: componentNamespace
      value: default
    - name: replicaCount
      value: "2"
  steps:  # 运维操作执行步骤
    - name: UpdateReplicaCount
      title: 更新副本数
      functionRef:  # 执行函数
        name: adp-aliyun-component-patch
        namespace: acs-system
      data: |   # 函数入参
        {
          "productName": "${productName}",
          "productNamespace": "${productNamespace}",
          "componentName": "${componentName}",
          "patch": {"replicaCount": ${replicaCount}}
        }
    - name: ComponentStatusCheck
      title: 检查组件状态
      functionRef:
        name: adp-aliyun-resources-status-check
        namespace: acs-system
      initialDelaySeconds: 30   # 在上一步骤执行完成后,延期执行秒数
      data: |
        {
          "kind": "Pod",
          "namespace": "${componentNamespace}",
          "labels": {"adp.aliyuncs.com/component-name": "${componentName}"},
          "expected": {"status.phase": "Running|Succeeded"}
        }
  triggers:   # 运维操作触发器,可以有多个
    - name: cron1
      type: Cron # 触发器类型,包括Cron/K8SEvent
      props:
        cronExpression: 30s
    - name: event1
      type: K8SEvent
      props:
        events:
          - add
          - update
          - delete
        apiVersion: apps/v1
        kind: Deployment
        namespace: acs-system
        name: redis
        labels:
          adp.aliyuncs.com/component-name: redis.redis

运维操作执行任务

概念定义:运维操作执行任务,传入具体的运维变更参数,得到运维执行结果。

apiVersion: adp.aliyun.com/v1
kind: OperationRun
metadata:
  labels:
    adp.aliyuncs.com/application-name: demo
    adp.aliyuncs.com/component-name: web
    adp.aliyuncs.com/operation-name: web-pod-scaleup
  name: web-pod-scaleup-3374d59a
  namespace: default
spec:
  OperationRef: # 引用的运维操作
    name: web-pod-scaleup 
    namespace: default
  reason: test # 执行原因
  createdBy: admin  # 执行者
  params: # 执行参数
    productName: demo
    productNamespace: default
    componentName: web
    componentNamespace: default
    replicaCount: "2"
status:
  execTime: "2022-05-26T08:55:53Z" # 执行时间
  latency: 30532  # 执行总耗时
  phase: Succeeded  # 执行状态,NotExecuted/Pending/Succeeded/Failed/stopped
  stepRuns:
    - name: UpdateReplicaCount
      title: 更新副本数
      execTime: "2022-05-26T08:55:53Z" # 步骤开始执行时间
      latency: 517 # 步骤执行耗时
      phase: Succeeded
      retried: 1  # 步骤重试次数
      functionRef:
        name: adp-aliyun-component-patch
        namespace: acs-system
      input: | # 输入数据
        {
          "productName": "demo",
          "productNamespace": "default",
          "componentName": "web",
          "patch": {"replicaCount": 2}
        }
      output: "" # 输出结果
      log: "" # 执行日志
    - name: ComponentStatusCheck
      title: 检查组件状态
      execTime: "2022-05-26T08:56:23Z"
      latency: 14
      phase: Succeeded
      functionRef:
        name: adp-aliyun-resources-status-check
        namespace: acs-system
      initialDelaySeconds: 30
      input: |
        {
          "kind": "Pod",
          "namespace": "default",
          "labels": {"adp.aliyuncs.com/component-name": "web"},
          "expected": {"status.phase": "Running|Succeeded"}
        }
      output: ""
      log: ""

如何接入运维操作

通用运维操作

ADP底座默认会帮组件初始化一批通用运维操作包扩水平扩缩容、垂直扩缩容、PVC存储扩容等。他们的初始化标准如下:

  1. 水平扩缩容

初始化标准:

  1. 组件的helm values有replicaCount的配置

  2. 组件包含StatefulSet、Deployment、DaemonSet之一的工作负载实例

初始化的 Operation CR:

{componentName}-pod-scaleup

{componentName}-pod-scaledown

  1. 垂直扩缩容

初始化标准:

  • 组件的helm values有resources.limits的配置

  • 组件包含StatefulSet、Deployment、DaemonSet之一的工作负载实例

初始化的 Operation CR:

{componentName}-resource-scaleup

{componentName}-resource-scaledown

  1. PVC存储扩容

初始化标准:

  • 组件包含StatefulSet、Deployment、DaemonSet之一的工作负载实例

  • 组件的工作负载配置了PVC

初始化的 Operation CR:

{componentName}-storage-scaleup

自定义运维操作

自定义运维操作就是根据自己的业务,编写Operation CR,目前合作伙伴中间件基本都自定义了运维操作。编写流程如下:

  1. 梳理该运维操作的运维逻辑,需要执行哪些步骤。

  2. 梳理这些Step,需要调用哪些函数去执行。如果发现默认的函数不够用,可以编写Nuclio Function,参考开源技术nuclio

  3. 编写Operation CR的参数params、执行步骤steps、触发器trigger。

  4. 编写该运维操作的前端模板,目前主要复用官方提供的通用模板即可。

阿里云首页 云原生应用交付平台 相关技术圈