如何使用Client-Go列出具有特定标签的所有kubernetes对象

时间:2019-02-13 16:47:11

标签: go kubernetes kubectl client-go

我想执行等价

kubectl get all -l app=myapp -n mynamespace

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

使用client-go

我查看了dynamic程序包,但似乎需要GroupVersionResource,这对于Service对象和Deployment对象来说是不同的。另外,当我通过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是如何实现的,有点还没有弄清楚,有太多抽象层次。

1 个答案:

答案 0 :(得分:2)

您无法一次调用列出“所有对象”。

不幸的是,Kubernetes API的构建方式是通过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中并在其周围编写脚本。