6

我想执行相当于

kubectl get all -l app=myapp -n mynamespace

或者

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

使用客户端

我查看了动态包,但它似乎需要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实现这个,有点还没弄明白,抽象层次太多了。

4

1 回答 1

8

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

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

所以你需要:

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

幸运的是,kubectl api-versions命令kubectl 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然后编写脚本并围绕它编写脚本。

于 2019-02-21T21:15:11.543 回答