【问题标题】:How to list all kubernetes objects with specific label using client-go如何使用 client-go 列出所有具有特定标签的 kubernetes 对象
【发布时间】:2019-07-07 14:14:16
【问题描述】:

我想执行相当于

kubectl get all -l app=myapp -n mynamespace

kubectl label all -l version=1.2.0,app=myapp track=stable --overwrite

使用客户端去

我查看了dynamic 包,但它似乎需要GroupVersionResource,这对于服务对象和部署对象来说是不同的。此外,当我通过 schema.GroupVersionResource{Group: "apps", Version: "v1"} 时,它什么也找不到,当我通过 schema.GroupVersionResource{Version: "v1"} 时,它只找到命名空间对象并且也不查找标签,尽管我提供了标签选项:

resource := schema.GroupVersionResource{Version: "v1"}
listOptions := metav1.ListOptions{LabelSelector: fmt.Sprintf("app=%s", AppName), FieldSelector: ""}
res, listErr := dynamicClient.Resource(resource).Namespace("myapps").List(listOptions)

我也查看了运行时包,但没有发现任何有用的东西。看了一下kubectl是怎么实现这个的,有点还没搞明白,抽象层次太多了。

【问题讨论】:

    标签: go kubernetes kubectl client-go


    【解决方案1】:

    您不能一次调用列出“所有对象”。

    不幸的是,Kubernetes API 的架构方式是通过 API 组,它们下有多个 API。

    所以你需要:

    1. 查询所有 API 组 (apiGroup)
    2. 访问每个 API 组以查看它公开了哪些 API (kind)。
    3. 实际上查询kind 以获取所有对象(这里您实际上可以使用标签过滤列表查询)。

    幸运的是,kubectl api-versionskubectl api-resources 命令可以做到这些。

    所以要了解 kubectl 如何找到所有“种类”的 API 资源,请运行:

    kubectl api-resources -v=6
    

    你会看到 kubectl 发出如下调用:

    • GET https://IP/api
    • GET https://IP/apis
    • 然后它访问每个 api 组:
      • GET https://IP/apis/metrics.k8s.io/v1beta1
      • GET https://IP/apis/storage.k8s.io/v1
      • ...

    因此,如果您尝试使用 client-go 克隆此行为,则应该使用相同的 API 调用,或者最好只编写一个脚本,将其发送到 kubectl api-resources -o=json 并围绕它编写脚本。

    【讨论】:

      猜你喜欢
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 2016-01-04
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多