作者 | Alexander Kainz
译者 | 天道酬勤
本文将引导你了解如何利用Slack构建一个简单的机器人来管理Kubernetes集群。通过这个机器人,你可以使用Slack消息来查看Kubernetes的日志和信息,而无需具备Kubernetes的专业知识或掌握Slack API。
ChatOps是一种通过聊天消息执行DevOps任务的方法,例如部署、监控和系统管理。例如,通过发送聊天消息,你可以获取最新的日志信息或触发部署过程。这种方法的优点包括:
本文将介绍如何使用以下工具构建最小的聊天机器人:
Minikube是一个用于在本地运行Kubernetes的集成解决方案。以下是安装步骤:
bash
brew install minikube
bash
minikube start --driver=virtualbox
bash
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10
要验证安装是否成功,可以运行以下命令:
bash
kubectl get all
结果应显示示例Pod,例如pod/hello-minikube-64b64df8c9-fkb6w
。
Kubernetes是一款用于管理Docker镜像的软件,涵盖部署、扩展、管理和监控。基本部署单元是Pod,它可以包含多个Docker镜像或容器。本文开发的聊天机器人仅支持单个图像的Pod。可以通过kubectl命令和其他方式进行Kubernetes操作。
我们的服务器将使用以下Kubernetes命令:
kubectl get pods --selector=app={app} --namespace={namespace}
:在指定命名空间中检索应用的Pod。kubectl logs {pod} --namespace={namespace}
:获取指定Pod的日志。kubectl describe pod {pod} --namespace={namespace}
:描述有关Pod的详细信息。如果你还没有Slack账户,可以在这里注册:https://slack.com
我们将创建一个所谓的经典App,以便使用实时消息(RTM)API。可以在以下链接创建经典App:https://api.slack.com/apps?newclassicapp=1
确保创建的是经典App,而不是新App,因为后者不支持实时消息。App需要以下权限:bot和chat:write:bot。
最后一步是将App安装到工作区并记下机器人令牌,单击“将应用安装到团队”。我们将允许该App访问我们的工作区,并记下“Bot User OAuth Access Token”。
服务器代码可以在以下位置找到:https://gitlab.com/alexk/chatops-kubernetes
它需要Python 3,例如可以在MacOS上使用Homebrew安装:
bash
brew install python3
然后下载并安装依赖项:
bash
git clone git@gitlab.com:alexk/chatops-kubernetes.git
cd chatops-kubernetes/
pip3 install -r requirements.txt
设置Slack令牌:
bash
export SLACK_API_TOKEN=<Your Slack token starts with xoxb-…>
启动聊天机器人服务器:
bash
python3 chatbot.py
我们将使用Slack中的实时消息传递功能。为此,必须创建一个经典App。经典App允许我们使用WebSockets连接到Slack,从而避免需要开放传入端点。
服务器将支持以下四个命令:
set-app
:为用户设置应用,以避免每次使用其他命令时都需要提供应用名称。get-app
:为用户获取应用。logs
和 describe
:分别用于检索所选应用的日志和信息。为了存储选定的应用,我们将使用嵌入式SQLite3数据库。
主事件循环如下所示: ```python @RTMClient.runon(event="message") def processcommand(**payload): data = payload['data'] webclient = payload['webclient']
# 忽略服务消息,例如加入频道
is_service = 'subtype' in data and data['subtype'] is not None
if not is_service and 'text' in data:
channel_id = data['channel']
thread_ts = data['ts']
user = data['user']
text = data['text']
tokens = text.split()
me = tokens[0]
conv = Conversation(web_client, channel_id, user)
if len(tokens) > 1:
command = tokens[1]
if command in commands:
command_func = commands[command]
try:
args = tokens[2:]
result = command_func(conv, args)
if result is not None:
conv.msg(result)
except Exception as e:
conv.msg(str(e))
else:
conv.msg(welcome.format(user=user, me=me))
```
该函数使用@RTMClient.run_on(event="message")
注解,每次在当前聊天中发送消息时,Python Slack客户端都会调用它。
为了确保我们没有收到自己的消息或服务消息(例如“...已经加入频道”),我们使用以下代码:
python
is_service = 'subtype' in data and data['subtype'] is not None
接收到消息后,我们将其转换为令牌并获取每个命令的实际处理程序,然后解析传入的参数。例如,set-app
命令会将应用存储在用户数据库中,以便用户使用。为此,我们使用os.popen(cmd)
:
python
def logs(pod, namespace):
cmd = f'kubectl logs {pod} --namespace={namespace}'
print(f'Executing {cmd}')
stream = os.popen(cmd)
return stream.read()
通过使用Slack客户端支持的实时消息API,我们可以构建一个执行Kubernetes命令的简单聊天机器人。也可以使用Slack的现代POST事件来构建ChatBots。下一步是通过建立授权模型来提高安全性。当编排多个DevOps工具时,可能需要实现一个DevOps API来处理实际的编排并提供公共接口。然后可以使用该接口构建多通道DevOps工具集,例如,可以由仪表板和ChatOps应用组成。