select * from pod?用SQL查k8s资源?

190 阅读2分钟

Kom - 高效便捷的 Kubernetes 资源查询工具

Kubernetes 提供了丰富的 API 和资源类型,但随着资源种类的增加,如何快速、简洁地查询和筛选所需资源变得尤为重要。kom 今天新增了使用SQL查询k8s资源的功能。

SQL功能主要特点

  • 支持所有资源类型
    Kom 支持查询 Kubernetes 集群内注册的所有资源类型,包括内置的资源(如 Pod、Deployment、Service 等)和自定义资源(CRD)。无论是 Kubernetes 内置资源还是自定义 CRD,您都可以通过 SQL 查询快速访问。

  • 灵活的查询条件
    使用 SQL 查询时,支持常见的查询操作符,如 =, !=, >=, <=, <>, like, in, not in, and, or, between,方便用户根据需要进行筛选。

  • 简洁高效
    只需要通过一个 SQL 语句,就可以完成对 Kubernetes 资源的查询操作。并且查询字段默认支持 *,返回所有资源字段。

  • 支持排序
    您可以通过指定排序字段,对查询结果进行排序。默认按创建时间倒序排列,方便查看最新的资源状态。

使用示例

    // 查询kube-system、default命名空间下的pod,并按创建时间倒排。
    sql := "select * from pod where `metadata.namespace`='kube-system' or `metadata.namespace`='default' order by  `metadata.creationTimestamp` desc   "

	var list []v1.Pod
	err := kom.DefaultCluster().Sql(sql).List(&list).Error
	for _, d := range list {
		fmt.Printf("List Items foreach %s,%s at %s \n", d.GetNamespace(), d.GetName(), d.GetCreationTimestamp())
	}

在这里插入图片描述

查询 Kubernetes 内置资源

sql := "select * from pod where `metadata.namespace`='kube-system' or `metadata.namespace`='default' order by `metadata.creationTimestamp` asc"

var list []v1.Pod
err := kom.DefaultCluster().Sql(sql).List(&list).Error
for _, d := range list {
    fmt.Printf("List Items foreach %s,%s at %s \n", d.GetNamespace(), d.GetName(), d.GetCreationTimestamp())
}

在上述代码中,我们使用 SQL 语句查询了 pod 资源,筛选出了 kube-systemdefault 命名空间中的 Pod,并按创建时间升序排列。

查询 CRD 资源

sql := "select * from vm where (`metadata.namespace`='kube-system' or `metadata.namespace`='default')"

var list []unstructured.Unstructured
err := kom.DefaultCluster().Sql(sql).List(&list).Error
for _, d := range list {
    fmt.Printf("List Items foreach %s,%s\n", d.GetNamespace(), d.GetName())
}

在这个示例中,查询了 kubevirt 的自定义资源 vm,可以快速筛选出特定命名空间的资源信息。

如何开始

  1. 将 Kom 集成到您的项目中,可以通过 GitHub 获取源代码并根据文档进行配置。

  2. 根据需要编写 SQL 查询语句,灵活筛选和排序 Kubernetes 资源。

  3. 使用 Sql() 方法与集群交互,获取查询结果。

安装

import (
    "github.com/weibaohui/kom"
    "github.com/weibaohui/kom/callbacks"
)
func main() {
    // 注册回调,务必先注册
    callbacks.RegisterInit()
    // 注册集群
	defaultKubeConfig := os.Getenv("KUBECONFIG")
	if defaultKubeConfig == "" {
		defaultKubeConfig = filepath.Join(homedir.HomeDir(), ".kube", "config")
	}
	_, _ = kom.Clusters().RegisterInCluster()
	_, _ = kom.Clusters().RegisterByPathWithID(defaultKubeConfig, "default")
	kom.Clusters().Show()
	// 其他逻辑
}

使用

    sql := "select * from deploy where `metadata.namespace`='kube-system' or `metadata.namespace`='default' order by  `metadata.creationTimestamp` asc   "

	var list []v1.Deployment
	err := kom.DefaultCluster().Sql(sql).List(&list).Error
	for _, d := range list {
		fmt.Printf("List Items foreach %s,%s at %s \n", d.GetNamespace(), d.GetName(), d.GetCreationTimestamp())
	}

总结

使用sql查询k8s有没有感觉非常简单?