Как вывести список всех объектов 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.

Так что вам нужно:

  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 и сценарий вокруг него.

Я думаю, вы ищете что-то вроде этого:

      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"
Другие вопросы по тегам