DevOps

Kubectl Port Forwarding

Как получить доступ к удаленному приложению Kubernetes с помощью Kubectl Port Forwarding

Нужно отладить приложение, работающее в вашем кластере Kubernetes? Переадресация портов — это способ подключения к модулям, которые не являются общедоступными. Вы можете использовать этот метод для проверки баз данных, инструментов мониторинга и других приложений, которые вы хотите развернуть внутри без общедоступного маршрута.

Перенаправление портов встроено в Kubectl. CLI может запускать сеансы туннелирования, которые перенаправляют трафик через локальные порты на модули в вашем кластере Kubernetes. В статье рассказывается как это настроить.

Как работает переадресация портов

Переадресация портов — это своего рода правило преобразования сетевых адресов (NAT), которое направляет трафик из одной сети в другую. В контексте Kubernetes запросы, которые кажутся завершенными localhost перенаправляются во внутреннюю сеть вашего кластера.

Переадресация портов работает только на уровне порта. Вы направляете определенный порт, например 33060 к целевому порту, такому как 3306 в сети назначения. Когда вы отправляете трафик на свой локальный порт 33060он будет автоматически переадресован на порт 3306 в дальнем конце.

Этот метод позволяет получить доступ к частным рабочим нагрузкам Kubernetes, которые не раскрываются через NodePort, Ingress или LoadBalancer. Вы можете направлять локальный трафик прямо в свой кластер, избавляя от необходимости создавать службы Kubernetes для своих внутренних рабочих нагрузок. Это уменьшает поверхность атаки.

Развертывание примера приложения

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

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

Создайте файл YAML для вашего развертывания:

версия API: приложения / v1
вид: развертывание
метаданных:
  имя: mysql
спецификация:
  селектор:
    matchLabels:
      приложение: mysql
  шаблон:
    метаданных:
      этикетки:
        приложение: mysql
    спецификация:
      контейнеры:
      - изображение: MySQL: 8.0
        имя: mysql
        окр:
        - название: MYSQL_ROOT_PASSWORD
          ценностное : mysql

Обязательно измените значение MYSQL_ROOT_PASSWORD переменную среды перед использованием этого манифеста в рабочей среде. Бежать kubectl apply чтобы создать развертывание MySQL:

$ kubectl apply -f mysql.yaml deployment.apps/mysql 
# создан

Затем используйте get pods команда, чтобы убедиться, что рабочая нагрузка успешно запущена:

$ kubectl get pods

ИМЯ ГОТОВ СТАТУС ПЕРЕЗАПУСКА ВОЗРАСТ
mysql-5f54dd5789-t5fzc 1/1 Выполняется 0 2с

Используйте Kubectl для переадресации порта в Kubernetes

Хотя MySQL теперь работает внутри вашего кластера, у вас нет доступа к нему извне. Затем настройте сеанс переадресации портов, чтобы вы могли использовать локальные установки таких инструментов, как mysql CLI для подключения к вашей базе данных.

Вот простой пример:

$ kubectl port-forward deployment/mysql 33060:3306 
# Переадресация с 127.0.0.1:33060 -> 3306 Пересылка с [::1]:33060 -> 3306

Соединения с портом 33060 будут направлены на порт 3306 относительно модуля, на котором запущено развертывание MySQL. Теперь вы можете запустить сеанс оболочки MySQL, нацеленный на вашу базу данных в Kubernetes:

$ mysql --host 127.0.0.1 --port 33060 -u root -p 
# Введите пароль:
# Добро пожаловать в монитор MySQL. Команды заканчиваются; золото г. Ваш
# идентификатор подключения к MySQL — 10. Версия сервера: 8.0.29 Сервер
# сообщества MySQL — GPL.

Сохраняйте окно оболочки, которое запускает kubectl port-forward open на время сеанса отладки. Переадресация портов будет завершена, когда вы нажмете Ctrl+C или закроете окно.

Изменение локальных и удаленных номеров портов

Синтаксис привязки номера порта: local:remote, 33060:3306 приведенный выше пример сопоставляет порт 33060 с localhost à 3306 в целевом контейнере.

Указание одного номера без двоеточия будет интерпретировать его как локальный и удаленный порт:

$ kubectl развертывание с переадресацией портов/mysql 3306

Вместо этого вы можете оставить локальный порт пустым, чтобы автоматически назначить случайный порт:

$ kubectl port-forward deployment/mysql:3306 
# Переадресация с 127.0.0.1:34923 -> 3306 Пересылка с [::1]:34923 -> 3306

Здесь вы должны использовать случайно сгенерированный номер порта 34923 с вашим локальным клиентом MySQL.

Изменение адреса прослушивания

Kubectl связывает локальный порт на 127.0.0.1 (IPv4) и ::1 (IPv6) по умолчанию. Вместо этого вы можете указать свой собственный набор IP-адресов, предоставив --address флаг, когда вы запускаете port-forward упорядоченный:

# Слушаем два адреса IPv4 
$ kubectl port-forward deployment/mysql:3306 --address 127.0.0.1,192.168.0.1

Флаг принимает только IP-адреса и localhost ключевое слово. Последняя интерпретируется как включающая 127.0.0.1 et ::1соответствующие значениям команды по умолчанию, когда --address опущен.