Skip to main content

Command Palette

Search for a command to run...

Errbot 入门(3)

Updated
2 min read

通过 Errbot 控制 Kubernetes

前面两篇分别讲了 Errbot 的简单启动和 Slack 的集成。这一篇做个结尾,用 Errbot 来查询 Kubernetes 的状态。

之前使用的 Docker 镜像中,已经集成了 Kubernetes 的 Python 客户端,所以这里只要在 Python 中引用,就可以操作了。

这里实现两个功能,第一个是列出 kubeconfig 文件中的 context,第二个是列出集群 Node 的健康状况。

准备工作

首先在 Errbot 的加载卷目录中新建目录kubeconfig,并在其中放置一个可用的 kubeconfig 文件。例如:

** /usr/local/var/volumes/errbot/kubeconfig/config **

apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority: ca-dummy/ca.pem
    server: https://10.211.55.11:6443
  name: default
users:
- name: default
  user:
    client-certificate: ca-dummy/admin.pem
    client-key: ca-dummy/admin-key.pem
contexts:
- context:
    cluster: default
    user: default
  name: default
current-context: default

当然,要确保 Errbot 到 Kubernetes 的网络连接是有效的。

Context 列表

from errbot import BotPlugin, botcmd, re_botcmd
import re
from kubernetes import config, client


class Kube(BotPlugin):
  @botcmd
  def context_list(self, msg, args):
      """ List all contexts in the kubeconfig file.
      """
      yield("Context in the kubeconfig:")
      for context_name in list_context():
          yield(context_name)


def list_context():
    (context_list, context_current) = config.list_kube_config_contexts(
        "/errbot/kubeconfig/config")
    result = []
    for context in context_list:
        result.append(context["name"])
    return result

import 部分引入了几个常用的 Bot 开发支持库,以及 Kubernetes API 库。

接下来创建新的 Bot 插件 Kube

@botcmd 修饰其中的方法 context_list,也就是生成了一个 !context list 命令。

注释内容会出现在命令列表的说明中。

内容很简单,调用 kubernetes API 的 config.list_kube_config_contexts 方法,列出其中所有的 context。

yield 在这里用于输出多行数据到聊天室。

使用 !restart 命令重启 Bot 之后,输入 !help 查看我们的插件,会看到列表中多出这样的内容:

Kube This is a simple plugin example to get you started. • !context list - List all contexts in the kubeconfig file.

执行 !context list,Bot 读取配置文件,返回了其中的 Context 名称列表:

Context in the kubeconfig: default

接下来加入列出 Node,并查看健康状态代码

@botcmd(split_args_with=None)
def cluster_health(self, msg, args):
    """Simpler checker nodes, pods and workload controllers.
    """
    if len(args) != 1:
        yield("This command need context name as the only parameter.")
        yield("Here is the context list:")
        for context_name in list_context():
            yield(context_name)
        return

    context_name = args[0]
    api_instance = get_instance(context_name)
    node_list = api_instance.list_node()
    # Node
    yield("Checking Nodes...")
    for node in node_list.items:
        name = node.metadata.name
        status = "NotReady"
        last_condition = node.status.conditions[-1:][0]
        if (last_condition.type == "Ready" and
                last_condition.status == "True"):
            status = "Ready"
        if status != "Ready":
            yield("{} {}\n".format(name, status))

def get_instance(context_name, api_version="core_v1"):
    api_client = config.load_kube_config(
        config_file="/errbot/kubeconfig/config",
        context=context_name)
    api_instance = client.CoreV1Api(api_client)
    return api_instance

@botcmd(split_args_with=None),这一注解的意思是对聊天内容进行分拆,分拆产生的列表保存在args 之中。

对 Node 的 Status 对象的 Conditions 列表进行解析,如果最后一个状态不是 Ready,则输出不健康 Node。

打完收工

在我们常见的工作场景中,结合各种系统的 API,可以利用 Errbot 在同一个聊天室中做很多操作,例如:

  1. 触发 Jenkins 构建

  2. 对 ElasticSearch、Zabbix、Prometheus 进行查询

  3. 管理 Kubernetes 负载。

  4. 等等等等。

实际上除了这两种看起来比较古板的交流方式之外,还有看起来舒服一点的正则表达式匹配方式,然而,目前更大的热点是 AI,有了这种支持,个人觉得就不必挖空心思的琢磨分词和模式的问题了,做好和第三方的链接就可以了。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts