Kom - Kubernetes Operations Manager
简介
kom 是一个用于 Kubernetes 操作的工具,相当于SDK级的kubectl、client-go的使用封装。
它提供了一系列功能来管理 Kubernetes 资源,包括创建、更新、删除和获取资源。这个项目支持多种 Kubernetes 资源类型的操作,并能够处理自定义资源定义(CRD)。
通过使用 kom,你可以轻松地进行资源的增删改查和日志获取以及操作POD内文件等动作,甚至可以使用SQL语句来查询、管理k8s资源。
特点
- 简单易用:kom 提供了丰富的功能,包括创建、更新、删除、获取、列表等,包括对内置资源以及CRD资源的操作。
- 多集群支持:通过RegisterCluster,你可以轻松地管理多个 Kubernetes 集群,支持AWS EKS集群。
- MCP支持:支持多集群的MCP管理,同时支持stdio、sse两种模式,内置58种工具,支持SSE模式,支持私有化部署,多人共享。支持超过百种组合操作。
- 支持跨命名空间:通过kom.Namespace("default","kube-system").List(&items) 跨命名空间查询资源。
- 链式调用:kom 提供了链式调用,使得操作资源更加简单和直观。
- 支持自定义资源定义(CRD):kom 支持自定义资源定义(CRD),你可以轻松地定义和操作自定义资源。
- 支持回调机制,轻松拓展业务逻辑,而不必跟k8s操作强耦合。
- 支持POD内文件操作,轻松上传、下载、删除文件。
- 支持高频操作封装,如deployment的restart重启、scale扩缩容、启停等20余项操作功能。
- 支持SQL查询k8s资源。select * from pod where metadata.namespace='kube-system' or metadata.namespace='default' order by metadata.creationTimestamp desc
- 支持查询缓存,在高频、批量查询场景下,可设置缓存过期时间,提升查询性能。列表过滤条件不受缓存影响。
- 支持Prometheus查询,支持通过集群内的Prometheus服务或外部Prometheus地址进行监控数据查询,支持瞬时查询和区间查询,提供多种结果解析方式。
示例程序
k8m 是一个轻量级的 Kubernetes 管理工具,它基于kom、amis实现,单文件,支持多平台架构。
- 下载:从 https://github.com/weibaohui/k8m 下载最新版本。
- 运行:使用
./k8m命令启动,访问http://127.0.0.1:3618。
安装
import (
"github.com/weibaohui/kom"
"github.com/weibaohui/kom/callbacks"
)
func main() {
// 注册回调,务必先注册
callbacks.RegisterInit()
// 注册集群
defaultKubeConfig := os.Getenv("KUBECONFIG")
if defaultKubeConfig == "" {
defaultKubeConfig = filepath.Join(homedir.HomeDir(), ".kube", "config")
}
_, _ = kom.Clusters().RegisterInCluster()
_, _ = kom.Clusters().RegisterByPathWithID(defaultKubeConfig, "default")
kom.Clusters().Show()
// 其他逻辑
}使用示例
0. 多集群 k8s MCP 支持
同时支持stdio、sse两种模式 支持多个tools 支持。包括对任意资源的查询列表删除描述操作,以及POD日志读取操作。
1.集成到代码中
// 一行代码启动MCP Server
mcp.RunMCPServer("kom mcp server", "0.0.1", 9096)
2. 编译
# 源码启动
go build main.go
//编译为kom3. 启动
启动后支持两种模式,一种为stdio,一种sse。 管理k8s默认使用KUBECONFIG env环境变量。
# 设置KUBECONFIG环境变量
export KUBECONFIG = /Users/xxx/.kube/config# 运行
./kom
# MCP Server 访问地址
http://IP:9096/sse此时,编译得到的二进制文件,可当做stdio 模式使用。 http://IP:9096/sse 模式,可以当做sse 模式使用。
4. 集成到MCP工具中
支持stdio\sse 两种方式集成。 适合MCP工具集成,如Cursor、Claude Desktop(仅支持stdio模式)、Windsurf等,此外也可以使用这些软件的UI操作界面进行添加。
{
"mcpServers": {
"kom": {
"type": "sse",
"url": "http://IP:9096/sse"
}
}
}{
"mcpServers": {
"k8m": {
"command": "path/to/kom",
"args": []
}
}
}MCP工具列表(59种)
| 类别 | 方法 | 描述 |
|---|---|---|
| 集群管理(1) | list_k8s_clusters | 列出所有已注册的Kubernetes集群 |
| DaemonSet管理(1) | restart_k8s_daemonset | 通过集群、命名空间和名称,重启DaemonSet |
| 部署管理(12) | scale_k8s_deployment | 通过集群、命名空间、名称 扩缩容Deployment,设置副本数 |
restart_k8s_deployment | 通过集群、命名空间和名称,重启Deployment | |
stop_k8s_deployment | 停止Deployment | |
restore_k8s_deployment | 恢复Deployment副本数 | |
update_k8s_deployment_image_tag | 更新Deployment中容器的镜像Tag | |
get_k8s_deployment_rollout_history | 查询升级历史 | |
undo_k8s_deployment_rollout | 回滚 | |
pause_k8s_deployment_rollout | 暂停升级 | |
resume_k8s_deployment_rollout | 恢复升级 | |
get_k8s_deployment_rollout_status | 查询升级状态 | |
get_k8s_deployment_hpa_list | 查询Deployment的HPA列表 | |
list_k8s_deploy_event | 列出Deployment相关的事件 | |
| 动态资源管理(含CRD,8) | get_k8s_resource | 通过集群、命名空间和名称获取Kubernetes资源详情 |
describe_k8s_resource | 通过集群、命名空间和名称获取Kubernetes资源详情 | |
delete_k8s_resource | 通过集群、命名空间和名称删除Kubernetes资源 | |
list_k8s_resource | 按集群和资源类型列出Kubernetes资源 | |
annotate_k8s_resource | 为Kubernetes资源添加或删除注解 | |
label_k8s_resource | 为Kubernetes资源添加或删除标签 | |
patch_k8s_resource | 通过集群、命名空间和名称更新Kubernetes资源 | |
GetDynamicResource | 获取动态资源 | |
| 节点管理(11) | taint_k8s_node | 为节点添加污点 |
untaint_k8s_node | 为节点移除污点 | |
cordon_k8s_node | 设置节点为不可调度状态 | |
uncordon_k8s_node | 设置节点为可调度状态 | |
drain_k8s_node | 清空节点上的Pod并防止新的Pod调度 | |
get_k8s_node_ip_usage | 查询节点IP资源使用情况 | |
list_k8s_node | 获取Node列表 | |
get_k8s_top_node | 获取Node节点CPU和内存资源用量排名列表 | |
get_k8s_pod_count_running_on_node | 查询某个节点上运行的Pod数量统计 | |
get_k8s_node_resource_usage | 查询节点资源使用情况统计 | |
TaintNodeTool | 为节点添加污点 | |
| 事件管理(1) | list_k8s_event | 按集群和命名空间列出Kubernetes事件 |
| Ingress管理(1) | set_default_k8s_ingressclass | 设置IngressClass为默认 |
| Pod 管理(18) | run_command_in_k8s_pod | 在Pod内执行命令 |
list_k8s_pod_event | 列出Pod相关的事件 | |
list_files_in_k8s_pod | 获取Pod中指定路径下的文件列表 | |
list_pod_all_files | 获取Pod中指定路径下的所有文件列表,包含子目录 | |
delete_k8s_pod | 删除Pod | |
delete_pod_file | 删除Pod中的指定文件 | |
get_k8s_pod_linked_env | 获取Pod运行时的环境变量信息 | |
get_pod_linked_env_from_yaml | 通过Pod yaml 定义 获取Pod定义中的环境变量信息 | |
get_k8s_pod_linked_services | 获取与Pod关联的Service | |
get_pod_linked_ingresses | 获取与Pod关联的Ingress | |
get_pod_linked_endpoints | 获取与Pod关联的Endpoints | |
list_k8s_pod | 获取Pod列表 | |
get_k8s_top_pod | 获取Pod CPU 内存 资源用量排名 列表 | |
ListPodFilesTool | 列出Pod文件 | |
ListAllPodFilesTool | 列出Pod所有文件 | |
DeletePodFileTool | 删除Pod文件 | |
UploadPodFileTool | 上传Pod文件 | |
GetPodLogsTool | 获取Pod日志 | |
describe_k8s_pod | 描述Pod容器组 | |
| 存储管理(3) | set_k8s_default_storageclass | 设置StorageClass为默认 |
get_k8s_storageclass_pvc_count | 获取StorageClass下的PVC数量 | |
get_k8s_storageclass_pv_count | 获取StorageClass下的PV数量 | |
| YAML管理(2) | apply_k8s_yaml | 通过YAML创建或更新Kubernetes资源 |
delete_k8s_yaml | 通过YAML删除Kubernetes资源 |
启动命令
mcp.RunMCPServer("kom mcp server", "0.0.1", 3619)AI工具集成
Claude Desktop
- 打开Claude Desktop设置面板
- 在API配置区域添加MCP Server地址
- 启用SSE事件监听功能
- 验证连接状态
{
"mcpServers": {
"k8m": {
"command": "path/to/kom",
"args": []
}
}
}Cursor
- 进入Cursor设置界面
- 找到扩展服务配置选项
- 支持sse、stdio两种方式。sse 方式填写http://localhost:9096/sse,stdio方式填写kom的文件位置。
Windsurf
- 访问配置中心
- 设置API服务器地址
- 支持sse、stdio两种方式。sse 方式填写http://localhost:9096/sse,stdio方式填写kom的文件位置。
cherry studio
- 点击左下角设置
- 点击MCP 服务器
- 点击添加服务器
- 支持sse、stdio两种方式。sse 方式填写http://localhost:9096/sse,stdio方式填写kom的文件位置。
1. 多集群管理
注册多集群
// 注册InCluster集群,名称为InCluster
kom.Clusters().RegisterInCluster()
// 注册两个带名称的集群,分别名为orb和docker-desktop
kom.Clusters().RegisterByPathWithID("/Users/kom/.kube/orb", "orb")
kom.Clusters().RegisterByPathWithID("/Users/kom/.kube/config", "docker-desktop")
// 注册一个名为default的集群,那么kom.DefaultCluster()则会返回该集群。
kom.Clusters().RegisterByPathWithID("/Users/kom/.kube/config", "default")注册AWS EKS集群
// 配置 EKS 集群信息
config := aws.EKSAuthConfig{
AccessKey: "XXX", // AWS Access Key ID
SecretAccessKey: "yyy", // AWS Secret Access Key
Region: "us-east-1", // AWS 区域
ClusterName: "k8m", // EKS 集群名称
}
// 注册 AWS EKS 集群
_, err := kom.Clusters().RegisterAWSCluster(config)
if err != nil {
fmt.Printf("注册 EKS 集群失败: %v", err)
return
}
// 使用注册的 EKS 集群
var pods []corev1.Pod
clusterID := fmt.Sprintf("%s-%s", config.Region, config.ClusterName) // 集群ID格式: {Region}-{ClusterName}
err = kom.Cluster(clusterID).Resource(&corev1.Pod{}).Namespace("kube-system").List(&pods).ErrorAWS EKS 集群注册说明:
AccessKey: AWS 访问密钥 IDSecretAccessKey: AWS 秘密访问密钥Region: AWS 区域,如us-east-1、ap-southeast-1等ClusterName
…