#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. Поскольку мне нужно получить пространства имен из нескольких кластеров, я использую решение Виктора Вэла с несколькими конфигурационными файлами.