如何用 Slack 和 Kubernetes 构建一个聊天机器人?| 附代码
作者头像
  • hc212174515
  • 2020-05-29 13:35:43 1

如何利用Slack构建一个简单的Kubernetes管理机器人

作者 | Alexander Kainz
译者 | 天道酬勤

本文将引导你了解如何利用Slack构建一个简单的机器人来管理Kubernetes集群。通过这个机器人,你可以使用Slack消息来查看Kubernetes的日志和信息,而无需具备Kubernetes的专业知识或掌握Slack API。

ChatOps简介

ChatOps是一种通过聊天消息执行DevOps任务的方法,例如部署、监控和系统管理。例如,通过发送聊天消息,你可以获取最新的日志信息或触发部署过程。这种方法的优点包括:

  • 人性化管理:与机器人聊天是一种人性化的管理基础设施的方法。例如,@chatbot提供的日志信息比kubectl日志更容易理解。
  • 协作与共享:它可以作为共享聊天的一部分,方便人们协作和共享信息。同时,它还能记录已执行的命令和动作。
  • 安全访问:ChatOps有助于克服网络和防火墙的限制,使得远程办公变得可行。
  • 简化操作:通过统一的接口管理Kubernetes和OpenShift,简化和保护基础设施的操作,使开发者能够独立完成任务。

环境设置

本文将介绍如何使用以下工具构建最小的聊天机器人:

  • Minikube:用于在开发机器上运行Kubernetes。
  • Kubernetes:用于部署、管理和扩展Docker镜像。
  • Slack:作为聊天服务器。
  • Python:实现实际的ChatOps服务器。

Minikube设置

Minikube是一个用于在本地运行Kubernetes的集成解决方案。以下是安装步骤:

  1. 安装Homebrew:https://brew.sh/
  2. 使用Homebrew安装Minikube: bash brew install minikube
  3. 启动Minikube并使用VirtualBox作为虚拟化驱动程序: bash minikube start --driver=virtualbox
  4. 部署示例应用程序: bash kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10

要验证安装是否成功,可以运行以下命令: bash kubectl get all 结果应显示示例Pod,例如pod/hello-minikube-64b64df8c9-fkb6w

Kubernetes简介

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设置

如果你还没有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”。

ChatOps服务器

服务器代码可以在以下位置找到: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:为用户获取应用。
  • logsdescribe:分别用于检索所选应用的日志和信息。

为了存储选定的应用,我们将使用嵌入式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应用组成。

    本文来源:图灵汇
责任编辑: : hc212174515
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
何用机器人Kubernetes构建代码聊天一个Slack
    下一篇