Kubernetes: настройка kubectl для работы с несколькими кластерами
Для большинства людей знакомство с Kubernetes заканчивается на установке единственного кластера и настройке kubectl по умолчанию. Но что если возникает необходимость управлять несколькими кластерами? В этой статье я решил рассказать об использовании kubectl с различными контекстами.
В большинстве случаев нет однозначного ответа на вопрос «Как настроить kubectl для использования с несколькими кластерами?». В первую очередь это зависит от того, настроили ли вы кластер на использование сертификатов или нет. Далее я буду предполагать, что настроили, т.к. такая настройка кластера является наилучшей практикой.
kubectl обычно записывает свой конфигурационный файл в директорию .kube в вашей домашней директории. Когда вы установите его для первого кластера, файл конфигурации будет выглядеть примерно так:
apiVersion: v1
clusters:
- cluster:
certificate-authority: /path/to/ca.pem
server: https://default-master.domain
name: default-cluster
contexts:
- context:
cluster: default-cluster
user: default-admin
name: default-system
current-context: default-system
kind: Config
preferences: {}
users:
- name: default-admin
user:
client-certificate: /path/to/admin.pem
client-key: /path/to/admin-key.pem
Поэтому, как только у нас появляется второй кластера, например, для клиента образно называемый «customer-cluster», нам нужно добавить в кластер следующую запись:
- cluster:
certificate-authority: /path/to/customer/ca.pem
server: https://customer-master.domain
name: customer-cluster
Эта настройка именует кластер и указывает kubectl на CA сертификат и URL-адрес его сервера API.
Затем контекст:
- context:
cluster: customer-cluster
user: customer-admin
name: customer-cluster
Контекст связывает кластер и пользователя для доступа к кластеру. kubectl будет использовать этот контекст для доступ к нему. Наконец, секция пользователя для этого кластера:
- name: customer-admin
user:
client-certificate: /path/to/customer/admin.pem
client-key: /path/to/customer/admin-key.pem
Здесь мы указываем путь к сертификату и ключу для этого пользователя. Таким образом, весь файл будет выглядеть следующим образом:
apiVersion: v1
clusters:
- cluster:
certificate-authority: /path/to/ca.pem
server: https://default-master.domain
name: default-cluster
- cluster:
certificate-authority: /path/to/customer/ca.pem
server: https://customer-master.domain
name: customer-cluster
contexts:
- context:
cluster: default-cluster
user: default-admin
name: default-system
- context:
cluster: customer-cluster
user: customer-admin
name: customer-cluster
current-context: default-system
kind: Config
preferences: {}
users:
- name: default-admin
user:
client-certificate: /path/to/admin.pem
client-key: /path/to/admin-key.pem
- name: customer-admin
user:
client-certificate: /path/to/customer/admin.pem
client-key: /path/to/customer/admin-key.pem
Теперь при использовании kubectl, вы можете использовать —context для указания того, какой кластер вам нужен. Вам не нужно использовать —contextпри использовании кластера по умолчанию.
Например, команда:
kubectl --context customer-cluster get nodes
Возвращает узлы в кластере клиента, авторизуясь на сервере API с помощью сертификата пользователя и ключа customer-admin. Вы можете установить контекст, используя команду:
kubectl config use-context customer-cluster
Теперь команда
kubectl get nodes
Покажет узлы кластера клиента, а не узлы предыдущего кластера по умолчанию. Чтобы вернуться обратно к настройкам по умолчанию, выполните команду:
kubectl config use-context default-system
Чтобы узнать, в каком контексте вы сейчас работаете, выполните команду:
kubectl config current-context
Не смотря на удобство использования контекста по умолчанию, я рекомендую всегда использовать явное указание контекста при помощи —context в ваших командах kubectl, т.к. очень легко забыть, в каком контексте вы находитесь, и если у вас несколько кластеров, случайно создать или что еще хуже удалить объекты в неправильном кластере.