Skip to main content
Glama
lua_inspection_script.md7.57 kB
# Lua 脚本与 `lua_kubectl` 用法说明 本项目支持通过 Lua 脚本对 Kubernetes 资源进行灵活检测和操作。`lua_kubectl` 提供了丰富的链式方法,便于在 Lua 脚本中以声明式方式查询、筛选、获取和文档化 K8s 资源。 ## 一、如何编写 Lua 检测脚本 1. **入口对象**: - 脚本中通过 `kubectl` 对象进行所有操作。 - 支持链式调用,便于组合多种查询条件。 2. **基本流程**: - 通过 `GVK` 指定资源类型。 - 可选地设置命名空间、名称、标签选择器等。 - 调用 `List` 或 `Get` 获取资源。 - 可用 `Doc` 获取字段文档说明。 - 可用 `GetLogs` 获取 Pod 日志内容。 ### 示例脚本 ```lua -- 查询所有 default 命名空间下的 Deployment 资源 local deployments, err = kubectl:GVK("apps", "v1", "Deployment"):Namespace("default"):List() if err then print("查询出错:", err) else for i, d in ipairs(deployments) do print(d.metadata.name) end end -- 获取指定名称的 Pod local pod, err = kubectl:GVK("", "v1", "Pod"):Namespace("kube-system"):Name("coredns-xxxx"):Get() if err then print("获取出错:", err) else print(pod.metadata) end -- 获取指定 Deployment 的副本数文档 local doc, err = kubectl:GVK("apps", "v1", "Deployment"):Cache(10):Doc("spec.replicas") if err then print( "获取 Deployment Doc 失败".. tostring(err)) return end print("Deployment Doc 获取成功: " .. doc) -- 查询所有命名空间下带有特定标签的 Service local svcs, err = kubectl:GVK("", "v1", "Service"):AllNamespace():WithLabelSelector("app=nginx"):List() -- 检查所有命名空间下 data 和 binaryData 都为空的 ConfigMap local configmaps, err = kubectl:GVK("", "v1", "ConfigMap"):AllNamespace():List() if err then print("获取 ConfigMap 失败" .. tostring(err)) return end for _, cm in ipairs(configmaps) do local cmName = cm.metadata.name local cmNamespace = cm.metadata.namespace local isEmpty = true if cm.data then for k, v in pairs(cm.data) do isEmpty = false break end end if isEmpty and cm.binaryData then for k, v in pairs(cm.binaryData) do isEmpty = false break end end if isEmpty then check_event("失败", "[空数据] ConfigMap " .. cmNamespace .. "/" .. cmName .. " 的 data 和 binaryData 字段都为空", {namespace=cmNamespace, name=cmName}) end end print("ConfigMap 空数据检测完成") ``` ## 二、可用方法与说明 ### 1. `GVK(group, version, kind)` - 说明:指定资源的 Group、Version、Kind。 - 返回:新的 kubectl 实例。 - 示例:`kubectl:GVK("apps", "v1", "Deployment")` ### 2. `Namespace(ns)` - 说明:设置命名空间。 - 示例:`:Namespace("default")` ### 3. `Name(name)` - 说明:设置资源名称。 - 示例:`:Name("my-deploy")` ### 4. `WithLabelSelector(selector)` - 说明:设置标签选择器,筛选资源。 - 示例:`:WithLabelSelector("app=nginx")` ### 5. `AllNamespace()` - 说明:查询所有命名空间下的资源。 - 示例:`:AllNamespace()` ### 6. `Cache(seconds)` - 说明:设置缓存时间,单位为秒。适合频繁查询场景。 - 示例:`:Cache(30)` ### 7. `List()` - 说明:获取资源列表。 - 返回:Lua 表(数组),每个元素为资源对象。 - 示例:`:List()` ### 8. `Get()` - 说明:获取单个资源。 - 返回:Lua 表(对象)。 - 示例:`:Get()` ### 9. `Doc(fieldPath)` - 说明:获取指定字段的文档说明。 - 参数:如 `"spec.replicas"`。 - 返回:Lua 表(文档内容)。 - 示例:`:Doc("spec.replicas")` ### 10. `GetLogs(options?)` - 说明:获取 Pod 的日志内容。仅适用于 Pod 资源。 - 参数:可选的选项表,支持以下字段: - `tailLines` (number):获取最近的行数,如 `200`。 - `container` (string):指定容器名称,如 `"app"`。如不指定,默认获取第一个容器的日志。 - 返回:日志文本字符串和错误信息。 - 示例: ```lua -- 获取 Pod 最近 100 行日志 local logs, err = kubectl:GVK("", "v1", "Pod"):Namespace("default"):Name("mypod"):GetLogs({tailLines=100}) -- 获取指定容器的日志 local logs, err = kubectl:GVK("", "v1", "Pod"):Namespace("default"):Name("mypod"):GetLogs({tailLines=200, container="app"}) -- 处理日志内容 if err then print("获取日志失败:", err) else print("日志内容:", logs) -- 检查日志中是否包含错误关键字 if string.find(logs, "ERROR") then check_event("失败", "Pod 日志包含错误信息", {namespace="default", name="mypod"}) end end ``` ### 11. `check_event(status, msg, extra?)` - 说明:用于在 Lua 检测脚本中上报结构化检测事件,便于巡检系统收集、展示和统计异常或告警信息。 - 参数: - `status` (string):事件状态,通常为 `失败`(失败)。 - `msg` (string):事件描述信息。 - `extra` (table,可选):附加信息表,支持自定义字段,常用如 `name`(资源名)、`namespace`(命名空间)等。 - 返回:无返回值。 - 示例: ```lua -- 检查某资源副本数是否异常 if deploy.spec.replicas ~= deploy.status.replicas then check_event("失败", "副本数不一致", {name=deploy.metadata.name, namespace=deploy.metadata.namespace}) end ``` - 典型用法: - 在检测逻辑中发现失败等情况时调用。 - 支持多次调用,所有事件会被系统收集并展示在巡检报告中。 ## 三、错误处理 所有方法调用返回值均为 `(结果, 错误信息)`,如无错误则错误信息为 `nil`。 ## 四、进阶用法 - 方法可链式组合,顺序不限。 - 支持自定义缓存、标签、命名空间等多条件组合。 - 适合用于自定义资源检测、合规性校验、批量查询等场景。 ## 五、AI Prompt:让大模型帮你生成检测规则 如果你不会编写 Lua 检测脚本,可以通过向大模型(如 ChatGPT、Copilot、通义千问等)提问,自动生成所需的规则脚本。你可以参考以下 Prompt 模板: **通用 Prompt 模板:** 请帮我用 Lua 语言,基于如下链式 API,编写一个 Kubernetes 资源检测脚本: -- 入口对象为 kubectl,支持 GVK、Namespace、AllNamespace、WithLabelSelector、List、Get、Doc、GetLogs、check_event 等方法。 -- 目标:检测所有命名空间下副本数不一致的 Deployment,正常情况下应该是deployment.spec.replicas == deployment.status.replicas。 要求: 1、返回完整 Lua 代码。 2、检测到异常时,必须调用 check_event("失败", "描述信息", {name=资源名, namespace=命名空间})这样的方法。 如果你需要检测特定资源的副本数一致性 以下是你可以参考示例脚本(Deployment 副本数一致性检测脚本): ```lua local deployments, err = kubectl:GVK("apps", "v1", "Deployment"):Cache(360):AllNamespace():List() if err then print("获取 Deployment 失败" .. tostring(err)) return end for _, deploy in ipairs(deployments) do local specReplicas = deploy.spec and deploy.spec.replicas or 1 local statusReplicas = deploy.status and deploy.status.replicas or 0 if specReplicas ~= statusReplicas then check_event("失败", "副本数不一致", {name=deploy.metadata.name, namespace=deploy.metadata.namespace}) end end print("Deployment 副本数一致性检测完成") ```

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/weibaohui/k8m'

If you have feedback or need assistance with the MCP directory API, please join our Discord server