Как вывести список всех объектов kubernetes с определенной меткой, используя client-go - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу выполнить эквивалент

kubectl get all -l app=myapp -n mynamespace

или

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

, используя client-go

Я посмотрел на динамический пакет, но, похоже, ему нужен 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)

IТакже посмотрел на пакет времени выполнения, но не нашел ничего полезного.Я взглянул на то, как kubectl это реализовало, но пока не понял, слишком много уровней абстракций.

1 Ответ

0 голосов
/ 22 февраля 2019

Вы не можете перечислить «все объекты» одним вызовом.

К сожалению, способ создания API Kubernetes заключается в использовании групп API, в которых есть несколько API.

Поэтому вам необходимо:

  1. Запросить все группы API (apiGroup)
  2. Посетите каждую группу API, чтобы увидеть, какие API (kind) она предоставляет.
  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, и сценарий вокруг него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...