{"id":17648703,"url":"https://github.com/weibaohui/kom","last_synced_at":"2025-04-09T15:06:19.797Z","repository":{"id":258988665,"uuid":"876112489","full_name":"weibaohui/kom","owner":"weibaohui","description":"kom 是一个用于 Kubernetes 操作的工具，SDK级的kubectl、client-go的使用封装。并且支持作为管理k8s 的 MCP server。 它提供了一系列功能来管理 Kubernetes 资源，包括创建、更新、删除和获取资源，甚至使用SQL查询k8s资源。这个项目支持多种 Kubernetes 资源类型的操作，并能够处理自定义资源定义（CRD）。 通过使用 kom，你可以轻松地进行资源的增删改查和日志获取以及操作POD内文件等动作。","archived":false,"fork":false,"pushed_at":"2025-04-07T22:33:55.000Z","size":1091,"stargazers_count":92,"open_issues_count":1,"forks_count":13,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-09T15:06:09.238Z","etag":null,"topics":["client-go","cluster","crd","k8s","kom","kubectl","mcp","sdk","sql"],"latest_commit_sha":null,"homepage":"https://github.com/weibaohui/kom","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/weibaohui.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-21T12:24:05.000Z","updated_at":"2025-04-09T09:30:22.000Z","dependencies_parsed_at":"2024-10-27T12:31:02.166Z","dependency_job_id":"8e690277-41ca-492a-b0f7-f0840e58a361","html_url":"https://github.com/weibaohui/kom","commit_stats":null,"previous_names":["weibaohui/kom"],"tags_count":120,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weibaohui%2Fkom","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weibaohui%2Fkom/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weibaohui%2Fkom/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weibaohui%2Fkom/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/weibaohui","download_url":"https://codeload.github.com/weibaohui/kom/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248055284,"owners_count":21040157,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["client-go","cluster","crd","k8s","kom","kubectl","mcp","sdk","sql"],"created_at":"2024-10-23T11:20:00.317Z","updated_at":"2025-04-09T15:06:19.789Z","avatar_url":"https://github.com/weibaohui.png","language":"Go","funding_links":[],"categories":["Cloud Infrastructure","Cloud \u0026 Infrastructure","Cloud \u0026 DevOps MCP Servers","📚 Projects (1974 total)","MCP 服务器精选列表","K8S-Tools","Go","サーバー実装","Community Servers","Task and Project Management","🐳 Kubernetes \u0026 Containers","📦 Other","Table of Contents","Cloud Platforms","Code \u0026 Developer Tools","Server Implementations"],"sub_categories":["🐳 Container Orchestration","Kubernetes","MCP Servers","☁️ 云平台与服务集成 (AWS, Cloudflare, Azure, K8s, etc.)","☁️ \u003ca name=\"cloud-platforms\"\u003e\u003c/a\u003eクラウドプラットフォーム","System Automation","☁️ \u003ca name=\"cloud-platforms\"\u003e\u003c/a\u003eCloud Platforms"],"readme":"# Kom - Kubernetes Operations Manager\n\n[English](README_en.md) | [中文](README.md)\n[![kom](https://img.shields.io/badge/License-MIT-blue?style=flat-square)](https://github.com/weibaohui/kom/blob/master/LICENSE)\n\n\n## 简介\n\n`kom` 是一个用于 Kubernetes 操作的工具，相当于SDK级的kubectl、client-go的使用封装。\n它提供了一系列功能来管理 Kubernetes 资源，包括创建、更新、删除和获取资源。这个项目支持多种 Kubernetes 资源类型的操作，并能够处理自定义资源定义（CRD）。\n通过使用 `kom`，你可以轻松地进行资源的增删改查和日志获取以及操作POD内文件等动作，甚至可以使用SQL语句来查询、管理k8s资源。\n\n## **特点**\n1. 简单易用：kom 提供了丰富的功能，包括创建、更新、删除、获取、列表等，包括对内置资源以及CRD资源的操作。\n2. 多集群支持：通过RegisterCluster，你可以轻松地管理多个 Kubernetes 集群。\n3. MCP支持：支持多集群的MCP管理,同时支持stdio、sse两种模式，内置48种工具，支持SSE模式，支持私有化部署，多人共享。支持超过百种组合操作。\n4. 支持跨命名空间：通过kom.Namespace(\"default\",\"kube-system\").List(\u0026items) 跨命名空间查询资源。\n5. 链式调用：kom 提供了链式调用，使得操作资源更加简单和直观。\n6. 支持自定义资源定义（CRD）：kom 支持自定义资源定义（CRD），你可以轻松地定义和操作自定义资源。\n7. 支持回调机制，轻松拓展业务逻辑，而不必跟k8s操作强耦合。\n8. 支持POD内文件操作，轻松上传、下载、删除文件。\n9. 支持高频操作封装，如deployment的restart重启、scale扩缩容、启停等20余项操作功能。\n10. 支持SQL查询k8s资源。select * from pod where metadata.namespace='kube-system' or metadata.namespace='default' order by  metadata.creationTimestamp desc \n11. 支持查询缓存，在高频、批量查询场景下，可设置缓存过期时间，提升查询性能。列表过滤条件不受缓存影响。\n\n\n\n## 示例程序\n**k8m** 是一个轻量级的 Kubernetes 管理工具，它基于kom、amis实现，单文件，支持多平台架构。\n1. **下载**：从 [https://github.com/weibaohui/k8m](https://github.com/weibaohui/k8m) 下载最新版本。\n2. **运行**：使用 `./k8m` 命令启动,访问[http://127.0.0.1:3618](http://127.0.0.1:3618)。\n\n\n\n\n## 安装\n\n```bash\nimport (\n    \"github.com/weibaohui/kom\"\n    \"github.com/weibaohui/kom/callbacks\"\n)\nfunc main() {\n    // 注册回调，务必先注册\n    callbacks.RegisterInit()\n    // 注册集群\n\tdefaultKubeConfig := os.Getenv(\"KUBECONFIG\")\n\tif defaultKubeConfig == \"\" {\n\t\tdefaultKubeConfig = filepath.Join(homedir.HomeDir(), \".kube\", \"config\")\n\t}\n\t_, _ = kom.Clusters().RegisterInCluster()\n\t_, _ = kom.Clusters().RegisterByPathWithID(defaultKubeConfig, \"default\")\n\tkom.Clusters().Show()\n\t// 其他逻辑\n}\n```\n\n## 使用示例\n\n### 0. 多集群 k8s MCP 支持\n同时支持stdio、sse两种模式\n支持多个tools 支持。包括对任意资源的查询列表删除描述操作，以及POD日志读取操作。\n#### 1.集成到代码中\n```go\n// 一行代码启动MCP Server\nmcp.RunMCPServer(\"kom mcp server\", \"0.0.1\", 9096)\n\n\n\n```\n#### 2. 编译\n```shell\n# 源码启动\ngo build main.go \n//编译为kom\n```\n#### 3. 启动\n启动后支持两种模式，一种为stdio，一种sse。\n管理k8s默认使用KUBECONFIG env环境变量。\n```shell\n# 设置KUBECONFIG环境变量\nexport KUBECONFIG = /Users/xxx/.kube/config\n```\n```shell\n# 运行\n./kom \n# MCP Server 访问地址\nhttp://IP:9096/sse\n```\n此时，编译得到的二进制文件，可当做stdio 模式使用。\nhttp://IP:9096/sse 模式，可以当做sse 模式使用。\n\n\n#### 4. 集成到MCP工具中\n支持stdio\\sse 两种方式集成。\n适合MCP工具集成，如Cursor、Claude Desktop(仅支持stdio模式)、Windsurf等，此外也可以使用这些软件的UI操作界面进行添加。\n```json\n{\n  \"mcpServers\": {\n    \"kom\": {\n      \"type\": \"sse\",\n      \"url\": \"http://IP:9096/sse\"\n    }\n  }\n}\n```\n```json\n{\n    \"mcpServers\": {\n        \"k8m\": {\n            \"command\": \"path/to/kom\",\n            \"args\": []\n        }\n    }\n}\n```\n\n####  MCP工具列表（49种）\n\n| 类别                 | 方法                             | 描述                                      |\n|--------------------|--------------------------------|-----------------------------------------|\n| **集群管理（1）**        | `list_clusters`                | 列出所有已注册的Kubernetes集群                    |\n| **部署管理（12）**       | `scale_deployment`             | 扩缩容Deployment                           |\n|                    | `restart_deployment`           | 重启Deployment                            |\n|                    | `stop_deployment`              | 停止Deployment                            |\n|                    | `restore_deployment`           | 恢复Deployment                            |\n|                    | `update_tag_deployment`        | 更新Deployment镜像标签                        |\n|                    | `rollout_history_deployment`   | 查询Deployment升级历史                        |\n|                    | `rollout_undo_deployment`      | 回滚Deployment                            |\n|                    | `rollout_pause_deployment`     | 暂停Deployment升级                          |\n|                    | `rollout_resume_deployment`    | 恢复Deployment升级                          |\n|                    | `rollout_status_deployment`    | 查询Deployment升级状态                        |\n|                    | `hpa_list_deployment`          | 查询Deployment的HPA列表                      |\n|                    | `list_deployment_pods`         | 获取Deployment管理的Pod列表                    |\n| **动态资源管理(含CRD，8)** | `get_k8s_resource`             | 获取k8s资源                                 |\n|                    | `describe_k8s_resource`        | 描述k8s资源                                 |\n|                    | `delete_k8s_resource`          | 删除k8s资源                                 |\n|                    | `list_k8s_resource`            | 列表形式获取k8s资源                             |\n|                    | `list_k8s_event`               | 列表形式获取k8s事件                             |\n|                    | `patch_k8s_resource`           | 更新k8s资源，以JSON Patch方式更新                 |                               |\n|                    | `label_k8s_resource`           | 为k8s资源添加或删除标签                           |\n|                    | `annotate_k8s_resource`        | 为k8s资源添加或删除注解                           |\n| **节点管理（8）**        | `taint_node`                   | 为节点添加污点                                 |\n|                    | `untaint_node`                 | 为节点移除污点                                 |\n|                    | `cordon_node`                  | 为节点设置Cordon                             |\n|                    | `uncordon_node`                | 为节点取消Cordon                             |\n|                    | `drain_node`                   | 为节点执行Drain                              |\n|                    | `get_node_resource_usage`      | 查询节点的资源使用情况                             |\n|                    | `get_node_ip_usage`            | 查询节点上Pod IP资源使用情况                       |\n|                    | `get_node_pod_count`           | 查询节点上的Pod数量                             |\n| **Pod 管理（14）**     | `list_pod_files`               | 列出Pod文件                                 |\n|                    | `list_all_pod_files`           | 列出Pod所有文件                               |\n|                    | `delete_pod_file`              | 删除Pod文件                                 |\n|                    | `upload_file_to_pod`           | 上传文件到Pod内，支持传递文本内容，存储为Pod内文件            |\n|                    | `get_pod_logs`                 | 获取Pod日志                                 |\n|                    | `run_command_in_pod`           | 在Pod中执行命令                               |\n|                    | `get_pod_linked_service`       | 获取Pod关联的Service                         |\n|                    | `get_pod_linked_ingress`       | 获取Pod关联的Ingress                         |\n|                    | `get_pod_linked_endpoints`     | 获取Pod关联的Endpoints                       |\n|                    | `get_pod_linked_pvc`           | 获取Pod关联的PVC                             |\n|                    | `get_pod_linked_pv`            | 获取Pod关联的PV                              |\n|                    | `get_pod_linked_env`           | 通过在pod内运行env命令获取Pod运行时环境变量              |\n|                    | `get_pod_linked_env_from_yaml` | 通过Pod yaml定义获取Pod运行时环境变量                |\n|                    | `get_pod_resource_usage`       | 获取Pod的资源使用情况，包括CPU和内存的请求值、限制值、可分配值和使用比例 |\n| **YAML管理（2）**      | `apply_yaml`                   | 应用YAML资源                                |\n|                    | `delete_yaml`                  | 删除YAML资源                                |\n| **存储管理（3）**        | `set_default_storageclass`     | 设置默认StorageClass                        |\n|                    | `get_storageclass_pvc_count`   | 获取StorageClass下的PVC数量                   |\n|                    | `get_storageclass_pv_count`    | 获取StorageClass下的PV数量                    |\n| **Ingress管理（1）**   | `set_default_ingressclass`     | 设置默认IngressClass                        |\n\n\n#### 启动命令\n```go\nmcp.RunMCPServer(\"kom mcp server\", \"0.0.1\", 3619)\n```\n \n#### AI工具集成\n\n##### Claude Desktop\n1. 打开Claude Desktop设置面板\n2. 在API配置区域添加MCP Server地址\n3. 启用SSE事件监听功能\n4. 验证连接状态\n```json\n{\n  \"mcpServers\": {\n    \"k8m\": {\n      \"command\": \"path/to/kom\",\n      \"args\": []\n    }\n  }\n}\n```\n\n##### Cursor\n1. 进入Cursor设置界面\n2. 找到扩展服务配置选项\n3. 支持sse、stdio两种方式。sse 方式填写http://localhost:9096/sse,stdio方式填写kom的文件位置。\n\n##### Windsurf\n1. 访问配置中心\n2. 设置API服务器地址\n3. 支持sse、stdio两种方式。sse 方式填写http://localhost:9096/sse,stdio方式填写kom的文件位置。\n\n#### cherry studio\n1. 点击左下角设置\n2. 点击MCP 服务器\n3. 点击添加服务器\n4. 支持sse、stdio两种方式。sse 方式填写http://localhost:9096/sse,stdio方式填写kom的文件位置。\n\n\n### 1. 多集群管理\n#### 注册多集群\n```go\n// 注册InCluster集群，名称为InCluster\nkom.Clusters().RegisterInCluster()\n// 注册两个带名称的集群,分别名为orb和docker-desktop\nkom.Clusters().RegisterByPathWithID(\"/Users/kom/.kube/orb\", \"orb\")\nkom.Clusters().RegisterByPathWithID(\"/Users/kom/.kube/config\", \"docker-desktop\")\n// 注册一个名为default的集群，那么kom.DefaultCluster()则会返回该集群。\nkom.Clusters().RegisterByPathWithID(\"/Users/kom/.kube/config\", \"default\")\n```\n#### 显示已注册集群\n```go\nkom.Clusters().Show()\n```\n#### 选择默认集群\n```go\n// 使用默认集群,查询集群内kube-system命名空间下的pod\n// 首先尝试返回 ID 为 \"InCluster\" 的实例，如果不存在，\n// 则尝试返回 ID 为 \"default\" 的实例。\n// 如果上述两个名称的实例都不存在，则返回 clusters 列表中的任意一个实例。\nvar pods []corev1.Pod\nerr = kom.DefaultCluster().Resource(\u0026corev1.Pod{}).Namespace(\"kube-system\").List(\u0026pods).Error\n```\n#### 选择指定集群\n```go\n// 选择orb集群,查询集群内kube-system命名空间下的pod\nvar pods []corev1.Pod\nerr = kom.Cluster(\"orb\").Resource(\u0026corev1.Pod{}).Namespace(\"kube-system\").List(\u0026pods).Error\n```\n\n### 2. 内置资源对象的增删改查以及Watch示例\n定义一个 Deployment 对象，并通过 kom 进行资源操作。\n```go\nvar item v1.Deployment\nvar items []v1.Deployment\n```\n#### 创建某个资源\n```go\nitem = v1.Deployment{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:      \"nginx\",\n\t\t\tNamespace: \"default\",\n\t\t},\n\t\tSpec: v1.DeploymentSpec{\n\t\t\tTemplate: corev1.PodTemplateSpec{\n\t\t\t\tSpec: corev1.PodSpec{\n\t\t\t\t\tContainers: []corev1.Container{\n\t\t\t\t\t\t{Name: \"test\", Image: \"nginx:1.14.2\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\nerr := kom.DefaultCluster().Resource(\u0026item).Create(\u0026item).Error\n```\n#### Get查询某个资源\n```go\n// 查询 default 命名空间下名为 nginx 的 Deployment\nerr := kom.DefaultCluster().Resource(\u0026item).Namespace(\"default\").Name(\"nginx\").Get(\u0026item).Error\n// 查询 default 命名空间下名为 nginx 的 Deployment，并使用缓存 5 秒\n// 5秒内，不会再次查询，批量操作、高频操作下，建议启用缓存\nerr := kom.DefaultCluster().Resource(\u0026item).Namespace(\"default\").Name(\"nginx\").WithCache(5 * time.Second).Get(\u0026item).Error\n```\n#### List查询资源列表\n```go\n// 查询 default 命名空间下的 Deployment 列表\nerr := kom.DefaultCluster().Resource(\u0026item).Namespace(\"default\").List(\u0026items).Error\n// 查询 default、kube-system 命名空间下的 Deployment 列表\nerr := kom.DefaultCluster().Resource(\u0026item).Namespace(\"default\",\"kube-system\").List(\u0026items).Error\n// 查询 所有 命名空间下的 Deployment 列表\nerr := kom.DefaultCluster().Resource(\u0026item).Namespace(\"*\").List(\u0026items).Error\nerr := kom.DefaultCluster().Resource(\u0026item).AllNamespace().List(\u0026items).Error\n// 设置5秒缓存，对列表生效\nerr := kom.DefaultCluster().Resource(\u0026item).WithCache(5 * time.Second).List(\u0026nodeList).Error\n```\n#### 通过Label查询资源列表\n```go\n// 查询 default 命名空间下 标签为 app:nginx 的 Deployment 列表\nerr := kom.DefaultCluster().Resource(\u0026item).Namespace(\"default\").WithLabelSelector(\"app=nginx\").List(\u0026items).Error\n```\n#### 通过多个Label查询资源列表\n```go\n// 查询 default 命名空间下 标签为 app:nginx m:n 的 Deployment 列表\nerr := kom.DefaultCluster().Resource(\u0026item).Namespace(\"default\").WithLabelSelector(\"app=nginx\").WithLabelSelector(\"m=n\").List(\u0026items).Error\n```\n#### 通过Field查询资源列表\n```go\n// 查询 default 命名空间下 标签为 metadata.name=test-deploy 的 Deployment 列表\n// 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等字段\nerr := kom.DefaultCluster().Resource(\u0026item).Namespace(\"default\").WithFieldSelector(\"metadata.name=test-deploy\").List(\u0026items).Error\n```\n#### 分页查询资源\n```go\nvar list []corev1.Pod\nvar total int64\nsql := \"select * from pod where metadata.namespace=? or metadata.namespace=?     order by  metadata.creationTimestamp desc \"\nerr := kom.DefaultCluster().Sql(sql, \"kube-system\", \"default\").\n\t\tFillTotalCount(\u0026total).\n\t\tLimit(5).\n\t\tOffset(10).\n\t\tList(\u0026list).Error\nfmt.Printf(\"total %d\\n\", total)  //返回总数 480\nfmt.Printf(\"Count %d\\n\", len(list)) //返回条目数=limit=5\n```\n#### 更新资源内容\n```go\n// 更新名为nginx 的 Deployment，增加一个注解\nerr := kom.DefaultCluster().Resource(\u0026item).Namespace(\"default\").Name(\"nginx\").Get(\u0026item).Error\nif item.Spec.Template.Annotations == nil {\n\titem.Spec.Template.Annotations = map[string]string{}\n}\nitem.Spec.Template.Annotations[\"kom.kubernetes.io/restartedAt\"] = time.Now().Format(time.RFC3339)\nerr = kom.DefaultCluster().Resource(\u0026item).Update(\u0026item).Error\n```\n#### PATCH 更新资源\n```go\n// 使用 Patch 更新资源,为名为 nginx 的 Deployment 增加一个标签，并设置副本数为5\npatchData := `{\n    \"spec\": {\n        \"replicas\": 5\n    },\n    \"metadata\": {\n        \"labels\": {\n            \"new-label\": \"new-value\"\n        }\n    }\n}`\nerr := kom.DefaultCluster().Resource(\u0026item).Patch(\u0026item, types.StrategicMergePatchType, patchData).Error\n```\n#### 删除资源\n```go\n// 删除名为 nginx 的 Deployment\nerr := kom.DefaultCluster().Resource(\u0026item).Namespace(\"default\").Name(\"nginx\").Delete().Error\n```\n#### 强制删除资源\n```go\n// 删除名为 nginx 的 Deployment\nerr := kom.DefaultCluster().Resource(\u0026item).Namespace(\"default\").Name(\"nginx\").ForceDelete().Error\n```\n#### 通用类型资源的获取（适用于k8s内置类型以及CRD）\n```go\n// 指定GVK获取资源\nvar list []corev1.Event\nerr := kom.DefaultCluster().GVK(\"events.k8s.io\", \"v1\", \"Event\").Namespace(\"default\").List(\u0026list).Error\n```\n#### Watch资源变更\n```go\n// watch default 命名空间下 Pod资源 的变更\nvar watcher watch.Interface\nvar pod corev1.Pod\nerr := kom.DefaultCluster().Resource(\u0026pod).Namespace(\"default\").Watch(\u0026watcher).Error\nif err != nil {\n\tfmt.Printf(\"Create Watcher Error %v\", err)\n\treturn err\n}\ngo func() {\n\tdefer watcher.Stop()\n\n\tfor event := range watcher.ResultChan() {\n\t\terr := kom.DefaultCluster().Tools().ConvertRuntimeObjectToTypedObject(event.Object, \u0026pod)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"无法将对象转换为 *v1.Pod 类型: %v\", err)\n\t\t\treturn\n\t\t}\n\t\t// 处理事件\n\t\tswitch event.Type {\n\t\tcase watch.Added:\n\t\t\tfmt.Printf(\"Added Pod [ %s/%s ]\\n\", pod.Namespace, pod.Name)\n\t\tcase watch.Modified:\n\t\t\tfmt.Printf(\"Modified Pod [ %s/%s ]\\n\", pod.Namespace, pod.Name)\n\t\tcase watch.Deleted:\n\t\t\tfmt.Printf(\"Deleted Pod [ %s/%s ]\\n\", pod.Namespace, pod.Name)\n\t\t}\n\t}\n}()\n```\n#### Describe查询某个资源\n```go\n// Describe default 命名空间下名为 nginx 的 Deployment\nvar describeResult []byte\nerr := kom.DefaultCluster().Resource(\u0026item).Namespace(\"default\").Name(\"nginx\").Describe(\u0026item).Error\nfmt.Printf(\"describeResult: %s\", describeResult)\n```\n\n### 3. YAML 创建、更新、删除\n```go\nyaml := `apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: example-config\n  namespace: default\ndata:\n  key: value\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: example-deployment\n  namespace: default\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: example\n  template:\n    metadata:\n      labels:\n        app: example\n    spec:\n      containers:\n        - name: example-container\n          image: nginx\n`\n// 第一次执行Apply为创建，返回每一条资源的执行结果 \nresults := kom.DefaultCluster().Applier().Apply(yaml)\n// 第二次执行Apply为更新，返回每一条资源的执行结果\nresults = kom.DefaultCluster().Applier().Apply(yaml)\n// 删除，返回每一条资源的执行结果\nresults = kom.DefaultCluster().Applier().Delete(yaml)\n```\n\n### 4. Pod 操作\n#### 获取日志\n```go\n// 获取Pod日志\nvar stream io.ReadCloser\nerr := kom.DefaultCluster().Namespace(\"default\").Name(\"random-char-pod\").Ctl().Pod().ContainerName(\"container\").GetLogs(\u0026stream, \u0026corev1.PodLogOptions{}).Error\nreader := bufio.NewReader(stream)\nline, _ := reader.ReadString('\\n')\nfmt.Println(line)\n```\n#### 执行命令\n在Pod内执行命令，需要指定容器名称，并且会触发Exec()类型的callbacks。\n```go\n// 在Pod内执行ps -ef命令\nvar execResult string\nerr := kom.DefaultCluster().Namespace(\"default\").Name(\"random-char-pod\").Ctl().Pod().ContainerName(\"container\").Command(\"ps\", \"-ef\").ExecuteCommand(\u0026execResult).Error\nfmt.Printf(\"execResult: %s\", execResult)\n```\n#### 流式执行命令\n在Pod内执行命令，并且会触发StreamExec()类型的callbacks。适合执行ping 等命令\n```go\ncb := func(data []byte) error {\n\t\tfmt.Printf(\"Data %s\\n\", string(data))\n\t\treturn nil\n\t}\nerr := kom.DefaultCluster().Namespace(\"kube-system\").Name(\"traefik-d7c9c5778-p9nf4\").Ctl().Pod().ContainerName(\"traefik\").Command(\"ping\", \"127.0.0.1\").StreamExecute(cb, cb).Error\n//输出：\n//Data PING 127.0.0.1 (127.0.0.1): 56 data bytes\n//Data 64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.023 ms\n//Data 64 bytes from 127.0.0.1: seq=1 ttl=42 time=0.011 ms\n//Data 64 bytes from 127.0.0.1: seq=2 ttl=42 time=0.012 ms\n//Data 64 bytes from 127.0.0.1: seq=3 ttl=42 time=0.016 ms\n```\n\n#### 文件列表\n```go\n// 获取Pod内/etc文件夹列表\nkom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().ContainerName(\"nginx\").ListFiles(\"/etc\")\n```\n#### 所有文件列表，包括隐藏文件\n```go\n// 获取Pod内/etc文件夹列表\nkom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().ContainerName(\"nginx\").ListAllFiles(\"/etc\")\n```\n#### 文件下载\n```go\n// 下载Pod内/etc/hosts文件\nkom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().ContainerName(\"nginx\").DownloadFile(\"/etc/hosts\")\n```\n#### 文件下载(Tar压缩)\n```go\n// 下载Pod内/etc/hosts文件，以tar方式进行打包后，获取，下载\nkom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().ContainerName(\"nginx\").DownloadTarFile(\"/etc/hosts\")\n```\n#### 文件上传\n```go\n// 上传文件内容到Pod内/etc/demo.txt文件\nkom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().ContainerName(\"nginx\").SaveFile(\"/etc/demo.txt\", \"txt-context\")\n// os.File 类型文件直接上传到Pod内/etc/目录下\nfile, _ := os.Open(tempFilePath)\nkom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().ContainerName(\"nginx\").UploadFile(\"/etc/\", file)\n```\n#### 文件删除\n```go\n// 删除Pod内/etc/xyz文件\nkom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().ContainerName(\"nginx\").DeleteFile(\"/etc/xyz\")\n```\n#### 获取关联资源-Service\n```go\n// 获取Pod关联的Service\nsvcs, err := kom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().LinkedService()\nfor _, svc := range svcs {\n\tfmt.Printf(\"service name %v\\n\", svc.Name)\n}\n```\n#### 获取关联资源-Ingress\n```go\n// 获取Pod关联的Ingress\ningresses, err := kom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().LinkedIngress()\nfor _, ingress := range ingresses {\n\tfmt.Printf(\"ingress name %v\\n\", ingress.Name)\n}\n```\n#### 获取关联资源-PVC\n```go\n// 获取Pod关联的PVC\npvcs, err := kom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().LinkedPVC()\nfor _, pvc := range pvcs {\n\tfmt.Printf(\"pvc name %v\\n\", pvc.Name)\n}\n``` \n#### 获取关联资源-PV\n```go\n// 获取Pod关联的PVC\npvs, err := kom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().LinkedPV()\nfor _, pv := range pvs {\n\tfmt.Printf(\"pv name %v\\n\", pv.Name)\n}\n``` \n#### 获取关联资源-Endpoints\n```go\n// 获取Pod关联的Endpoints\nendpoints, err := kom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().LinkedEndpoints()\nfor _, endpoint := range endpoints {\n\tfmt.Printf(\"endpoint name %v\\n\", endpoint.Name)\n}\n```\n#### 获取关联资源-运行时Env\n从Pod内执行env命令获得ENV配置信息\n```go\nenvs, err := kom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().LinkedEnv()\nfor _, env := range envs {\n\t\tfmt.Printf(\"env %s %s=%s\\n\", env.ContainerName, env.EnvName, env.EnvValue)\n\t}\n```\n#### 获取关联资源-定义Env\n从pod定义上提取ENV配置信息\n```go\nenvs, err := kom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().LinkedEnvFromPod()\nfor _, env := range envs {\n\t\tfmt.Printf(\"env %s %s=%s\\n\", env.ContainerName, env.EnvName, env.EnvValue)\n\t}\n```\n#### 获取关联资源-节点\n根据Pod 定义中声明的NodeSelector、NodeAffinity、污点容忍度、NodeName等配置信息，返回可用节点列表。暂未考虑Pod亲和性、CPU内存等运行时调度因素。\n```go\nnodes, err := kom.DefaultCluster().Namespace(\"default\").Name(\"nginx\").Ctl().Pod().LinkedNode()\nfor _, node := range nodes {\n    fmt.Printf(\"reason:%s\\t node name %s\\n\", node.Reason, node.Name)\n}\n```\n\n### 5. 自定义资源定义（CRD）增删改查及Watch操作\n在没有CR定义的情况下，如何进行增删改查操作。操作方式同k8s内置资源。\n将对象定义为unstructured.Unstructured，并且需要指定Group、Version、Kind。\n因此可以通过kom.DefaultCluster().GVK(group, version, kind)来替代kom.DefaultCluster().Resource(interface{})\n为方便记忆及使用，kom提供了kom.DefaultCluster().CRD(group, version, kind)来简化操作。\n下面给出操作CRD的示例：\n首先定义一个通用的处理对象，用来接收CRD的返回结果。\n```go\nvar item unstructured.Unstructured\n```\n#### 创建CRD\n```go\nyaml := `apiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: crontabs.stable.example.com\nspec:\n  group: stable.example.com\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            spec:\n              type: object\n              properties:\n                cronSpec:\n                  type: string\n                image:\n                  type: string\n                replicas:\n                  type: integer\n  scope: Namespaced\n  names:\n    plural: crontabs\n    singular: crontab\n    kind: CronTab\n    shortNames:\n    - ct`\nresult := kom.DefaultCluster().Applier().Apply(yaml)\n```\n#### 创建CRD的CR对象\n```go\nitem = unstructured.Unstructured{\n\t\tObject: map[string]interface{}{\n\t\t\t\"apiVersion\": \"stable.example.com/v1\",\n\t\t\t\"kind\":       \"CronTab\",\n\t\t\t\"metadata\": map[string]interface{}{\n\t\t\t\t\"name\":      \"test-crontab\",\n\t\t\t\t\"namespace\": \"default\",\n\t\t\t},\n\t\t\t\"spec\": map[string]interface{}{\n\t\t\t\t\"cronSpec\": \"* * * * */8\",\n\t\t\t\t\"image\":    \"test-crontab-image\",\n\t\t\t},\n\t\t},\n\t}\nerr := kom.DefaultCluster().CRD(\"stable.example.com\", \"v1\", \"CronTab\").Namespace(item.GetNamespace()).Name(item.GetName()).Create(\u0026item).Error\n```\n#### Get获取单个CR对象\n```go\nerr := kom.DefaultCluster().CRD(\"stable.example.com\", \"v1\", \"CronTab\").Name(item.GetName()).Namespace(item.GetNamespace()).Get(\u0026item).Error\n```\n#### List获取CR对象的列表\n```go\nvar crontabList []unstructured.Unstructured\n// 查询default命名空间下的CronTab\nerr := kom.DefaultCluster().CRD(\"stable.example.com\", \"v1\", \"CronTab\").Namespace(crontab.GetNamespace()).List(\u0026crontabList).Error\n// 查询所有命名空间下的CronTab\nerr := kom.DefaultCluster().CRD(\"stable.example.com\", \"v1\", \"CronTab\").AllNamespace().List(\u0026crontabList).Error\nerr := kom.DefaultCluster().CRD(\"stable.example.com\", \"v1\", \"CronTab\").Namespace(\"*\").List(\u0026crontabList).Error\n```\n#### 更新CR对象\n```go\npatchData := `{\n    \"spec\": {\n        \"image\": \"patch-image\"\n    },\n    \"metadata\": {\n        \"labels\": {\n            \"new-label\": \"new-value\"\n        }\n    }\n}`\nerr := kom.DefaultCluster().CRD(\"stable.example.com\", \"v1\", \"CronTab\").Name(crontab.GetName()).Namespace(crontab.GetNamespace()).Patch(\u0026crontab, types.StrategicMergePatchType, patchData).Error\n```\n#### 删除CR对象\n```go\nerr := kom.DefaultCluster().CRD(\"stable.example.com\", \"v1\", \"CronTab\").Name(crontab.GetName()).Namespace(crontab.GetNamespace()).Delete().Error\n```\n#### 强制删除CR对象\n```go\nerr := kom.DefaultCluster().CRD(\"stable.example.com\", \"v1\", \"CronTab\").Name(crontab.GetName()).Namespace(crontab.GetNamespace()).ForceDelete().Error\n```\n#### Watch CR对象\n```go\nvar watcher watch.Interface\n\nerr := kom.DefaultCluster().CRD(\"stable.example.com\", \"v1\", \"CronTab\").Namespace(\"default\").Watch(\u0026watcher).Error\nif err != nil {\n    fmt.Printf(\"Create Watcher Error %v\", err)\n}\ngo func() {\n    defer watcher.Stop()\n    \n    for event := range watcher.ResultChan() {\n    var item *unstructured.Unstructured\n    \n    item, err := kom.DefaultCluster().Tools().ConvertRuntimeObjectToUnstructuredObject(event.Object)\n    if err != nil {\n        fmt.Printf(\"无法将对象转换为 Unstructured 类型: %v\", err)\n        return\n    }\n    // 处理事件\n    switch event.Type {\n        case watch.Added:\n            fmt.Printf(\"Added Unstructured [ %s/%s ]\\n\", item.GetNamespace(), item.GetName())\n        case watch.Modified:\n            fmt.Printf(\"Modified Unstructured [ %s/%s ]\\n\", item.GetNamespace(), item.GetName())\n        case watch.Deleted:\n            fmt.Printf(\"Deleted Unstructured [ %s/%s ]\\n\", item.GetNamespace(), item.GetName())\n        }\n    }\n}()\n```\n#### Describe查询某个CRD资源\n```go\n// Describe default 命名空间下名为 nginx 的 Deployment\nvar describeResult []byte\nerr := kom.DefaultCluster()..CRD(\"stable.example.com\", \"v1\", \"CronTab\").Namespace(\"default\").Name(item.GetName()).Describe(\u0026item).Error\nfmt.Printf(\"describeResult: %s\", describeResult)\n```\n\n### 6. 集群参数信息\n```go\n// 集群文档\nkom.DefaultCluster().Status().Docs()\n// 集群资源信息\nkom.DefaultCluster().Status().APIResources()\n// 集群已注册CRD列表\nkom.DefaultCluster().Status().CRDList()\n// 集群版本信息\nkom.DefaultCluster().Status().ServerVersion()\n```\n\n### 7. callback机制\n* 内置了callback机制，可以自定义回调函数，当执行完某项操作后，会调用对应的回调函数。\n* 如果回调函数返回true，则继续执行后续操作，否则终止后续操作。\n* 当前支持的callback有：get,list,create,update,patch,delete,exec,stream-exec,logs,watch.\n* 内置的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\"\n* 支持回调函数排序，默认按注册顺序执行，可以通过kom.DefaultCluster().Callback().After(\"kom:get\")或者.Before(\"kom:get\")设置顺序。\n* 支持删除回调函数，通过kom.DefaultCluster().Callback().Delete(\"kom:get\")\n* 支持替换回调函数，通过kom.DefaultCluster().Callback().Replace(\"kom:get\",cb)\n```go\n// 为Get获取资源注册回调函数\nkom.DefaultCluster().Callback().Get().Register(\"get\", cb)\n// 为List获取资源注册回调函数\nkom.DefaultCluster().Callback().List().Register(\"list\", cb)\n// 为Create创建资源注册回调函数\nkom.DefaultCluster().Callback().Create().Register(\"create\", cb)\n// 为Update更新资源注册回调函数\nkom.DefaultCluster().Callback().Update().Register(\"update\", cb)\n// 为Patch更新资源注册回调函数\nkom.DefaultCluster().Callback().Patch().Register(\"patch\", cb)\n// 为Delete删除资源注册回调函数\nkom.DefaultCluster().Callback().Delete().Register(\"delete\", cb)\n// 为Watch资源注册回调函数\nkom.DefaultCluster().Callback().Watch().Register(\"watch\",cb)\n// 为Exec Pod内执行命令注册回调函数\nkom.DefaultCluster().Callback().Exec().Register(\"exec\", cb)\n// 为Logs获取日志注册回调函数\nkom.DefaultCluster().Callback().Logs().Register(\"logs\", cb)\n// 删除回调函数\nkom.DefaultCluster().Callback().Get().Delete(\"get\")\n// 替换回调函数\nkom.DefaultCluster().Callback().Get().Replace(\"get\", cb)\n// 指定回调函数执行顺序，在内置的回调函数执行完之后再执行\nkom.DefaultCluster().Callback().After(\"kom:get\").Register(\"get\", cb)\n// 指定回调函数执行顺序，在内置的回调函数执行之前先执行\n// 案例1.在Create创建资源前，进行权限检查，没有权限则返回error，后续创建动作将不再执行\n// 案例2.在List获取资源列表后，进行特定的资源筛选，从列表(Statement.Dest)中删除不符合要求的资源，然后返回给用户\nkom.DefaultCluster().Callback().Before(\"kom:create\").Register(\"create\", cb)\n\n// 自定义回调函数\nfunc cb(k *kom.Kubectl) error {\n    stmt := k.Statement\n    gvr := stmt.GVR\n    ns := stmt.Namespace\n    name := stmt.Name\n    // 打印信息\n    fmt.Printf(\"Get %s/%s(%s)\\n\", ns, name, gvr)\n    fmt.Printf(\"Command %s/%s(%s %s)\\n\", ns, name, stmt.Command, stmt.Args)\n    return nil\n\t// return fmt.Errorf(\"error\") 返回error将阻止后续cb的执行\n}\n```\n\n### 8. SQL查询k8s资源\n* 通过SQL()方法查询k8s资源，简单高效。\n* Table 名称支持集群内注册的所有资源的全称及简写，包括CRD资源。只要是注册到集群上了，就可以查。\n* 典型的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。统统都可以查。\n* 查询字段目前仅支持*。也就是select *\n* 查询条件目前支持 =，!=,\u003e=,\u003c=,\u003c\u003e,like,in,not in,and,or,between\n* 排序字段目前支持对单一字段进行排序。默认按创建时间倒序排列\n* \n#### 查询k8s内置资源\n```go\n    sql := \"select * from deploy where metadata.namespace='kube-system' or metadata.namespace='default' order by  metadata.creationTimestamp asc   \"\n\n\tvar list []v1.Deployment\n\terr := kom.DefaultCluster().Sql(sql).List(\u0026list).Error\n\tfor _, d := range list {\n\t\tfmt.Printf(\"List Items foreach %s,%s at %s \\n\", d.GetNamespace(), d.GetName(), d.GetCreationTimestamp())\n\t}\n```\n#### 查询CRD资源\n```go\n    // vm 为kubevirt 的CRD\n    sql := \"select * from vm where (metadata.namespace='kube-system' or metadata.namespace='default' )  \"\n\tvar list []unstructured.Unstructured\n\terr := kom.DefaultCluster().Sql(sql).List(\u0026list).Error\n\tfor _, d := range list {\n\t\tfmt.Printf(\"List Items foreach %s,%s\\n\", d.GetNamespace(), d.GetName())\n\t}\n```\n#### 链式调研查询SQL\n```go\n// 查询pod 列表\nerr := kom.DefaultCluster().From(\"pod\").\n\t\tWhere(\"metadata.namespace = ?  or metadata.namespace= ? \", \"kube-system\", \"default\").\n\t\tOrder(\"metadata.creationTimestamp desc\").\n\t\tList(\u0026list).Error\n```\n#### k8s资源嵌套列表属性支持\n```go\n// spec.containers为列表，其下的ports也为列表，我们查询ports的name\nsql := \"select * from pod where spec.containers.ports.name like '%k8m%'  \"\nvar list []v1.Pod\nerr := kom.DefaultCluster().Sql(sql).List(\u0026list).Error\nfor _, d := range list {\n\tt.Logf(\"List Items foreach %s,%s\\n\", d.GetNamespace(), d.GetName())\n}\n```\n\n### 9. 其他操作\n#### Deployment重启\n```go\nerr = kom.DefaultCluster().Resource(\u0026Deployment{}).Namespace(\"default\").Name(\"nginx\").Ctl().Rollout().Restart()\n```\n#### Deployment扩缩容\n```go\n// 将名称为nginx的deployment的副本数设置为3\nerr = kom.DefaultCluster().Resource(\u0026Deployment{}).Namespace(\"default\").Name(\"nginx\").Ctl().Scaler().Scale(3)\n```\n#### Deployment 停止\n```go\n// 将名称为nginx的deployment的副本数设置为0\n// 当前运行副本数量记录到注解中\nerr = kom.DefaultCluster().Resource(\u0026Deployment{}).Namespace(\"default\").Name(\"nginx\").Ctl().Scaler().Stop()\n```\n#### Deployment 恢复\n```go\n// 将名称为nginx的deployment的副本数从注解中恢复，如果没有注解，默认恢复到1\nerr = kom.DefaultCluster().Resource(\u0026Deployment{}).Namespace(\"default\").Name(\"nginx\").Ctl().Scaler().Restore()\n```\n#### Deployment更新Tag\n```go\n// 将名称为nginx的deployment的中的容器镜像tag升级为alpine\nerr = kom.DefaultCluster().Resource(\u0026Deployment{}).Namespace(\"default\").Name(\"nginx\").Ctl().Deployment().ReplaceImageTag(\"main\",\"20241124\")\n```\n#### Deployment Rollout History\n```go\n// 查询名称为nginx的deployment的升级历史\nresult, err := kom.DefaultCluster().Resource(\u0026Deployment{}).Namespace(\"default\").Name(\"nginx\").Ctl().Rollout().History()\n```\n#### Deployment Rollout Undo\n```go\n// 将名称为nginx的deployment进行回滚\nresult, err := kom.DefaultCluster().Resource(\u0026Deployment{}).Namespace(\"default\").Name(\"nginx\").Ctl().Rollout().Undo()\n// 将名称为nginx的deployment进行回滚到指定版本(history 查询)\nresult, err := kom.DefaultCluster().Resource(\u0026Deployment{}).Namespace(\"default\").Name(\"nginx\").Ctl().Rollout().Undo(\"6\")\n```\n#### Deployment Rollout Pause\n```go\n// 暂停升级过程\nerr := kom.DefaultCluster().Resource(\u0026Deployment{}).Namespace(\"default\").Name(\"nginx\").Ctl().Rollout().Pause()\n```\n#### Deployment Rollout Resume \n```go\n// 恢复升级过程\nerr := kom.DefaultCluster().Resource(\u0026Deployment{}).Namespace(\"default\").Name(\"nginx\").Ctl().Rollout().Resume()\n```\n#### Deployment Rollout Status \n```go\n// 将名称为nginx的deployment的中的容器镜像tag升级为alpine\nresult, err := kom.DefaultCluster().Resource(\u0026Deployment{}).Namespace(\"default\").Name(\"nginx\").Ctl().Rollout().Status()\n```\n#### Deployment HPA\n```go\n// 显示deployment的hpa \nlist, err := kom.DefaultCluster().Resource(\u0026v1.Deployment{}).Namespace(\"default\").Name(\"nginx-web\").Ctl().Deployment().HPAList()\nfor _, item := range list {\n    t.Logf(\"HPA %s\\n\", item.Name)\n}\n```\n#### 节点打污点\n```go\nerr = kom.DefaultCluster().Resource(\u0026Node{}).Name(\"kind-control-plane\").Ctl().Node().Taint(\"dedicated=special-user:NoSchedule\")\n```\n#### 节点去除污点\n```go\nerr = kom.DefaultCluster().Resource(\u0026Node{}).Name(\"kind-control-plane\").Ctl().Node().UnTaint(\"dedicated=special-user:NoSchedule\")\n```\n#### 节点Cordon\n```go\nerr = kom.DefaultCluster().Resource(\u0026Node{}).Name(\"kind-control-plane\").Ctl().Node().Cordon()\n```\n#### 节点UnCordon\n```go\nerr = kom.DefaultCluster().Resource(\u0026Node{}).Name(\"kind-control-plane\").Ctl().Node().UnCordon()\n```\n#### 节点Drain\n```go\nerr = kom.DefaultCluster().Resource(\u0026Node{}).Name(\"kind-control-plane\").Ctl().Node().Drain()\n```\n#### 查询节点IP资源情况\n支持设置缓存时间，避免频繁查询k8s API\n```go\nnodeName := \"lima-rancher-desktop\"\ntotal, used, available := kom.DefaultCluster().Resource(\u0026corev1.Node{}).WithCache(5 * time.Second).Name(nodeName).Ctl().Node().IPUsage()\nfmt.Printf(\"Total %d, Used %d, Available %d\\n\", total, used, available)\n//Total 256, Used 6, Available 250\n```\n#### 节点IP资源使用情况统计\n支持设置缓存时间，避免频繁查询k8s API\n```go\nnodeName := \"lima-rancher-desktop\"\ntotal, used, available := kom.DefaultCluster().Resource(\u0026corev1.Node{}).WithCache(5 * time.Second).Name(nodeName).Ctl().Node().PodCount()\nfmt.Printf(\"Total %d, Used %d, Available %d\\n\", total, used, available)\n//Total 110, Used 9, Available 101\n```\n#### 节点资源用量情况统计\n支持设置缓存时间，避免频繁查询k8s API\n```go\nnodeName := \"lima-rancher-desktop\"\nusage := kom.DefaultCluster().Resource(\u0026corev1.Node{}).WithCache(5 * time.Second).Name(nodeName).Ctl().Node().ResourceUsage()\nfmt.Printf(\"Node Usage %s\\n\", utils.ToJSON(usage))\n```\n包括当前的请求值、限制值、可分配值、使用比例\n```json\n{\n  \"requests\": {\n    \"cpu\": \"200m\",\n    \"memory\": \"140Mi\"\n  },\n  \"limits\": {\n    \"memory\": \"170Mi\"\n  },\n  \"allocatable\": {\n    \"cpu\": \"4\",\n    \"ephemeral-storage\": \"99833802265\",\n    \"hugepages-1Gi\": \"0\",\n    \"hugepages-2Mi\": \"0\",\n    \"hugepages-32Mi\": \"0\",\n    \"hugepages-64Ki\": \"0\",\n    \"memory\": \"8127096Ki\",\n    \"pods\": \"110\"\n  },\n  \"usageFractions\": {\n    \"cpu\": {\n      \"requestFraction\": 5,\n      \"limitFraction\": 0\n    },\n    \"ephemeral-storage\": {\n      \"requestFraction\": 0,\n      \"limitFraction\": 0\n    },\n    \"memory\": {\n      \"requestFraction\": 1.76397571777176,\n      \"limitFraction\": 2.1419705144371375\n    }\n  }\n}\n```\n#### 给资源增加标签\n```go\nerr = kom.DefaultCluster().Resource(\u0026Node{}).Name(\"kind-control-plane\").Ctl().Label(\"name=zhangsan\")\n```\n#### 给资源删除标签\n```go\nerr = kom.DefaultCluster().Resource(\u0026Node{}).Name(\"kind-control-plane\").Ctl().Label(\"name-\")\n```\n#### 给资源增加注解\n```go\nerr = kom.DefaultCluster().Resource(\u0026Node{}).Name(\"kind-control-plane\").Ctl().Annotate(\"name=zhangsan\")\n```\n#### 给资源删除注解\n```go\nerr = kom.DefaultCluster().Resource(\u0026Node{}).Name(\"kind-control-plane\").Ctl().Annotate(\"name-\")\n```\n#### 创建NodeSell\n```go\nns, pod, container, err  := kom.DefaultCluster().Resource(\u0026v1.Node{}).Name(\"kind-control-plane\").Ctl().Node().CreateNodeShell()\nfmt.Printf(\"Node Shell ns=%s podName=%s containerName=%s\", ns, pod, container)\n```\n#### 创建kubectl Shell\n```go\nns, pod, container, err := kom.DefaultCluster().Resource(\u0026v1.Node{}).Name(name).Ctl().Node().CreateKubectlShell(kubeconfig)\nfmt.Printf(\"Kubectl Shell ns=%s podName=%s containerName=%s\", ns, pod, container)\n\n```\n#### 统计StorageClass下的PVC数量\n```go\ncount, err := kom.DefaultCluster().Resource(\u0026v1.StorageClass{}).Name(\"hostpath\").Ctl().StorageClass().PVCCount()\nfmt.Printf(\"pvc count %d\\n\", count)\n```\n#### 统计StorageClass下的PV数量\n```go\ncount, err := kom.DefaultCluster().Resource(\u0026v1.StorageClass{}).Name(\"hostpath\").Ctl().StorageClass().PVCount()\nfmt.Printf(\"pv count %d\\n\", count)\n```\n#### 设置StorageClass为默认\n```go\nerr := kom.DefaultCluster().Resource(\u0026v1.StorageClass{}).Name(\"hostpath\").Ctl().StorageClass().SetDefault()\n```\n#### 设置IngressClass为默认\n```go\nerr := kom.DefaultCluster().Resource(\u0026v1.IngressClass{}).Name(\"nginx\").Ctl().IngressClass().SetDefault()\n```\n#### 统计Deployment/StatefulSet/DaemonSet下的Pod列表\n```go\nlist, err := kom.DefaultCluster().Namespace(\"default\").Name(\"managed-pods\").Ctl().Deployment().ManagedPods()\nfor _, pod := range list {\n\tfmt.Printf(\"ManagedPod: %v\", pod.Name)\n}\n```\n#### 获取所有节点的标签集合\n```go\n// labels 类型为map[string]string\nlabels, err := kom.DefaultCluster().Resource(\u0026v1.Node{}).Ctl().Node().AllNodeLabels()\nfmt.Printf(\"%s\", utils.ToJSON(labels))\n```\n```json\n{\n          \"beta.kubernetes.io/arch\": \"arm64\",\n          \"beta.kubernetes.io/os\": \"linux\",\n          \"kubernetes.io/arch\": \"arm64\",\n          \"kubernetes.io/hostname\": \"kind-control-plane\",\n          \"kubernetes.io/os\": \"linux\",\n          \"kubernetes.io/role\": \"agent\",\n          \"node-role.kubernetes.io/agent\": \"\",\n          \"node-role.kubernetes.io/control-plane\": \"\",\n          \"type\": \"kwok\",\n          \"uat\": \"test\",\n          \"x\": \"x\"\n}\n```\n#### 查看Pod资源占用率\n```go\npodName := \"coredns-ccb96694c-jprpf\"\nns := \"kube-system\"\nusage := kom.DefaultCluster().Resource(\u0026corev1.Pod{}).Name(podName).Namespace(ns).Ctl().Pod().ResourceUsage()\nfmt.Printf(\"Pod Usage %s\\n\", utils.ToJSON(usage))\n```\n包括当前的请求值、限制值、可分配值、使用比例\n```json\n{\n  \"requests\": {\n    \"cpu\": \"100m\",\n    \"memory\": \"70Mi\"\n  },\n  \"limits\": {\n    \"memory\": \"170Mi\"\n  },\n  \"allocatable\": {\n    \"cpu\": \"4\",\n    \"ephemeral-storage\": \"99833802265\",\n    \"hugepages-1Gi\": \"0\",\n    \"hugepages-2Mi\": \"0\",\n    \"hugepages-32Mi\": \"0\",\n    \"hugepages-64Ki\": \"0\",\n    \"memory\": \"8127096Ki\",\n    \"pods\": \"110\"\n  },\n  \"usageFractions\": {\n    \"cpu\": {\n      \"requestFraction\": 2.5,\n      \"limitFraction\": 0\n    },\n    \"memory\": {\n      \"requestFraction\": 0.88198785888588,\n      \"limitFraction\": 2.1419705144371375\n    }\n  }\n}\n```\n\n## k8s版本兼容性测试\n\n| k8s版本    | 测试结果 |\n|----------|------|\n| V1.31.3  | ✅    |\n| V1.31.2  | ✅    |\n| V1.31.1  | ✅    |\n| V1.31.0  | ✅    |\n| V1.30.7  | ✅    |\n| V1.30.6  | 未测   |\n| V1.30.5  | 未测   |\n| V1.30.4  | 未测   |\n| V1.30.3  | 未测   |\n| V1.30.2  | 未测   |\n| V1.30.1  | 未测   |\n| V1.30.0  | 未测   |\n| V1.29.11 | 未测   |\n| V1.29.10 | 未测   |\n| V1.29.9  | 未测   |\n| V1.29.8  | 未测   |\n| V1.29.7  | 未测   |\n| V1.29.6  | 未测   |\n| V1.29.5  | 未测   |\n| V1.29.4  | 未测   |\n| V1.29.3  | 未测   |\n| V1.29.2  | 未测   |\n| V1.29.1  | 未测   |\n| V1.29.0  | ✅    |\n| V1.28.14 | 未测   |\n| V1.28.13 | 未测   |\n| V1.28.12 | 未测   |\n| V1.28.11 | 未测   |\n| V1.28.10 | 未测   |\n| V1.28.9  | 未测   |\n| V1.28.8  | 未测   |\n| V1.28.7  | 未测   |\n| V1.28.6  | 未测   |\n| v1.28.5  | 未测   |\n| V1.28.4  | 未测   |\n| V1.28.3  | 未测   |\n| V1.28.2  | 未测   |\n| V1.28.1  | 未测   |\n| V1.27.15 | 未测   |\n| V1.27.14 | 未测   |\n| v1.27.13 | 未测   |\n| V1.27.12 | 未测   |\n| V1.27.11 | 未测   |\n| v1.27.10 | 未测   |\n| V1.27.9  | 未测   |\n| V1.27.8  | 未测   |\n| V1.27.7  | 未测   |\n| V1.27.6  | 未测   |\n| V1.27.5  | 未测   |\n| V1.27.4  | 未测   |\n| V1.27.3  | 未测   |\n| V1.27.2  | 未测   |\n| V1.27.1  | 未测   |\n| V1.26.14 | 未测   |\n| V1.26.13 | 未测   |\n| V1.26.12 | 未测   |\n| v1.26.11 | 未测   |\n| v1.26.10 | 未测   |\n| V1.26.9  | 未测   |\n| V1.26.8  | 未测   |\n| V1.26.7  | 未测   |\n| V1.26.6  | 未测   |\n| V1.26.5  | 未测   |\n| V1.26.4  | 未测   |\n| V1.26.3  | 未测   |\n| V1.26.2  | 未测   |\n| V1.26.1  | 未测   |\n| V1.26.0  | 未测   |\n| V1.25.15 | 未测   |\n| v1.25.14 | 未测   |\n| V1.25.13 | 未测   |\n| V1.25.12 | 未测   |\n| V1.25.11 | 未测   |\n| V1.25.10 | 未测   |\n| V1.25.9  | 未测   |\n| V1.25.8  | 未测   |\n| V1.25.7  | ✅    |\n| v1.25.6  | 未测   |\n| V1.25.5  | 未测   |\n| V1.25.4  | 未测   |\n| V1.25.3  | 未测   |\n| V1.25.2  | 未测   |\n| V1.25.0  | 未测   |\n| V1.24.16 | 未测   |\n| V1.24.15 | 未测   |\n| V1.24.14 | 未测   |\n| V1.24.13 | 未测   |\n| V1.24.12 | 未测   |\n| v1.24.11 | 未测   |\n| v1.24.10 | 未测   |\n| V1.24.9  | 未测   |\n| V1.24.8  | 未测   |\n| V1.24.7  | ✅    |\n| V1.24.6  | 未测   |\n| V1.24.4  | 未测   |\n| V1.24.3  | 未测   |\n| V1.24.2  | 未测   |\n| v1.24.1  | 未测   |\n| V1.23.16 | 未测   |\n| V1.23.15 | 未测   |\n| V1.23.14 | 未测   |\n| V1.23.13 | 未测   |\n| V1.23.12 | 未测   |\n| V1.23.10 | 未测   |\n| V1.23.9  | 未测   |\n| V1.23.8  | 未测   |\n| V1.23.7  | ✅    |\n| V1.23.6  | 未测   |\n| V1.23.5  | 未测   |\n| V1.23.4  | 未测   |\n| V1.23.3  | 未测   |\n| v1.23.2  | 未测   |\n| V1.23.1  | 未测   |\n| V1.22.16 | 未测   |\n| v1.22.15 | 未测   |\n| V1.22.13 | 未测   |\n| V1.22.12 | 未测   |\n| V1.22.11 | 未测   |\n| V1.22.10 | 未测   |\n| V1.22.9  | 未测   |\n| V1.22.8  | 未测   |\n| v1.22.7  | 未测   |\n| V1.22.6  | 未测   |\n| v1.22.5  | 未测   |\n| V1.22.4  | 未测   |\n| V1.22.3  | ✅    |\n| V1.22.2  | ✅    |\n| V1.21.13 | 未测   |\n| V1.21.12 | 未测   |\n| V1.21.11 | 未测   |\n| V1.21.10 | 未测   |\n| V1.21.9  | 未测   |\n| V1.21.8  | 未测   |\n| V1.21.7  | 未测   |\n| V1.21.6  | 未测   |\n| V1.21.5  | 未测   |\n| V1.21.4  | 未测   |\n| V1.21.3  | 未测   |\n| V1.21.2  | 未测   |\n| V1.21.1  | 未测   |\n| V1.21.0  | ✅    |\n\n## 联系我\n微信（大罗马的太阳） 搜索ID：daluomadetaiyang,备注kom。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fweibaohui%2Fkom","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fweibaohui%2Fkom","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fweibaohui%2Fkom/lists"}