在当今这个云计算技术迅猛发展的时代,企业面临着前所未有的挑战与机遇。随着云基础设施的日益复杂化,它们成为了企业运营不可或缺的支柱。网站可靠性工程师(Site Reliability Engineers,简称SRE)和DevOps团队肩负着关键任务,即管理和维护系统的稳定性,这包括故障的检测、诊断和缓解。特别是在微服务和无服务器架构成为主流的今天,这些任务的难度和复杂性都在不断上升。这些架构虽然提升了系统的可扩展性,但同时也可能带来新的故障点,比如在亚马逊的AWS云平台上,仅仅一小时的服务中断就可能造成巨大的经济损失。
为了应对这些挑战,微软的研究人员和加州大学伯克利分校、伊利诺伊大学香槟分校、印度科学研究所以及Agnes Scott学院的团队一起,开发了AIOpsLab。这个框架就是为了让AIOps代理的设计、开发和提升变得更加系统化。AIOpsLab的目标是提供可复制、标准化、可扩展的基准。它的核心功能包括整合现实世界的工作负载、故障注入能力,还有代理和云环境之间的接口,这样就能模拟出类似生产环境的场景。这个开源框架覆盖了云运营的整个生命周期,从故障检测到解决,一应俱全。通过提供模块化、可适应的平台,AIOpsLab帮助研究人员和实践者提升云系统的可靠性,减少对手动干预的依赖。
图 1:AIOpsLab 的系统架构
如图1所示,协调器(Orchestrator)就像是系统元素之间的协调者,也是代理和云之间的接口(Agent-Cloud-Interface,ACI)。代理通过协调器来解决问题,接收问题描述、指令和相关API。协调器用工作负载(Workload)和故障(Fault)生成器来制造各种问题,然后注入到它能部署的应用中。部署的服务在多个层面都能被观察到,提供遥测数据、追踪和日志。协调器用Kubernetes、Helm甚至Shell这些工具和服务、云进行沟通。代理通过协调器来行动,协调器执行它们并更新服务的状态。最后,协调器用预定义的指标来评估解决方案。
技术细节和优势
AIOpsLab框架有几个关键组件。协调器是一个核心模块,它通过提供任务描述、动作API和反馈来协调代理和云环境之间的互动。故障和工作负载生成器模拟现实世界的条件来考验被测试的代理。可观察性是框架的另一个基石,它提供全面的遥测数据,比如日志、指标和跟踪,帮助诊断故障。这种设计很灵活,可以和多种架构集成,包括Kubernetes和微服务。AIOpsLab通过标准化AIOps工具的评估,确保了测试环境的一致性和可复制性。它还为研究人员提供了关于代理性能的宝贵信息,让故障定位和解决能力能持续提升。
结果和洞见
在一个案例研究中,研究人员用DeathStarBench的SocialNetwork应用程序来测试AIOpsLab的能力。他们设置了一个真实的故障------微服务配置错误------然后测试了一个基于LLM的代理,这个代理用的是GPT-4驱动的ReAct框架。代理在36秒内就识别并解决了问题,这显示了框架在模拟现实世界条件方面的有效性。详细的遥测数据对于找出问题的根本原因非常关键,而协调器的API设计帮助代理在探索性和针对性行动之间找到了平衡。这些发现都强调了AIOpsLab作为一个强大基准的潜力,它能帮助评估和提升AIOps代理。
安装和设置选项
AIOpsLab提供了灵活的设置选项,适应不同的用户环境。根据您现在的设置,您可以选择以下路径之一:
-
使用已有的带有Kubernetes集群的虚拟机:
您可以用下面的命令来克隆仓库。我们推荐用
poetry
来管理依赖,您也可以用标准的pip install -e .
来安装包。$ git clone <CLONE_PATH_TO_THE_REPO>
$ cd AIOpsLab
$ pip install poetry
$ poetry install -vvv
$ poetry shell -
在现有的虚拟机上设置Kubernetes
您还需要一个运行中的Kubernetes(k8s)集群作为前提。您可以参照官方的 k8s 安装(
https://github.com/microsoft/AIOpsLab/blob/main/scripts/kube_install.sh
),它会直接在服务器上安装k8s(注意,这只是一个安装示例,不是可执行脚本;您可能需要根据您的情况修改一些部分,比如脚本中的节点名称和证书哈希)。之后,运行:$ cd scripts
$ ./setup.sh $(hostname) # 或者 <YOUR_NODE_NAME> -
在云上配置虚拟机和Kubernetes
用户可以在公有云,比如Azure上创建一个双节点Kubernetes集群。这也可以作为创建更复杂部署或在其他云上部署的起点。
快速开始
作为代理的人类:
$ python3 cli.py
(aiopslab) $ start misconfig_app_hotel_res-detection-1 # 或者选择任何您想要解决的问题
# ...等待设置...
(aiopslab) $ submit("Yes") # 提交解决方案
运行GPT-4基线代理:
$ export OPENAI_API_KEY=<YOUR_OPENAI_API_KEY>
$ python3 clients/gpt.py # 您也可以在脚本中更改要解决的问题
您可以用k9s或其他集群监控工具方便地检查集群的状态。
使用方法
AIOpsLab可以这样用:
-
把您的代理接入AIOpsLab
-
向AIOpsLab添加新应用
-
向AIOpsLab添加新问题
如何把您的代理接入AIOpsLab?
AIOpsLab让开发和评估您的代理变得特别简单。您只需要3个简单的步骤就能把您的代理接入AIOpsLab:
-
创建您的代理:您可以自由地用任何您喜欢的框架来开发代理。唯一的要求是:
-
把您的代理包装在一个Python类中,比如叫
Agent
-
在类中添加一个异步方法
get_action
:
根据当前状态并返回代理的行动
async def get_action(self, state: str) -> str:
# <您的代理逻辑在这里> -
-
把您的代理注册到AIOpsLab:现在您可以把代理注册到AIOpsLab的协调器中。协调器会管理您的代理和环境之间的互动:
from aiopslab.orchestrator import Orchestrator
agent = Agent() # 创建您的代理实例
orch = Orchestrator() # 获取AIOpsLab的协调器
orch.register_agent(agent) # 把您的代理注册到AIOpsLab -
在问题上评估您的代理:
- 初始化问题 :AIOpsLab提供了一些问题,您可以在这些问题上评估您的代理。在这里找到可用问题列表或者用
orch.probs.get_problem_ids()
。现在通过它的ID来初始化一个问题:
problem_desc, instructs, apis = orch.init_problem("k8s_target_port-misconfig-mitigation-1")
- 初始化问题 :AIOpsLab提供了一些问题,您可以在这些问题上评估您的代理。在这里找到可用问题列表或者用
-
设置代理上下文:用问题描述、指令和可用的API来为您的代理设置上下文。(这一步取决于您的代理设计,留给用户自己来)
-
开始问题 :通过调用
start_problem
方法来开始问题。您也可以指定最大步数:import asyncio
asyncio.run(orch.start_problem(max_steps=30))
这个过程会创建一个和协调器的Session
,在这个Session
里,代理会解决问题。协调器会评估您的代理的解决方案并提供结果(存储在data/results/
下)。您可以用这些结果来改进您的代理。
如何向AIOpsLab添加新应用?
AIOpsLab提供了一个默认的应用列表,用来评估代理的操作任务。但是,作为开发者,您可以向AIOpsLab添加新应用,并围绕它们设计问题。
要用Helm向AIOpsLab添加新应用,您需要:
-
添加应用元数据
-
应用元数据是一个描述应用的JSON对象。
-
包括任何字段,比如应用的名字、描述、命名空间等等。
-
我们建议还包括一个特别的
Helm Config
字段,如下:
"Helm Config": {
"release_name": "<部署Helm版本名称>",
"chart_path": "<应用Helm图表的路径>",
"namespace": "<应用应该部署的K8S命名空间>"
} -
-
Helm Config
被协调器用来在与应用相关的问题开始时自动部署您的应用。 -
协调器会自动提供所有其他字段作为上下文给代理,用于与此应用相关的任何问题。
创建一个包含这个元数据的JSON文件,并保存在metadata
目录中。比如social-network
应用:social-network.json
- 添加应用类
在apps
目录中的新Python文件里扩展基类:
from aiopslab.service.apps.base import Application
class MyApp(Application):
def __init__(self):
super().__init__("<path to app metadata JSON>")
Application
类为应用提供了基础实现。您可以根据需要覆盖方法并添加新的方法以适应您的应用需求,但基类应该足以满足大多数应用。
如何向AIOpsLab添加新问题?
和应用类似,AIOpsLab提供了一个默认的问题列表来评估代理。但是,作为开发者,您可以向AIOpsLab添加新问题,并围绕您的应用设计它们。
AIOpsLab中的每个问题都有5个组件:
-
应用:问题所基于的应用。
-
任务:代理需要执行的AIOps任务。目前我们支持:检测、定位、分析和缓解。
-
故障:在应用中引入的故障。
-
工作负载:为应用生成的工作负载。
-
评估器:检查代理性能的评估器。
要向AIOpsLab添加新问题,请在problems
目录中创建一个新的Python文件,如下:
-
设置 。导入您选择的应用(比如
MyApp
)和任务(比如LocalizationTask
):from aiopslab.service.apps.myapp import MyApp
from aiopslab.orchestrator.tasks.localization import LocalizationTask -
定义 。要定义一个问题,创建一个从您选择的
Task
继承的类,并定义3个方法:start_workload
、inject_fault
和eval
:class MyProblem(LocalizationTask):
def init(self):
self.app = MyApp()def start_workload(self): # <您的工作负载逻辑在这里> def inject_fault(self) # <您的故障注入逻辑在这里> def eval(self, soln, trace, duration): # <您的评估逻辑在这里>
-
注册。最后,把您的问题添加到协调器的注册表中。
-
start_workload
:启动应用的工作负载。使用您自己的生成器或者AIOpsLab的默认生成器,后者基于wrk2:from aiopslab.generator.workload.wrk import Wrk
wrk = Wrk(rate=100, duration=10)
wrk.start_workload(payload="<wrk payload script>", url="<app URL>") -
inject_fault
:向应用引入故障。使用您自己的注入器或者AIOpsLab的内置注入器,您也可以扩展它。比如,K8S层的配置错误:from aiopslab.generators.fault.inject_virtual import *
inj = VirtualizationFaultInjector(testbed="<namespace>")
inj.inject_fault(microservices=["<service-name>"], fault_type="misconfig") -
eval
:用3个参数评估代理的解决方案:(1) soln :代理提交的解决方案(如果有),(2) trace :代理的行动轨迹,和(3) duration:代理所花费的时间。
在这里,您可以使用每个任务的内置默认评估器和/或添加自定义评估。结果存储在self.results
中:
def eval(self, soln, trace, duration) -> dict:
super().eval(soln, trace, duration) # 默认评估
self.add_result("myMetric", my_metric(...)) # 添加自定义指标
return self.results
注意:当代理开始一个问题时,协调器会创建一个
Session
对象,存储代理的交互。trace
参数是这个会话的记录轨迹。
结论
AIOpsLab为推进自动化云运营提供了一个深思熟虑的方法。它通过解决现有工具的不足,并提供一个可复制和现实的评估框架,来支持可靠和高效的AIOps代理的持续发展。AIOpsLab的开源特性,鼓励了研究人员和实践者之间的合作和创新。随着云系统的规模和复杂性的增长,像AIOpsLab这样的框架将变得越来越重要,它们是确保运营可靠性和推进AI在IT运营中角色的关键。
详见论文:https://arxiv.org/pdf/2407.12165
github: https://github.com/microsoft/AIOpsLab/?tab=readme-ov-file