Поиск по сайту:

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


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

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

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

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

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

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

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

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

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

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:8.0
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: mysql

Убедитесь, что вы изменили значение переменной среды MYSQL_ROOT_PASSWORD, прежде чем использовать этот манифест в рабочей среде. Запустите kubectl apply, чтобы создать развертывание MySQL:

$ kubectl apply -f mysql.yaml
deployment.apps/mysql created

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

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
mysql-5f54dd5789-t5fzc   1/1     Running   0          2s

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

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

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

$ kubectl port-forward deployment/mysql 33060:3306
Forwarding from 127.0.0.1:33060 -> 3306
Forwarding from [::1]:33060 -> 3306

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

$ mysql --host 127.0.0.1 --port 33060 -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.29 MySQL Community Server - GPL

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

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

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

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

$ kubectl port-forward deployment/mysql 3306

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

$ kubectl port-forward deployment/mysql :3306
Forwarding from 127.0.0.1:34923 -> 3306
Forwarding from [::1]:34923 -> 3306

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

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

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

# Listen on two IPv4 addresses
$ kubectl port-forward deployment/mysql :3306 --address 127.0.0.1,192.168.0.1

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

Краткое содержание

Переадресация портов — полезный метод для доступа к частным приложениям внутри вашего кластера Kubernetes. Kubectl туннелирует трафик из вашей локальной сети на определенный порт в конкретном поде. Это относительно низкоуровневый механизм, который может обрабатывать любое соединение TCP. Перенаправление портов UDP пока не поддерживается.

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




Все права защищены. © Linux-Console.net • 2019-2024