English | 中文 kom 是一个用于 Kubernetes 操作的工具,相当于SDK级的kubectl、client-go的使用封装。 它提供了一系列功能来管理 Kubernetes 资源,包括创建、更新、删除和获取资源。这个项目支持多种 Kubernetes 资源类型的操作,并能够处理自定义资源定义(CRD)。 通过使用 kom,你可以轻松地进行资源的增删改查和日志获取以及操作POD内文件等动作,甚至可以使用SQL语句来查询、管理k8s资源。 1. 简单易用:kom 提供了丰富的功能,包括创建、更新、删除、获取、列表等,包括对内置资源以及CRD资源的操作。 2. 多集群支持:通过RegisterCluster,你可以轻松地管理多个 Kubernetes 集群,支持AWS EKS集群。 3. MCP支持:支持多集群的MCP管理,同时支持stdio、sse两种模式,内置58种工具,支
Add this skill
npx mdskills install weibaohui/komComprehensive Kubernetes SDK/MCP server with multi-cluster support and 59 built-in tools for resource management
1# Kom - Kubernetes Operations Manager23[English](README_en.md) | [中文](README.md)4[](https://github.com/weibaohui/kom/blob/master/LICENSE)5[](https://app.fossa.com/projects/git%2Bgithub.com%2Fweibaohui%2Fkom?ref=badge_shield)678## 简介910`kom` 是一个用于 Kubernetes 操作的工具,相当于SDK级的kubectl、client-go的使用封装。11它提供了一系列功能来管理 Kubernetes 资源,包括创建、更新、删除和获取资源。这个项目支持多种 Kubernetes 资源类型的操作,并能够处理自定义资源定义(CRD)。12通过使用 `kom`,你可以轻松地进行资源的增删改查和日志获取以及操作POD内文件等动作,甚至可以使用SQL语句来查询、管理k8s资源。1314## **特点**151. 简单易用:kom 提供了丰富的功能,包括创建、更新、删除、获取、列表等,包括对内置资源以及CRD资源的操作。162. 多集群支持:通过RegisterCluster,你可以轻松地管理多个 Kubernetes 集群,支持AWS EKS集群。173. MCP支持:支持多集群的MCP管理,同时支持stdio、sse两种模式,内置58种工具,支持SSE模式,支持私有化部署,多人共享。支持超过百种组合操作。184. 支持跨命名空间:通过kom.Namespace("default","kube-system").List(&items) 跨命名空间查询资源。195. 链式调用:kom 提供了链式调用,使得操作资源更加简单和直观。206. 支持自定义资源定义(CRD):kom 支持自定义资源定义(CRD),你可以轻松地定义和操作自定义资源。217. 支持回调机制,轻松拓展业务逻辑,而不必跟k8s操作强耦合。228. 支持POD内文件操作,轻松上传、下载、删除文件。239. 支持高频操作封装,如deployment的restart重启、scale扩缩容、启停等20余项操作功能。2410. 支持SQL查询k8s资源。select * from pod where metadata.namespace='kube-system' or metadata.namespace='default' order by metadata.creationTimestamp desc2511. 支持查询缓存,在高频、批量查询场景下,可设置缓存过期时间,提升查询性能。列表过滤条件不受缓存影响。2612. 支持Prometheus查询,支持通过集群内的Prometheus服务或外部Prometheus地址进行监控数据查询,支持瞬时查询和区间查询,提供多种结果解析方式。27282930## 示例程序31**k8m** 是一个轻量级的 Kubernetes 管理工具,它基于kom、amis实现,单文件,支持多平台架构。321. **下载**:从 [https://github.com/weibaohui/k8m](https://github.com/weibaohui/k8m) 下载最新版本。332. **运行**:使用 `./k8m` 命令启动,访问[http://127.0.0.1:3618](http://127.0.0.1:3618)。3435363738## 安装3940```bash41import (42 "github.com/weibaohui/kom"43 "github.com/weibaohui/kom/callbacks"44)45func main() {46 // 注册回调,务必先注册47 callbacks.RegisterInit()48 // 注册集群49 defaultKubeConfig := os.Getenv("KUBECONFIG")50 if defaultKubeConfig == "" {51 defaultKubeConfig = filepath.Join(homedir.HomeDir(), ".kube", "config")52 }53 _, _ = kom.Clusters().RegisterInCluster()54 _, _ = kom.Clusters().RegisterByPathWithID(defaultKubeConfig, "default")55 kom.Clusters().Show()56 // 其他逻辑57}58```5960## 使用示例6162### 0. 多集群 k8s MCP 支持63同时支持stdio、sse两种模式64支持多个tools 支持。包括对任意资源的查询列表删除描述操作,以及POD日志读取操作。65#### 1.集成到代码中66```go67// 一行代码启动MCP Server68mcp.RunMCPServer("kom mcp server", "0.0.1", 9096)69707172```73#### 2. 编译74```shell75# 源码启动76go build main.go77//编译为kom78```79#### 3. 启动80启动后支持两种模式,一种为stdio,一种sse。81管理k8s默认使用KUBECONFIG env环境变量。82```shell83# 设置KUBECONFIG环境变量84export KUBECONFIG = /Users/xxx/.kube/config85```86```shell87# 运行88./kom89# MCP Server 访问地址90http://IP:9096/sse91```92此时,编译得到的二进制文件,可当做stdio 模式使用。93http://IP:9096/sse 模式,可以当做sse 模式使用。949596#### 4. 集成到MCP工具中97支持stdio\sse 两种方式集成。98适合MCP工具集成,如Cursor、Claude Desktop(仅支持stdio模式)、Windsurf等,此外也可以使用这些软件的UI操作界面进行添加。99```json100{101 "mcpServers": {102 "kom": {103 "type": "sse",104 "url": "http://IP:9096/sse"105 }106 }107}108```109```json110{111 "mcpServers": {112 "k8m": {113 "command": "path/to/kom",114 "args": []115 }116 }117}118```119120#### MCP工具列表(59种)121122| 类别 | 方法 | 描述 |123| -------------------------- | ------------------------------------ | ----------------------------------------------------- |124| **集群管理(1)** | `list_k8s_clusters` | 列出所有已注册的Kubernetes集群 |125| **DaemonSet管理(1)** | `restart_k8s_daemonset` | 通过集群、命名空间和名称,重启DaemonSet |126| **部署管理(12)** | `scale_k8s_deployment` | 通过集群、命名空间、名称 扩缩容Deployment,设置副本数 |127| | `restart_k8s_deployment` | 通过集群、命名空间和名称,重启Deployment |128| | `stop_k8s_deployment` | 停止Deployment |129| | `restore_k8s_deployment` | 恢复Deployment副本数 |130| | `update_k8s_deployment_image_tag` | 更新Deployment中容器的镜像Tag |131| | `get_k8s_deployment_rollout_history` | 查询升级历史 |132| | `undo_k8s_deployment_rollout` | 回滚 |133| | `pause_k8s_deployment_rollout` | 暂停升级 |134| | `resume_k8s_deployment_rollout` | 恢复升级 |135| | `get_k8s_deployment_rollout_status` | 查询升级状态 |136| | `get_k8s_deployment_hpa_list` | 查询Deployment的HPA列表 |137| | `list_k8s_deploy_event` | 列出Deployment相关的事件 |138| **动态资源管理(含CRD,8)** | `get_k8s_resource` | 通过集群、命名空间和名称获取Kubernetes资源详情 |139| | `describe_k8s_resource` | 通过集群、命名空间和名称获取Kubernetes资源详情 |140| | `delete_k8s_resource` | 通过集群、命名空间和名称删除Kubernetes资源 |141| | `list_k8s_resource` | 按集群和资源类型列出Kubernetes资源 |142| | `annotate_k8s_resource` | 为Kubernetes资源添加或删除注解 |143| | `label_k8s_resource` | 为Kubernetes资源添加或删除标签 |144| | `patch_k8s_resource` | 通过集群、命名空间和名称更新Kubernetes资源 |145| | `GetDynamicResource` | 获取动态资源 |146| **节点管理(11)** | `taint_k8s_node` | 为节点添加污点 |147| | `untaint_k8s_node` | 为节点移除污点 |148| | `cordon_k8s_node` | 设置节点为不可调度状态 |149| | `uncordon_k8s_node` | 设置节点为可调度状态 |150| | `drain_k8s_node` | 清空节点上的Pod并防止新的Pod调度 |151| | `get_k8s_node_ip_usage` | 查询节点IP资源使用情况 |152| | `list_k8s_node` | 获取Node列表 |153| | `get_k8s_top_node` | 获取Node节点CPU和内存资源用量排名列表 |154| | `get_k8s_pod_count_running_on_node` | 查询某个节点上运行的Pod数量统计 |155| | `get_k8s_node_resource_usage` | 查询节点资源使用情况统计 |156| | `TaintNodeTool` | 为节点添加污点 |157| **事件管理(1)** | `list_k8s_event` | 按集群和命名空间列出Kubernetes事件 |158| **Ingress管理(1)** | `set_default_k8s_ingressclass` | 设置IngressClass为默认 |159| **Pod 管理(18)** | `run_command_in_k8s_pod` | 在Pod内执行命令 |160| | `list_k8s_pod_event` | 列出Pod相关的事件 |161| | `list_files_in_k8s_pod` | 获取Pod中指定路径下的文件列表 |162| | `list_pod_all_files` | 获取Pod中指定路径下的所有文件列表,包含子目录 |163| | `delete_k8s_pod` | 删除Pod |164| | `delete_pod_file` | 删除Pod中的指定文件 |165| | `get_k8s_pod_linked_env` | 获取Pod运行时的环境变量信息 |166| | `get_pod_linked_env_from_yaml` | 通过Pod yaml 定义 获取Pod定义中的环境变量信息 |167| | `get_k8s_pod_linked_services` | 获取与Pod关联的Service |168| | `get_pod_linked_ingresses` | 获取与Pod关联的Ingress |169| | `get_pod_linked_endpoints` | 获取与Pod关联的Endpoints |170| | `list_k8s_pod` | 获取Pod列表 |171| | `get_k8s_top_pod` | 获取Pod CPU 内存 资源用量排名 列表 |172| | `ListPodFilesTool` | 列出Pod文件 |173| | `ListAllPodFilesTool` | 列出Pod所有文件 |174| | `DeletePodFileTool` | 删除Pod文件 |175| | `UploadPodFileTool` | 上传Pod文件 |176| | `GetPodLogsTool` | 获取Pod日志 |177| | `describe_k8s_pod` | 描述Pod容器组 |178| **存储管理(3)** | `set_k8s_default_storageclass` | 设置StorageClass为默认 |179| | `get_k8s_storageclass_pvc_count` | 获取StorageClass下的PVC数量 |180| | `get_k8s_storageclass_pv_count` | 获取StorageClass下的PV数量 |181| **YAML管理(2)** | `apply_k8s_yaml` | 通过YAML创建或更新Kubernetes资源 |182| | `delete_k8s_yaml` | 通过YAML删除Kubernetes资源 |183184#### 启动命令185```go186mcp.RunMCPServer("kom mcp server", "0.0.1", 3619)187```188189#### AI工具集成190191##### Claude Desktop1921. 打开Claude Desktop设置面板1932. 在API配置区域添加MCP Server地址1943. 启用SSE事件监听功能1954. 验证连接状态196```json197{198 "mcpServers": {199 "k8m": {200 "command": "path/to/kom",201 "args": []202 }203 }204}205```206207##### Cursor2081. 进入Cursor设置界面2092. 找到扩展服务配置选项2103. 支持sse、stdio两种方式。sse 方式填写http://localhost:9096/sse,stdio方式填写kom的文件位置。211212##### Windsurf2131. 访问配置中心2142. 设置API服务器地址2153. 支持sse、stdio两种方式。sse 方式填写http://localhost:9096/sse,stdio方式填写kom的文件位置。216217#### cherry studio2181. 点击左下角设置2192. 点击MCP 服务器2203. 点击添加服务器2214. 支持sse、stdio两种方式。sse 方式填写http://localhost:9096/sse,stdio方式填写kom的文件位置。222223224### 1. 多集群管理225#### 注册多集群226```go227// 注册InCluster集群,名称为InCluster228kom.Clusters().RegisterInCluster()229// 注册两个带名称的集群,分别名为orb和docker-desktop230kom.Clusters().RegisterByPathWithID("/Users/kom/.kube/orb", "orb")231kom.Clusters().RegisterByPathWithID("/Users/kom/.kube/config", "docker-desktop")232// 注册一个名为default的集群,那么kom.DefaultCluster()则会返回该集群。233kom.Clusters().RegisterByPathWithID("/Users/kom/.kube/config", "default")234```235#### 注册AWS EKS集群236```go237// 配置 EKS 集群信息238config := aws.EKSAuthConfig{239 AccessKey: "XXX", // AWS Access Key ID240 SecretAccessKey: "yyy", // AWS Secret Access Key241 Region: "us-east-1", // AWS 区域242 ClusterName: "k8m", // EKS 集群名称243}244245// 注册 AWS EKS 集群246_, err := kom.Clusters().RegisterAWSCluster(config)247if err != nil {248 fmt.Printf("注册 EKS 集群失败: %v", err)249 return250}251252// 使用注册的 EKS 集群253var pods []corev1.Pod254clusterID := fmt.Sprintf("%s-%s", config.Region, config.ClusterName) // 集群ID格式: {Region}-{ClusterName}255err = kom.Cluster(clusterID).Resource(&corev1.Pod{}).Namespace("kube-system").List(&pods).Error256```257258**AWS EKS 集群注册说明:**259- `AccessKey`: AWS 访问密钥 ID260- `SecretAccessKey`: AWS 秘密访问密钥261- `Region`: AWS 区域,如 `us-east-1`、`ap-southeast-1` 等262- `ClusterName`: EKS 集群名称263- `RoleARN`: (可选) 要承担的 IAM 角色 ARN,用于跨账户访问264- 集群注册后会自动生成 ID,格式为 `{Region}-{ClusterName}`265- 支持 IAM 角色承担机制实现跨账户集群访问266- AWS 凭证信息仅在内存中使用,程序重启后自动清理267#### 显示已注册集群268```go269kom.Clusters().Show()270```271#### 选择默认集群272```go273// 使用默认集群,查询集群内kube-system命名空间下的pod274// 首先尝试返回 ID 为 "InCluster" 的实例,如果不存在,275// 则尝试返回 ID 为 "default" 的实例。276// 如果上述两个名称的实例都不存在,则返回 clusters 列表中的任意一个实例。277var pods []corev1.Pod278err = kom.DefaultCluster().Resource(&corev1.Pod{}).Namespace("kube-system").List(&pods).Error279```280#### 选择指定集群281```go282// 选择orb集群,查询集群内kube-system命名空间下的pod283var pods []corev1.Pod284err = kom.Cluster("orb").Resource(&corev1.Pod{}).Namespace("kube-system").List(&pods).Error285```286287### 2. 内置资源对象的增删改查以及Watch示例288定义一个 Deployment 对象,并通过 kom 进行资源操作。289```go290var item v1.Deployment291var items []v1.Deployment292```293#### 创建某个资源294```go295item = v1.Deployment{296 ObjectMeta: metav1.ObjectMeta{297 Name: "nginx",298 Namespace: "default",299 },300 Spec: v1.DeploymentSpec{301 Template: corev1.PodTemplateSpec{302 Spec: corev1.PodSpec{303 Containers: []corev1.Container{304 {Name: "test", Image: "nginx:1.14.2"},305 },306 },307 },308 },309 }310err := kom.DefaultCluster().Resource(&item).Create(&item).Error311```312#### Get查询某个资源313```go314// 查询 default 命名空间下名为 nginx 的 Deployment315err := kom.DefaultCluster().Resource(&item).Namespace("default").Name("nginx").Get(&item).Error316// 查询 default 命名空间下名为 nginx 的 Deployment,并使用缓存 5 秒317// 5秒内,不会再次查询,批量操作、高频操作下,建议启用缓存318err := kom.DefaultCluster().Resource(&item).Namespace("default").Name("nginx").WithCache(5 * time.Second).Get(&item).Error319```320#### List查询资源列表321```go322// 查询 default 命名空间下的 Deployment 列表323err := kom.DefaultCluster().Resource(&item).Namespace("default").List(&items).Error324// 查询 default、kube-system 命名空间下的 Deployment 列表325err := kom.DefaultCluster().Resource(&item).Namespace("default","kube-system").List(&items).Error326// 查询 所有 命名空间下的 Deployment 列表327err := kom.DefaultCluster().Resource(&item).Namespace("*").List(&items).Error328err := kom.DefaultCluster().Resource(&item).AllNamespace().List(&items).Error329// 设置5秒缓存,对列表生效330err := kom.DefaultCluster().Resource(&item).WithCache(5 * time.Second).List(&nodeList).Error331```332#### 通过Label查询资源列表333```go334// 查询 default 命名空间下 标签为 app:nginx 的 Deployment 列表335err := kom.DefaultCluster().Resource(&item).Namespace("default").WithLabelSelector("app=nginx").List(&items).Error336```337#### 通过多个Label查询资源列表338```go339// 查询 default 命名空间下 标签为 app:nginx m:n 的 Deployment 列表340err := kom.DefaultCluster().Resource(&item).Namespace("default").WithLabelSelector("app=nginx").WithLabelSelector("m=n").List(&items).Error341```342#### 通过Field查询资源列表343```go344// 查询 default 命名空间下 标签为 metadata.name=test-deploy 的 Deployment 列表345// filedSelector 一般支持原生的字段定义。如metadata.name,metadata.namespace,metadata.labels,metadata.annotations,metadata.creationTimestamp,spec.nodeName,spec.serviceAccountName,spec.schedulerName,status.phase,status.hostIP,status.podIP,status.qosClass,spec.containers.name等字段346err := kom.DefaultCluster().Resource(&item).Namespace("default").WithFieldSelector("metadata.name=test-deploy").List(&items).Error347```348#### 分页查询资源349```go350var list []corev1.Pod351var total int64352sql := "select * from pod where metadata.namespace=? or metadata.namespace=? order by metadata.creationTimestamp desc "353err := kom.DefaultCluster().Sql(sql, "kube-system", "default").354 FillTotalCount(&total).355 Limit(5).356 Offset(10).357 List(&list).Error358fmt.Printf("total %d\n", total) //返回总数 480359fmt.Printf("Count %d\n", len(list)) //返回条目数=limit=5360```361#### 更新资源内容362```go363// 更新名为nginx 的 Deployment,增加一个注解364err := kom.DefaultCluster().Resource(&item).Namespace("default").Name("nginx").Get(&item).Error365if item.Spec.Template.Annotations == nil {366 item.Spec.Template.Annotations = map[string]string{}367}368item.Spec.Template.Annotations["kom.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)369err = kom.DefaultCluster().Resource(&item).Update(&item).Error370```371#### PATCH 更新资源372```go373// 使用 Patch 更新资源,为名为 nginx 的 Deployment 增加一个标签,并设置副本数为5374patchData := `{375 "spec": {376 "replicas": 5377 },378 "metadata": {379 "labels": {380 "new-label": "new-value"381 }382 }383}`384err := kom.DefaultCluster().Resource(&item).Patch(&item, types.StrategicMergePatchType, patchData).Error385```386#### 删除资源387```go388// 删除名为 nginx 的 Deployment389err := kom.DefaultCluster().Resource(&item).Namespace("default").Name("nginx").Delete().Error390```391#### 强制删除资源392```go393// 删除名为 nginx 的 Deployment394err := kom.DefaultCluster().Resource(&item).Namespace("default").Name("nginx").ForceDelete().Error395```396#### 通用类型资源的获取(适用于k8s内置类型以及CRD)397```go398// 指定GVK获取资源399var list []corev1.Event400err := kom.DefaultCluster().GVK("events.k8s.io", "v1", "Event").Namespace("default").List(&list).Error401```402#### Watch资源变更403```go404// watch default 命名空间下 Pod资源 的变更405var watcher watch.Interface406var pod corev1.Pod407err := kom.DefaultCluster().Resource(&pod).Namespace("default").Watch(&watcher).Error408if err != nil {409 fmt.Printf("Create Watcher Error %v", err)410 return err411}412go func() {413 defer watcher.Stop()414415 for event := range watcher.ResultChan() {416 err := kom.DefaultCluster().Tools().ConvertRuntimeObjectToTypedObject(event.Object, &pod)417 if err != nil {418 fmt.Printf("无法将对象转换为 *v1.Pod 类型: %v", err)419 return420 }421 // 处理事件422 switch event.Type {423 case watch.Added:424 fmt.Printf("Added Pod [ %s/%s ]\n", pod.Namespace, pod.Name)425 case watch.Modified:426 fmt.Printf("Modified Pod [ %s/%s ]\n", pod.Namespace, pod.Name)427 case watch.Deleted:428 fmt.Printf("Deleted Pod [ %s/%s ]\n", pod.Namespace, pod.Name)429 }430 }431}()432```433#### Describe查询某个资源434```go435// Describe default 命名空间下名为 nginx 的 Deployment436var describeResult []byte437err := kom.DefaultCluster().Resource(&item).Namespace("default").Name("nginx").Describe(&item).Error438fmt.Printf("describeResult: %s", describeResult)439```440441### 3. YAML 创建、更新、删除442```go443yaml := `apiVersion: v1444kind: ConfigMap445metadata:446 name: example-config447 namespace: default448data:449 key: value450---451apiVersion: apps/v1452kind: Deployment453metadata:454 name: example-deployment455 namespace: default456spec:457 replicas: 1458 selector:459 matchLabels:460 app: example461 template:462 metadata:463 labels:464 app: example465 spec:466 containers:467 - name: example-container468 image: nginx469`470// 第一次执行Apply为创建,返回每一条资源的执行结果471results := kom.DefaultCluster().Applier().Apply(yaml)472// 第二次执行Apply为更新,返回每一条资源的执行结果473results = kom.DefaultCluster().Applier().Apply(yaml)474// 删除,返回每一条资源的执行结果475results = kom.DefaultCluster().Applier().Delete(yaml)476```477478### 4. Pod 操作479#### 获取日志480```go481// 获取Pod日志482var stream io.ReadCloser483err := kom.DefaultCluster().Namespace("default").Name("random-char-pod").Ctl().Pod().ContainerName("container").GetLogs(&stream, &corev1.PodLogOptions{}).Error484reader := bufio.NewReader(stream)485line, _ := reader.ReadString('\n')486fmt.Println(line)487```488#### 执行命令489在Pod内执行命令,需要指定容器名称,并且会触发Exec()类型的callbacks。490```go491// 在Pod内执行ps -ef命令492var execResult string493err := kom.DefaultCluster().Namespace("default").Name("random-char-pod").Ctl().Pod().ContainerName("container").Command("ps", "-ef").ExecuteCommand(&execResult).Error494fmt.Printf("execResult: %s", execResult)495```496#### 端口转发497```go498err := kom.DefaultCluster().Resource(&v1.Pod{}).499 Namespace("default").500 Name("nginx-deployment-f576985cc-7czqr").501 Ctl().Pod().502 ContainerName("nginx").503 PortForward("20088", "80", stopCh).Error504// 监听0.0.0.0上的20088端口,转发到Pod的80端口505```506#### 流式执行命令507在Pod内执行命令,并且会触发StreamExec()类型的callbacks。适合执行ping 等命令508```go509cb := func(data []byte) error {510 fmt.Printf("Data %s\n", string(data))511 return nil512 }513err := kom.DefaultCluster().Namespace("kube-system").Name("traefik-d7c9c5778-p9nf4").Ctl().Pod().ContainerName("traefik").Command("ping", "127.0.0.1").StreamExecute(cb, cb).Error514//输出:515//Data PING 127.0.0.1 (127.0.0.1): 56 data bytes516//Data 64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.023 ms517//Data 64 bytes from 127.0.0.1: seq=1 ttl=42 time=0.011 ms518//Data 64 bytes from 127.0.0.1: seq=2 ttl=42 time=0.012 ms519//Data 64 bytes from 127.0.0.1: seq=3 ttl=42 time=0.016 ms520```521522#### 文件列表523```go524// 获取Pod内/etc文件夹列表525kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().ContainerName("nginx").ListFiles("/etc")526```527#### 所有文件列表,包括隐藏文件528```go529// 获取Pod内/etc文件夹列表530kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().ContainerName("nginx").ListAllFiles("/etc")531```532#### 文件下载533```go534// 下载Pod内/etc/hosts文件535kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().ContainerName("nginx").DownloadFile("/etc/hosts")536```537#### 文件下载(Tar压缩)538```go539// 下载Pod内/etc/hosts文件,以tar方式进行打包后,获取,下载540kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().ContainerName("nginx").DownloadTarFile("/etc/hosts")541```542#### 文件上传543```go544// 上传文件内容到Pod内/etc/demo.txt文件545kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().ContainerName("nginx").SaveFile("/etc/demo.txt", "txt-context")546// os.File 类型文件直接上传到Pod内/etc/目录下547file, _ := os.Open(tempFilePath)548kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().ContainerName("nginx").UploadFile("/etc/", file)549```550#### 文件删除551```go552// 删除Pod内/etc/xyz文件553kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().ContainerName("nginx").DeleteFile("/etc/xyz")554```555#### 获取关联资源-Service556```go557// 获取Pod关联的Service558svcs, err := kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().LinkedService()559for _, svc := range svcs {560 fmt.Printf("service name %v\n", svc.Name)561}562```563#### 获取关联资源-Ingress564```go565// 获取Pod关联的Ingress566ingresses, err := kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().LinkedIngress()567for _, ingress := range ingresses {568 fmt.Printf("ingress name %v\n", ingress.Name)569}570```571#### 获取关联资源-PVC572```go573// 获取Pod关联的PVC574pvcs, err := kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().LinkedPVC()575for _, pvc := range pvcs {576 fmt.Printf("pvc name %v\n", pvc.Name)577}578```579#### 获取关联资源-PV580```go581// 获取Pod关联的PVC582pvs, err := kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().LinkedPV()583for _, pv := range pvs {584 fmt.Printf("pv name %v\n", pv.Name)585}586```587#### 获取关联资源-Endpoints588```go589// 获取Pod关联的Endpoints590endpoints, err := kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().LinkedEndpoints()591for _, endpoint := range endpoints {592 fmt.Printf("endpoint name %v\n", endpoint.Name)593}594```595#### 获取关联资源-运行时Env596从Pod内执行env命令获得ENV配置信息597```go598envs, err := kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().LinkedEnv()599for _, env := range envs {600 fmt.Printf("env %s %s=%s\n", env.ContainerName, env.EnvName, env.EnvValue)601 }602```603#### 获取关联资源-定义Env604从pod定义上提取ENV配置信息605```go606envs, err := kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().LinkedEnvFromPod()607for _, env := range envs {608 fmt.Printf("env %s %s=%s\n", env.ContainerName, env.EnvName, env.EnvValue)609 }610```611#### 获取关联资源-节点612根据Pod 定义中声明的NodeSelector、NodeAffinity、污点容忍度、NodeName等配置信息,返回可用节点列表。暂未考虑Pod亲和性、CPU内存等运行时调度因素。613```go614nodes, err := kom.DefaultCluster().Namespace("default").Name("nginx").Ctl().Pod().LinkedNode()615for _, node := range nodes {616 fmt.Printf("reason:%s\t node name %s\n", node.Reason, node.Name)617}618```619620### 5. 自定义资源定义(CRD)增删改查及Watch操作621在没有CR定义的情况下,如何进行增删改查操作。操作方式同k8s内置资源。622将对象定义为unstructured.Unstructured,并且需要指定Group、Version、Kind。623因此可以通过kom.DefaultCluster().GVK(group, version, kind)来替代kom.DefaultCluster().Resource(interface{})624为方便记忆及使用,kom提供了kom.DefaultCluster().CRD(group, version, kind)来简化操作。625下面给出操作CRD的示例:626首先定义一个通用的处理对象,用来接收CRD的返回结果。627```go628var item unstructured.Unstructured629```630#### 创建CRD631```go632yaml := `apiVersion: apiextensions.k8s.io/v1633kind: CustomResourceDefinition634metadata:635 name: crontabs.stable.example.com636spec:637 group: stable.example.com638 versions:639 - name: v1640 served: true641 storage: true642 schema:643 openAPIV3Schema:644 type: object645 properties:646 spec:647 type: object648 properties:649 cronSpec:650 type: string651 image:652 type: string653 replicas:654 type: integer655 scope: Namespaced656 names:657 plural: crontabs658 singular: crontab659 kind: CronTab660 shortNames:661 - ct`662result := kom.DefaultCluster().Applier().Apply(yaml)663```664#### 创建CRD的CR对象665```go666item = unstructured.Unstructured{667 Object: map[string]interface{}{668 "apiVersion": "stable.example.com/v1",669 "kind": "CronTab",670 "metadata": map[string]interface{}{671 "name": "test-crontab",672 "namespace": "default",673 },674 "spec": map[string]interface{}{675 "cronSpec": "* * * * */8",676 "image": "test-crontab-image",677 },678 },679 }680err := kom.DefaultCluster().CRD("stable.example.com", "v1", "CronTab").Namespace(item.GetNamespace()).Name(item.GetName()).Create(&item).Error681```682#### Get获取单个CR对象683```go684err := kom.DefaultCluster().CRD("stable.example.com", "v1", "CronTab").Name(item.GetName()).Namespace(item.GetNamespace()).Get(&item).Error685```686#### List获取CR对象的列表687```go688var crontabList []unstructured.Unstructured689// 查询default命名空间下的CronTab690err := kom.DefaultCluster().CRD("stable.example.com", "v1", "CronTab").Namespace(crontab.GetNamespace()).List(&crontabList).Error691// 查询所有命名空间下的CronTab692err := kom.DefaultCluster().CRD("stable.example.com", "v1", "CronTab").AllNamespace().List(&crontabList).Error693err := kom.DefaultCluster().CRD("stable.example.com", "v1", "CronTab").Namespace("*").List(&crontabList).Error694```695#### 更新CR对象696```go697patchData := `{698 "spec": {699 "image": "patch-image"700 },701 "metadata": {702 "labels": {703 "new-label": "new-value"704 }705 }706}`707err := kom.DefaultCluster().CRD("stable.example.com", "v1", "CronTab").Name(crontab.GetName()).Namespace(crontab.GetNamespace()).Patch(&crontab, types.StrategicMergePatchType, patchData).Error708```709#### 删除CR对象710```go711err := kom.DefaultCluster().CRD("stable.example.com", "v1", "CronTab").Name(crontab.GetName()).Namespace(crontab.GetNamespace()).Delete().Error712```713#### 强制删除CR对象714```go715err := kom.DefaultCluster().CRD("stable.example.com", "v1", "CronTab").Name(crontab.GetName()).Namespace(crontab.GetNamespace()).ForceDelete().Error716```717#### Watch CR对象718```go719var watcher watch.Interface720721err := kom.DefaultCluster().CRD("stable.example.com", "v1", "CronTab").Namespace("default").Watch(&watcher).Error722if err != nil {723 fmt.Printf("Create Watcher Error %v", err)724}725go func() {726 defer watcher.Stop()727728 for event := range watcher.ResultChan() {729 var item *unstructured.Unstructured730731 item, err := kom.DefaultCluster().Tools().ConvertRuntimeObjectToUnstructuredObject(event.Object)732 if err != nil {733 fmt.Printf("无法将对象转换为 Unstructured 类型: %v", err)734 return735 }736 // 处理事件737 switch event.Type {738 case watch.Added:739 fmt.Printf("Added Unstructured [ %s/%s ]\n", item.GetNamespace(), item.GetName())740 case watch.Modified:741 fmt.Printf("Modified Unstructured [ %s/%s ]\n", item.GetNamespace(), item.GetName())742 case watch.Deleted:743 fmt.Printf("Deleted Unstructured [ %s/%s ]\n", item.GetNamespace(), item.GetName())744 }745 }746}()747```748#### Describe查询某个CRD资源749```go750// Describe default 命名空间下名为 nginx 的 Deployment751var describeResult []byte752err := kom.DefaultCluster().CRD("stable.example.com", "v1", "CronTab").Namespace("default").Name(item.GetName()).Describe(&item).Error753fmt.Printf("describeResult: %s", describeResult)754```755#### 获取CRD下的Pod资源756```go757pods, err := kom.DefaultCluster().CRD("apps.kruise.io", "v1beta1", "StatefulSet").758Namespace("default").Name("sample").Ctl().CRD().ManagedPods()759 for _, pod := range pods {760 fmt.Printf("Get pods: %v", pod.GetName())761 }762```763764### 6. 集群参数信息765```go766// 集群文档767kom.DefaultCluster().Status().Docs()768// 集群资源信息769kom.DefaultCluster().Status().APIResources()770// 集群已注册CRD列表771kom.DefaultCluster().Status().CRDList()772// 集群版本信息773kom.DefaultCluster().Status().ServerVersion()774// 获取集群内各资源种类数量775kom.DefaultCluster().Status().GetResourceCountSummary(10)776```777778### 7. callback机制779* 内置了callback机制,可以自定义回调函数,当执行完某项操作后,会调用对应的回调函数。780* 如果回调函数返回true,则继续执行后续操作,否则终止后续操作。781* 当前支持的callback有:get,list,create,update,patch,delete,exec,stream-exec,logs,watch,doc.782* 内置的callback名称有:"kom:get","kom:list","kom:create","kom:update","kom:patch","kom:watch","kom:delete","kom:pod:exec","kom:pod:stream:exec","kom:pod:logs","kom:pod:port:forward","kom:doc"783* 支持回调函数排序,默认按注册顺序执行,可以通过kom.DefaultCluster().Callback().After("kom:get")或者.Before("kom:get")设置顺序。784* 支持删除回调函数,通过kom.DefaultCluster().Callback().Delete("kom:get")785* 支持替换回调函数,通过kom.DefaultCluster().Callback().Replace("kom:get",cb)786```go787// 为Get获取资源注册回调函数788kom.DefaultCluster().Callback().Get().Register("get", cb)789// 为List获取资源注册回调函数790kom.DefaultCluster().Callback().List().Register("list", cb)791// 为Create创建资源注册回调函数792kom.DefaultCluster().Callback().Create().Register("create", cb)793// 为Update更新资源注册回调函数794kom.DefaultCluster().Callback().Update().Register("update", cb)795// 为Patch更新资源注册回调函数796kom.DefaultCluster().Callback().Patch().Register("patch", cb)797// 为Delete删除资源注册回调函数798kom.DefaultCluster().Callback().Delete().Register("delete", cb)799// 为Watch资源注册回调函数800kom.DefaultCluster().Callback().Watch().Register("watch",cb)801// 为Exec Pod内执行命令注册回调函数802kom.DefaultCluster().Callback().Exec().Register("exec", cb)803// 为Logs获取日志注册回调函数804kom.DefaultCluster().Callback().Logs().Register("logs", cb)805// 删除回调函数806kom.DefaultCluster().Callback().Get().Delete("get")807// 替换回调函数808kom.DefaultCluster().Callback().Get().Replace("get", cb)809// 指定回调函数执行顺序,在内置的回调函数执行完之后再执行810kom.DefaultCluster().Callback().After("kom:get").Register("get", cb)811// 指定回调函数执行顺序,在内置的回调函数执行之前先执行812// 案例1.在Create创建资源前,进行权限检查,没有权限则返回error,后续创建动作将不再执行813// 案例2.在List获取资源列表后,进行特定的资源筛选,从列表(Statement.Dest)中删除不符合要求的资源,然后返回给用户814kom.DefaultCluster().Callback().Before("kom:create").Register("create", cb)815816// 自定义回调函数817func cb(k *kom.Kubectl) error {818 stmt := k.Statement819 gvr := stmt.GVR820 ns := stmt.Namespace821 name := stmt.Name822 // 打印信息823 fmt.Printf("Get %s/%s(%s)\n", ns, name, gvr)824 fmt.Printf("Command %s/%s(%s %s)\n", ns, name, stmt.Command, stmt.Args)825 return nil826 // return fmt.Errorf("error") 返回error将阻止后续cb的执行827}828```829830### 8. SQL查询k8s资源831* 通过SQL()方法查询k8s资源,简单高效。832* Table 名称支持集群内注册的所有资源的全称及简写,包括CRD资源。只要是注册到集群上了,就可以查。833* 典型的Table 名称有:pod,deployment,service,ingress,pvc,pv,node,namespace,secret,configmap,serviceaccount,role,rolebinding,clusterrole,clusterrolebinding,crd,cr,hpa,daemonset,statefulset,job,cronjob,limitrange,horizontalpodautoscaler,poddisruptionbudget,networkpolicy,endpoints,ingressclass,mutatingwebhookconfiguration,validatingwebhookconfiguration,customresourcedefinition,storageclass,persistentvolumeclaim,persistentvolume,horizontalpodautoscaler,podsecurity。统统都可以查。834* 查询字段目前仅支持*。也就是select *835* 查询条件目前支持 =,!=,>=,<=,<>,like,in,not in,and,or,between836* 排序字段目前支持对单一字段进行排序。默认按创建时间倒序排列837*838#### 查询k8s内置资源839```go840 sql := "select * from deploy where metadata.namespace='kube-system' or metadata.namespace='default' order by metadata.creationTimestamp asc "841842 var list []v1.Deployment843 err := kom.DefaultCluster().Sql(sql).List(&list).Error844 for _, d := range list {845 fmt.Printf("List Items foreach %s,%s at %s \n", d.GetNamespace(), d.GetName(), d.GetCreationTimestamp())846 }847```848#### 查询CRD资源849```go850 // vm 为kubevirt 的CRD851 sql := "select * from vm where (metadata.namespace='kube-system' or metadata.namespace='default' ) "852 var list []unstructured.Unstructured853 err := kom.DefaultCluster().Sql(sql).List(&list).Error854 for _, d := range list {855 fmt.Printf("List Items foreach %s,%s\n", d.GetNamespace(), d.GetName())856 }857```858#### 链式调研查询SQL859```go860// 查询pod 列表861err := kom.DefaultCluster().From("pod").862 Where("metadata.namespace = ? or metadata.namespace= ? ", "kube-system", "default").863 Order("metadata.creationTimestamp desc").864 List(&list).Error865```866#### k8s资源嵌套列表属性支持867```go868// spec.containers为列表,其下的ports也为列表,我们查询ports的name869sql := "select * from pod where spec.containers.ports.name like '%k8m%' "870var list []v1.Pod871err := kom.DefaultCluster().Sql(sql).List(&list).Error872for _, d := range list {873 t.Logf("List Items foreach %s,%s\n", d.GetNamespace(), d.GetName())874}875```876877### 9. 其他操作878#### Deployment重启879```go880err = kom.DefaultCluster().Resource(&Deployment{}).Namespace("default").Name("nginx").Ctl().Rollout().Restart()881```882#### Deployment扩缩容883```go884// 将名称为nginx的deployment的副本数设置为3885err = kom.DefaultCluster().Resource(&Deployment{}).Namespace("default").Name("nginx").Ctl().Scaler().Scale(3)886```887#### Deployment 停止888```go889// 将名称为nginx的deployment的副本数设置为0890// 当前运行副本数量记录到注解中891err = kom.DefaultCluster().Resource(&Deployment{}).Namespace("default").Name("nginx").Ctl().Scaler().Stop()892```893#### Deployment 恢复894```go895// 将名称为nginx的deployment的副本数从注解中恢复,如果没有注解,默认恢复到1896err = kom.DefaultCluster().Resource(&Deployment{}).Namespace("default").Name("nginx").Ctl().Scaler().Restore()897```898#### Deployment更新Tag899```go900// 将名称为nginx的deployment的中的容器镜像tag升级为alpine901err = kom.DefaultCluster().Resource(&Deployment{}).Namespace("default").Name("nginx").Ctl().Deployment().ReplaceImageTag("main","20241124")902```903#### Deployment Rollout History904```go905// 查询名称为nginx的deployment的升级历史906result, err := kom.DefaultCluster().Resource(&Deployment{}).Namespace("default").Name("nginx").Ctl().Rollout().History()907```908#### Deployment Rollout Undo909```go910// 将名称为nginx的deployment进行回滚911result, err := kom.DefaultCluster().Resource(&Deployment{}).Namespace("default").Name("nginx").Ctl().Rollout().Undo()912// 将名称为nginx的deployment进行回滚到指定版本(history 查询)913result, err := kom.DefaultCluster().Resource(&Deployment{}).Namespace("default").Name("nginx").Ctl().Rollout().Undo("6")914```915#### Deployment Rollout Pause916```go917// 暂停升级过程918err := kom.DefaultCluster().Resource(&Deployment{}).Namespace("default").Name("nginx").Ctl().Rollout().Pause()919```920#### Deployment Rollout Resume921```go922// 恢复升级过程923err := kom.DefaultCluster().Resource(&Deployment{}).Namespace("default").Name("nginx").Ctl().Rollout().Resume()924```925#### Deployment Rollout Status926```go927// 将名称为nginx的deployment的中的容器镜像tag升级为alpine928result, err := kom.DefaultCluster().Resource(&Deployment{}).Namespace("default").Name("nginx").Ctl().Rollout().Status()929```930#### Deployment HPA931```go932// 显示deployment的hpa933list, err := kom.DefaultCluster().Resource(&v1.Deployment{}).Namespace("default").Name("nginx-web").Ctl().Deployment().HPAList()934for _, item := range list {935 t.Logf("HPA %s\n", item.Name)936}937```938#### 节点打污点939```go940err = kom.DefaultCluster().Resource(&Node{}).Name("kind-control-plane").Ctl().Node().Taint("dedicated=special-user:NoSchedule")941```942#### 节点去除污点943```go944err = kom.DefaultCluster().Resource(&Node{}).Name("kind-control-plane").Ctl().Node().UnTaint("dedicated=special-user:NoSchedule")945```946#### 节点Cordon947```go948err = kom.DefaultCluster().Resource(&Node{}).Name("kind-control-plane").Ctl().Node().Cordon()949```950#### 节点UnCordon951```go952err = kom.DefaultCluster().Resource(&Node{}).Name("kind-control-plane").Ctl().Node().UnCordon()953```954#### 节点Drain955```go956err = kom.DefaultCluster().Resource(&Node{}).Name("kind-control-plane").Ctl().Node().Drain()957```958#### 查询节点IP资源情况959支持设置缓存时间,避免频繁查询k8s API960```go961nodeName := "lima-rancher-desktop"962total, used, available := kom.DefaultCluster().Resource(&corev1.Node{}).WithCache(5 * time.Second).Name(nodeName).Ctl().Node().IPUsage()963fmt.Printf("Total %d, Used %d, Available %d\n", total, used, available)964//Total 256, Used 6, Available 250965```966#### 节点IP资源使用情况统计967支持设置缓存时间,避免频繁查询k8s API968```go969nodeName := "lima-rancher-desktop"970total, used, available := kom.DefaultCluster().Resource(&corev1.Node{}).WithCache(5 * time.Second).Name(nodeName).Ctl().Node().PodCount()971fmt.Printf("Total %d, Used %d, Available %d\n", total, used, available)972//Total 110, Used 9, Available 101973```974#### 节点资源用量情况统计975支持设置缓存时间,避免频繁查询k8s API976```go977nodeName := "lima-rancher-desktop"978usage := kom.DefaultCluster().Resource(&corev1.Node{}).WithCache(5 * time.Second).Name(nodeName).Ctl().Node().ResourceUsage()979fmt.Printf("Node Usage %s\n", utils.ToJSON(usage))980```981包括当前的请求值、限制值、可分配值、使用比例982```json983{984 "requests": {985 "cpu": "200m",986 "memory": "140Mi"987 },988 "limits": {989 "memory": "170Mi"990 },991 "allocatable": {992 "cpu": "4",993 "ephemeral-storage": "99833802265",994 "hugepages-1Gi": "0",995 "hugepages-2Mi": "0",996 "hugepages-32Mi": "0",997 "hugepages-64Ki": "0",998 "memory": "8127096Ki",999 "pods": "110"1000 },1001 "usageFractions": {1002 "cpu": {1003 "requestFraction": 5,1004 "limitFraction": 01005 },1006 "ephemeral-storage": {1007 "requestFraction": 0,1008 "limitFraction": 01009 },1010 "memory": {1011 "requestFraction": 1.76397571777176,1012 "limitFraction": 2.14197051443713751013 }1014 }1015}1016```1017#### 给资源增加标签1018```go1019err = kom.DefaultCluster().Resource(&Node{}).Name("kind-control-plane").Ctl().Label("name=zhangsan")1020```1021#### 给资源删除标签1022```go1023err = kom.DefaultCluster().Resource(&Node{}).Name("kind-control-plane").Ctl().Label("name-")1024```1025#### 给资源增加注解1026```go1027err = kom.DefaultCluster().Resource(&Node{}).Name("kind-control-plane").Ctl().Annotate("name=zhangsan")1028```1029#### 给资源删除注解1030```go1031err = kom.DefaultCluster().Resource(&Node{}).Name("kind-control-plane").Ctl().Annotate("name-")1032```1033#### 创建NodeSell1034```go1035ns, pod, container, err := kom.DefaultCluster().Resource(&v1.Node{}).Name("kind-control-plane").Ctl().Node().CreateNodeShell()1036fmt.Printf("Node Shell ns=%s podName=%s containerName=%s", ns, pod, container)1037```1038#### 创建kubectl Shell1039```go1040ns, pod, container, err := kom.DefaultCluster().Resource(&v1.Node{}).Name(name).Ctl().Node().CreateKubectlShell(kubeconfig)1041fmt.Printf("Kubectl Shell ns=%s podName=%s containerName=%s", ns, pod, container)10421043```1044#### 统计StorageClass下的PVC数量1045```go1046count, err := kom.DefaultCluster().Resource(&v1.StorageClass{}).Name("hostpath").Ctl().StorageClass().PVCCount()1047fmt.Printf("pvc count %d\n", count)1048```1049#### 统计StorageClass下的PV数量1050```go1051count, err := kom.DefaultCluster().Resource(&v1.StorageClass{}).Name("hostpath").Ctl().StorageClass().PVCount()1052fmt.Printf("pv count %d\n", count)1053```1054#### 设置StorageClass为默认1055```go1056err := kom.DefaultCluster().Resource(&v1.StorageClass{}).Name("hostpath").Ctl().StorageClass().SetDefault()1057```1058#### 设置IngressClass为默认1059```go1060err := kom.DefaultCluster().Resource(&v1.IngressClass{}).Name("nginx").Ctl().IngressClass().SetDefault()1061```1062#### 统计Deployment/StatefulSet/DaemonSet下的Pod列表1063```go1064list, err := kom.DefaultCluster().Namespace("default").Name("managed-pods").Ctl().Deployment().ManagedPods()1065for _, pod := range list {1066 fmt.Printf("ManagedPod: %v", pod.Name)1067}1068```1069#### 获取所有节点的标签集合1070```go1071// labels 类型为map[string]string1072labels, err := kom.DefaultCluster().Resource(&v1.Node{}).Ctl().Node().AllNodeLabels()1073fmt.Printf("%s", utils.ToJSON(labels))1074```1075```json1076{1077 "beta.kubernetes.io/arch": "arm64",1078 "beta.kubernetes.io/os": "linux",1079 "kubernetes.io/arch": "arm64",1080 "kubernetes.io/hostname": "kind-control-plane",1081 "kubernetes.io/os": "linux",1082 "kubernetes.io/role": "agent",1083 "node-role.kubernetes.io/agent": "",1084 "node-role.kubernetes.io/control-plane": "",1085 "type": "kwok",1086 "uat": "test",1087 "x": "x"1088}1089```1090#### 查看Pod资源占用率1091```go1092podName := "coredns-ccb96694c-jprpf"1093ns := "kube-system"1094usage := kom.DefaultCluster().Resource(&corev1.Pod{}).Name(podName).Namespace(ns).Ctl().Pod().ResourceUsage()1095fmt.Printf("Pod Usage %s\n", utils.ToJSON(usage))1096```1097包括当前的请求值、限制值、可分配值、使用比例1098```json1099{1100 "requests": {1101 "cpu": "100m",1102 "memory": "70Mi"1103 },1104 "limits": {1105 "memory": "170Mi"1106 },1107 "allocatable": {1108 "cpu": "4",1109 "ephemeral-storage": "99833802265",1110 "hugepages-1Gi": "0",1111 "hugepages-2Mi": "0",1112 "hugepages-32Mi": "0",1113 "hugepages-64Ki": "0",1114 "memory": "8127096Ki",1115 "pods": "110"1116 },1117 "usageFractions": {1118 "cpu": {1119 "requestFraction": 2.5,1120 "limitFraction": 01121 },1122 "memory": {1123 "requestFraction": 0.88198785888588,1124 "limitFraction": 2.14197051443713751125 }1126 }1127}1128```1129#### 获取字段文档解释1130```go1131var docResult []byte1132 item := v1.Deployment{}1133 field := "spec.replicas"1134 field = "spec.template.spec.containers.name"1135 field = "spec.template.spec.containers.imagePullPolicy"1136 field = "spec.template.spec.containers.livenessProbe.successThreshold"1137 err := kom.DefaultCluster().1138 Resource(&item).DocField(field).Doc(&docResult).Error1139 fmt.Printf("Get Deployment Doc [%s] :%s", field, string(docResult))1140```11411142### 10. Prometheus 查询1143kom 提供了强大的 Prometheus 查询功能,支持通过集群内的 Prometheus 服务或外部 Prometheus 地址进行监控数据查询。11441145#### 使用集群内的 Prometheus 服务1146通过命名空间和服务名称自动解析集群内的 Prometheus 服务地址:1147```go1148ctx := context.Background()11491150// 使用命名客户端(例如 "prometheus-k8s")1151res, err := kom.DefaultCluster().1152 WithContext(ctx).1153 Prometheus().1154 WithInClusterEndpoint("prometheus-k8s", "monitoring").1155 Expr(`up`).1156 WithTimeout(5 * time.Second).1157 Query()11581159if err != nil {1160 klog.V(6).Infof("查询失败(可能集群中未安装指定的 Prometheus): %v", err)1161 return1162}11631164klog.V(6).Infof("查询结果: %s", res.AsString())1165```11661167**说明:**1168- `WithInClusterEndpoint(namespace, svcName)`:自动查找指定命名空间下的 Prometheus Service1169- 支持自动识别常见端口(9090)和端口名称(web、http、prometheus、metrics)1170- 生成的地址格式:`http://service-name.namespace.svc:port`11711172#### 使用外部 Prometheus 地址1173直接指定 Prometheus 的访问地址:1174```go1175ctx := context.Background()11761177value, err := kom.DefaultCluster().1178 WithContext(ctx).1179 Prometheus().1180 WithAddress("http://127.0.0.1:43422/").1181 Expr(`sum by (instance) (irate(node_cpu_seconds_total{mode!="idle"}[1m])) / sum by (instance) (irate(node_cpu_seconds_total[1m])) * 100`).1182 QueryRange(time.Now().Add(-1*time.Hour), time.Now(), time.Minute)11831184if err != nil {1185 klog.V(6).Infof("查询失败: %v", err)1186 return1187}11881189klog.V(6).Infof(" value: %s", value.AsString())1190```11911192#### 瞬时查询1193在指定时间点执行查询:1194```go1195// 在当前时间点查询1196res, err := kom.DefaultCluster().1197 Prometheus().1198 WithAddress("http://127.0.0.1:9090").1199 Expr(`up`).1200 Query()12011202// 在指定时间点查询1203res, err := kom.DefaultCluster().1204 Prometheus().1205 WithAddress("http://127.0.0.1:9090").1206 Expr(`up`).1207 QueryAt(time.Now().Add(-1 * time.Hour))1208```12091210#### 区间查询1211执行时间范围查询:1212```go1213start := time.Now().Add(-1 * time.Hour)1214end := time.Now()1215step := time.Minute12161217res, err := kom.DefaultCluster().1218 Prometheus().1219 WithAddress("http://127.0.0.1:9090").1220 Expr(`rate(http_requests_total[5m])`).1221 QueryRange(start, end, step)1222```12231224#### 查询结果解析1225kom 提供了多种方式解析 Prometheus 查询结果:12261227**解析为标量值:**1228```go1229val, ok := res.AsScalar()1230if ok {1231 fmt.Printf("标量值: %f\n", val)1232}1233```12341235**解析为向量(瞬时查询结果):**1236```go1237samples := res.AsVector()1238for _, sample := range samples {1239 fmt.Printf("Metric: %v, Value: %f, Timestamp: %v\n",1240 sample.Metric, sample.Value, sample.Timestamp)1241}1242```12431244**解析为矩阵(区间查询结果):**1245```go1246series := res.AsMatrix()1247for _, s := range series {1248 fmt.Printf("Series Metric: %v\n", s.Metric)1249 for _, point := range s.Samples {1250 fmt.Printf(" Timestamp: %v, Value: %f\n",1251 point.Timestamp, point.Value)1252 }1253}1254```12551256**获取原始结果:**1257```go1258value, warnings := res.Raw()1259fmt.Printf("原始结果: %s, 警告: %v\n", value.String(), warnings)1260```12611262**获取字符串形式(便于调试):**1263```go1264fmt.Printf("查询结果: %s\n", res.AsString())1265```12661267#### 便捷查询方法1268kom 提供了便捷方法直接获取特定类型的查询结果:12691270**直接获取标量:**1271```go1272val, err := kom.DefaultCluster().1273 Prometheus().1274 WithAddress("http://127.0.0.1:9090").1275 Expr(`sum(up)`).1276 QueryScalar()1277```12781279**直接获取向量:**1280```go1281samples, err := kom.DefaultCluster().1282 Prometheus().1283 WithAddress("http://127.0.0.1:9090").1284 Expr(`up`).1285 QueryVector()1286```12871288**直接获取矩阵:**1289```go1290series, err := kom.DefaultCluster().1291 Prometheus().1292 WithAddress("http://127.0.0.1:9090").1293 Expr(`rate(http_requests_total[5m])`).1294 QueryRange(time.Now().Add(-1*time.Hour), time.Now(), time.Minute).1295 QueryMatrix()1296```12971298#### 设置超时时间1299为查询设置超时时间:1300```go1301res, err := kom.DefaultCluster().1302 Prometheus().1303 WithAddress("http://127.0.0.1:9090").1304 Expr(`up`).1305 WithTimeout(5 * time.Second).1306 Query()1307```13081309#### 查询参数说明1310| 方法 | 参数 | 说明 |1311|------|------|------|1312| `WithInClusterEndpoint` | namespace, svcName | 使用集群内的 Prometheus 服务 |1313| `WithAddress` | address | 使用外部 Prometheus 地址 |1314| `Expr` | expr | 设置 PromQL 查询表达式 |1315| `WithTimeout` | duration | 设置查询超时时间 |1316| `Query` | - | 执行瞬时查询 |1317| `QueryAt` | time | 在指定时间点执行瞬时查询 |1318| `QueryRange` | start, end, step | 执行区间查询 |1319| `QueryScalar` | - | 执行查询并返回标量值 |1320| `QueryVector` | - | 执行查询并返回向量 |1321| `QueryMatrix` | - | 执行查询并返回矩阵 |132213231324## License1325[](https://app.fossa.com/projects/git%2Bgithub.com%2Fweibaohui%2Fkom?ref=badge_large)
Full transparency — inspect the skill content before installing.