Как вывести список всех объектов kubernetes с определенной меткой, используя 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
Я посмотрел на динамический пакет, но, похоже, это нужно 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
Реализовать это, но пока не понял, слишком много уровней абстракций.
3 ответа
Вы не можете перечислить "все объекты" одним вызовом.
К сожалению, способ создания API Kubernetes - через группы API, в которых есть несколько API.
Так что вам нужно:
- Запросить все группы API (
apiGroup
) - Посетите каждую группу API, чтобы увидеть, какие API (
kind
) это разоблачает. - На самом деле запрос, который
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
и сценарий вокруг него.
Я думаю, вы ищете что-то вроде этого:
objectsToList := []schema.GroupVersionKind{
schema.GroupVersionKind{
Group: "apps",
Kind: "DeploymentList",
Version: "v1",
},
}
for _, o := range objectsToList {
// Using an unstructured object.
u := &unstructured.UnstructuredList{}
u.SetGroupVersionKind(schema.GroupVersionKind{
Group: o.Group,
Kind: o.Kind,
Version: o.Version,
})
err := c.List(context.Background(), u)
if err != nil {
log.Fatal("cannot List Objects")
}
}
Вы можете перечислить все объекты с помощью:
kubectl get all
Чтобы перечислить объекты, соответствующие определенной метке, используйте:
kubectl get all --selector key=value
где «ключ» — это имя метки, а «значение» — значение, которое вы пытаетесь сопоставить.
Чтобы перечислить все объекты в пространстве имен, используйте:
kubectl get all --namespace "NAMESPACE"