Руководство по управлению несколькими кластерами Kubernetes с помощью kubectl config

Управляйте несколькими кластерами Kubernetes с помощью контекстов kubectl, файлов kubeconfig, пространств имен и более безопасных команд переключения.

Руководство по управлению несколькими кластерами Kubernetes с помощью kubectl config

Управление несколькими кластерами Kubernetes — обычная практика, когда у вас есть среда разработки, стейджинга, продакшена или кластеры в нескольких облаках. Риск прост: одна команда может попасть не в тот кластер, если ваш контекст неясен.

Это руководство покажет вам, как использовать kubectl config для просмотра контекстов, переключения кластеров, установки пространств имен и организации нескольких файлов kubeconfig.

Понимание файла Kubeconfig

Прежде чем углубляться в команды kubectl config, важно понять файл kubeconfig. Этот файл хранит информацию о ваших кластерах, пользователях и контекстах, которые их связывают. kubectl использует этот файл для аутентификации и указания, с каким кластером взаимодействовать. По умолчанию kubectl ищет файл kubeconfig по пути $HOME/.kube/config.

В этом файле вы найдете три основных раздела:

  • clusters: Определяет кластеры Kubernetes, включая конечные точки API-сервера и центры сертификации.
  • users: Хранит учетные данные для аутентификации, такие как клиентские сертификаты и токены.
  • contexts: Связывает кластер, пользователя и, опционально, пространство имен. Контекст предоставляет удобный способ группировки этих конфигураций, позволяя kubectl легко переключаться между различными комбинациями кластеров и пользователей.

Управление контекстами с помощью kubectl config

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

Просмотр доступных контекстов

Чтобы увидеть все контексты, доступные в вашем текущем файле kubeconfig, используйте следующую команду:

kubectl config get-contexts

Эта команда выведет список контекстов вместе с кластером, пользователем и пространством имен, связанными с каждым из них. Текущий активный контекст будет отмечен звездочкой (*).

Пример вывода:

CURRENT   NAME                 CLUSTER              AUTHINFO       NAMESPACE
*         my-dev-context       my-dev-cluster       dev-user       default
          my-prod-context      my-prod-cluster      prod-user      production
          staging-context      staging-cluster      staging-user   staging

Получение текущего контекста

Чтобы быстро проверить, какой контекст вы используете в данный момент, выполните:

kubectl config current-context

Это выведет имя активного контекста.

Переключение контекстов

Переключение на другой контекст выполняется просто. Используйте подкоманду use-context, за которой следует имя контекста, который вы хотите активировать:

kubectl config use-context <имя-контекста>

Например, чтобы переключиться на my-prod-context из примера выше:

kubectl config use-context my-prod-context

После выполнения этой команды последующие команды kubectl будут направлены в кластер, указанный в my-prod-context.

Установка контекста

Вы также можете установить определенный контекст для кластера и пользователя, не делая его по умолчанию для будущего использования. Это полезно для временных операций.

kubectl config set-context <имя-контекста> --cluster=<имя-кластера> --user=<имя-пользователя> --namespace=<имя-пространства-имен>

Если опустить --namespace, будет использоваться пространство имен по умолчанию для кластера.

Управление кластерами и пользователями

Хотя контексты используются для переключения, вы также можете напрямую управлять конфигурациями кластеров и пользователей, на которые ссылаются контексты.

Просмотр информации о кластере

Чтобы вывести список всех настроенных кластеров:

kubectl config get-clusters

Чтобы просмотреть детали конкретного кластера:

kubectl config view --minify -o jsonpath='{.clusters[?(@.name=="<имя-кластера>")].cluster}'

Замените <имя-кластера> на фактическое имя вашего кластера.

Просмотр информации о пользователе

Чтобы вывести список всех настроенных пользователей:

kubectl config get-users

Добавление и изменение конфигураций

Вы можете добавлять новые кластеры, пользователей и контексты или изменять существующие:

  • Добавить новый кластер:
    kubectl config set-cluster <имя-кластера> --server=<url-api-сервера> --certificate-authority=<путь-к-файлу-ca> --embed-certs=true
    
  • Добавить нового пользователя:
    kubectl config set-credentials <имя-пользователя> --client-certificate=<путь-к-файлу-сертификата> --client-key=<путь-к-файлу-ключа> --embed-certs=true
    
  • Добавить новый контекст:
    kubectl config set-context <имя-контекста> --cluster=<имя-кластера> --user=<имя-пользователя> --namespace=<имя-пространства-имен>
    

Управление несколькими файлами Kubeconfig

Для повышения безопасности и организации, особенно при работе с большим количеством кластеров или конфиденциальными учетными данными, рекомендуется хранить файлы kubeconfig отдельно. kubectl может управлять несколькими файлами kubeconfig с помощью переменной окружения KUBECONFIG или флага --kubeconfig.

Использование переменной окружения KUBECONFIG

Вы можете указать список файлов kubeconfig для загрузки. kubectl объединяет эти файлы. Если одно и то же имя кластера, пользователя или контекста встречается в нескольких файлах, приоритет слияния зависит от порядка файлов в KUBECONFIG, поэтому используйте уникальные имена, чтобы избежать неожиданностей.

Чтобы установить эту переменную для текущего сеанса оболочки:

export KUBECONFIG=~/.kube/config:~/.kube/config-dev:~/.kube/config-prod

Чтобы сделать это постоянным, добавьте строку export в файл профиля вашей оболочки (например, ~/.bashrc, ~/.zshrc).

Использование флага --kubeconfig

В качестве альтернативы вы можете указать конкретный файл kubeconfig для одной команды kubectl:

kubectl --kubeconfig=~/.kube/config-dev get pods

Это полезно для разовых команд или когда вы хотите быть абсолютно уверены, какой файл используется.

Лучшие практики для управления несколькими кластерами

  • Используйте отдельные файлы: Храните конфигурации для разных сред (dev, staging, prod) или облачных провайдеров в отдельных файлах kubeconfig (например, config-dev, config-staging, config-prod).
  • Используйте KUBECONFIG: Установите переменную окружения KUBECONFIG в профиле вашей оболочки, чтобы легко объединять и управлять несколькими файлами без ручного слияния.
  • Описательные имена контекстов: Используйте четкие и описательные имена для ваших контекстов (например, aws-prod-us-east-1, gke-dev-eu-west-2), чтобы избежать путаницы.
  • Осознание пространства имен: Всегда помните о пространстве имен, в котором вы работаете. Используйте флаг --namespace или установите его в контексте, чтобы нацелиться на правильное пространство имен.
  • Регулярный аудит: Периодически проверяйте свои контексты и конфигурации кластеров, чтобы убедиться, что они актуальны и безопасны.
  • Защитите свой Kubeconfig: Относитесь к файлам kubeconfig как к конфиденциальным учетным данным. Ограничьте права доступа к файлам и избегайте их добавления в систему контроля версий.

Заключение

Сделайте проверку контекста частью вашего рабочего процесса. Выполняйте kubectl config current-context перед рискованными командами, используйте описательные имена контекстов, намеренно устанавливайте пространства имен и держите учетные данные продакшена вне обычных сеансов оболочки, когда они не нужны.