运维操作
在云原生的Day2运维中,对于运维工程师来说,经常要进行以下运维操作:例如分批发布、水平扩缩容、垂直扩缩容、断电恢复、主从切换、日志清理、备份还原、故障恢复等,由于运维工程师的语言和背景不同,实现运维操作的方式参差不齐,导致应用运维的复杂度和出错率逐渐上升。ADP底座提供的运维操作正是想解决运维操作的执行难度和准确性的问题。
功能概述
ADP的运维操作可以根据业务场景进行扩展,目前主要解决以下问题:
根据业务流量进行运维变更,比如你发现你的业务应用RT过高,可以进行水平扩缩容;
产品交付升级,可能需要编排一组相互依赖的运维操作去执行变更;
监控告警和故障诊断后需要修复问题,可以通过运维操作编排去执行变更。
接入流程
ADP的运维操作借鉴FaaS理念,分为运维逻辑 + 触发操作两部分,运维逻辑通过Function来实现,触发操作通过Trigger来实现。ADP的运维操作提供了多种触发方式,例如Metrics触发器、定时触发器、K8s事件触发器等。还可以对运维操作编排流水线。可以说Metrics触发器完美地解决了智能运维的问题。目前内置了常用中间件的运维操作(主从备份、扩缩容)、无状态应用的通用运维操作(水平扩缩容、垂直扩缩容、存储扩容、日志清理、灰度部署等)。
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存储扩容等。他们的初始化标准如下:
水平扩缩容
初始化标准:
组件的helm values有replicaCount的配置
组件包含StatefulSet、Deployment、DaemonSet之一的工作负载实例
初始化的 Operation CR:
{componentName}-pod-scaleup
{componentName}-pod-scaledown
垂直扩缩容
初始化标准:
组件的helm values有resources.limits的配置
组件包含StatefulSet、Deployment、DaemonSet之一的工作负载实例
初始化的 Operation CR:
{componentName}-resource-scaleup
{componentName}-resource-scaledown
PVC存储扩容
初始化标准:
组件包含StatefulSet、Deployment、DaemonSet之一的工作负载实例
组件的工作负载配置了PVC
初始化的 Operation CR:
{componentName}-storage-scaleup
自定义运维操作
自定义运维操作就是根据自己的业务,编写Operation CR,目前合作伙伴中间件基本都自定义了运维操作。编写流程如下:
梳理该运维操作的运维逻辑,需要执行哪些步骤。
梳理这些Step,需要调用哪些函数去执行。如果发现默认的函数不够用,可以编写Nuclio Function,参考开源技术nuclio。
编写Operation CR的参数params、执行步骤steps、触发器trigger。
编写该运维操作的前端模板,目前主要复用官方提供的通用模板即可。