Кластер Kubernetes можно использовать без публичных IP-адресов на мастер-нодах. Это повышает безопасность кластера, поскольку ноды недоступны напрямую из интернета. Для управления таким кластером можно использовать bastion-хост — облачный сервер с публичным IP, подключенный к приватной сети кластера.
Вы подключаетесь к bastion-хосту по SSH и управляете кластером с помощью kubectl. Запросы к API кластера идут по приватной сети, поэтому открывать API в интернет для такого подключения не требуется.
Подготовка
В качестве bastion-хоста можно использовать облачный сервер. Для выполнения команд kubectl при небольшом количестве одновременных SSH-сеансов достаточно минимальной конфигурации. Серверу нужен публичный IP, чтобы вы могли подключаться к нему из интернета.
Кластер и bastion-хост должны находиться в одной приватной сети. Это позволит bastion-хосту обращаться к API кластера по приватному адресу, без выхода в интернет.
Выбор сети зависит от того, создан ли уже кластер:
-
Если кластер уже создан, используйте его приватную сеть. При создании bastion-хоста выберите ту же локацию и подключите сервер к этой сети.
-
Если вы создаете инфраструктуру с нуля, сначала создайте приватную сеть, затем выберите ее при создании bastion-хоста и на этапе настройки сети нового кластера.
Например, в сети 192.168.0.0/24 bastion-хост может иметь приватный IP 192.168.0.10, а API кластера — адрес 192.168.0.20. Bastion будет обращаться к API по этому адресу. Важно выбрать именно одну и ту же приватную сеть: размещения сервера и кластера в одной локации недостаточно.
Создание приватной сети и bastion-хоста описаны в отдельной статье. Создавать дополнительный внутренний сервер из этой инструкции для работы с Kubernetes не нужно.
Перед подключением также убедитесь, что:
-
у вас настроен SSH-доступ к bastion-хосту;
-
на bastion-хосте установлен kubectl;
-
скачайте kubeconfig нужного кластера. Скачать файл можно во вкладке «Дашборд» в панели управления кластером.
В примерах файл kubeconfig находится по пути ~/Downloads/kubeconfig.yaml. Замените путь на свой.
Проверьте адрес API в kubeconfig. На локальном компьютере выполните:
grep server ~/Downloads/kubeconfig.yaml
В поле server должен быть указан приватный IP API кластера, например https://192.168.0.20:6443.
Перенос kubeconfig на bastion-хост
-
Подключитесь к bastion-хосту с локального компьютера:
ssh user@public_IP
-
На bastion-хосте создайте каталог для конфигурации и установите для него права:
mkdir -p ~/.kube
chmod 700 ~/.kube
-
Оставьте SSH-сессию открытой. В другом окне терминала на локальном компьютере скопируйте
kubeconfigна сервер:
scp ~/Downloads/kubeconfig.yaml user@public_IP:~/.kube/timeweb-cluster.yaml
Используйте того же пользователя, под которым создали каталог. Конфигурация будет сохранена в файл ~/.kube/timeweb-cluster.yaml в его домашнем каталоге.
-
Вернитесь в окно с SSH-сессией, переименуйте файл в
configи выдайте права на чтение и запись только его владельцу:
mv -i ~/.kube/timeweb-cluster.yaml ~/.kube/config
chmod 600 ~/.kube/config
Файл ~/.kube/config используется kubectl по умолчанию, поэтому указывать путь к нему в командах не потребуется. Если такой файл уже существует, mv -i запросит подтверждение замены. Сохраните существующую конфигурацию под другим именем, если она вам нужна.
kubeconfigсодержит учетные данные для доступа к кластеру. Файл из панели управления дает административные права. Если с кластером работают несколько человек, настройте персональный доступ и используйте отдельные учетные записи на bastion-хосте.
Проверка подключения
На bastion-хосте в том же SSH-сеансе выполните:
kubectl get nodes
Если команда вернула список нод, подключение настроено. Дальнейшие команды kubectl выполняйте в этом же SSH-сеансе.
Если команда завершается по тайм-ауту, проверьте приватную сеть и адрес API в поле server. Если на bastion-хосте ограничен исходящий трафик, разрешите исходящее TCP-соединение к приватному IP API на порт 6443. При ошибке Unauthorized убедитесь, что используется kubeconfig нужного кластера с действительными учетными данными.