Как я могу получить список всех пространств имен в определенном кластере Kubernetes, используя Kubernetes API?

#kubernetes #namespaces #cluster-computing

#kubernetes #пространства имен #кластерные вычисления

Вопрос:

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

Одним из вариантов является использование функции list_namespace(), как описано в https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/CoreV1Api.md

Однако этот API не позволяет мне указывать кластер. Он выбирает кластер из текущего контекста в моем конфигурационном файле .kube. Если я удалю или переименую файл конфигурации, вызов API завершится с ошибкой.

Я также нашел API расширений по адресу https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/ExtensionsV1beta1Api.md

К сожалению, там нет API для получения списка пространств имен. Есть ли какой-то другой API, о котором я не знаю?

Ответ №1:

Если вы видите исходный код модуля kube_config, вы можете использовать разные аргументы с помощью метода load_kube_config для выбора вашего кластера:

 def load_kube_config(config_file=None, context=None,
                     client_configuration=None,
                     persist_config=True):
    """Loads authentication and cluster information from kube-config file
    and stores them in kubernetes.client.configuration.
    :param config_file: Name of the kube-config file.
    :param context: set the active context. If is set to None, current_context
        from config file will be used.
    :param client_configuration: The kubernetes.client.Configuration to
        set configs to.
    :param persist_config: If True, config file will be updated when changed
        (e.g GCP token refresh).
    """
 

Если я правильно понял код, вы можете сделать что-то вроде следующего:

 from kubernetes import client, config
for file in files:
    config.load_kube_config(config_file=file)
    v1 = client.CoreV1Api()
    response = v1.list_namespace()
    print(response)
 

РЕДАКТИРОВАТЬ: это пример, который использует аргумент контекста с одним файлом kubeconfig для перебора нескольких кластеров. В документах kubernetes есть запись о слиянии файлов kubeconfig. По сути, после наличия файла конфигурации с несколькими контекстами вы можете загрузить файл config.load_kube_config(config_file=file) и загрузить контексты с помощью client.load_kube_config(context="context2')

P.S. Вам не нужно использовать config.load_kube_config(), если вы хотите использовать конфигурационный файл по пути по умолчанию (‘~/.kube/config’) или если вы задаете путь в переменной среды KUBECONFIG.

Комментарии:

1. Виктор, это в основном то, что я сейчас делаю. Я предпочитаю обрабатывать это через API вместо использования файлов, но у меня это работает нормально. Спасибо.

2. Одним из способов быстрого изменения контекста с помощью kubectl является использование переменной окружения KUBECONFIG. К сожалению, в API Kubernetes есть проблема , из-за которой он не принимает более одного контекста в этой переменной.

Ответ №2:

Не могли бы вы проверить этот пример
Там вы можете перемещаться между несколькими контекстами и перечислять все модули во всех пространствах имен

По-видимому, вам просто нужно заменить

 list_pod_for_all_namespaces()
 

с помощью

 list_namespace()
 

Комментарии:

1. Я использовал list_namespace(), и в нем перечислены все пространства имен с кластером, но для указания кластера требуется конфигурационный файл .kube. Поскольку мне нужно получить пространства имен из нескольких кластеров, я использую решение Виктора Вэла с несколькими конфигурационными файлами.