我想执行等价
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
是如何实现的,有点还没有弄清楚,有太多抽象层次。
答案 0 :(得分:2)
您无法一次调用列出“所有对象”。
不幸的是,Kubernetes API的构建方式是通过API组进行的,这些API组下具有多个API。
所以您需要:
apiGroup
)kind
)。kind
以获取所有对象(这里您实际上可以使用标签过滤列表查询)。幸运的是,kubectl api-versions
和kubectl api-resources
命令可以完成这些操作。
要了解kubectl如何查找所有“种类”的API资源,请运行:
kubectl api-resources -v=6
您将看到kubectl拨打电话,例如:
GET https://IP/api
GET https://IP/apis
GET https://IP/apis/metrics.k8s.io/v1beta1
GET https://IP/apis/storage.k8s.io/v1
因此,如果您尝试使用client-go克隆此行为,则应使用相同的API调用,或者最好只编写一个脚本,将其封装到kubectl api-resources -o=json
中并在其周围编写脚本。