Kubernetes — это платформа для оркестровки контейнеров, которая позволяет запускать и управлять контейнеризированными приложениями. Иногда необходимо провести отладку или протестировать приложение локально, но при этом не безопасно открывать его внешнему миру. В этом случае на помощь приходит команда kubectl port-forward
. Она позволяет перенаправлять трафик с вашего локального компьютера на под, в котором находится контейнеризированное приложение.
Перевели гайд о том, как использовать kubectl port-forward
для перенаправления сетевого трафика с нашего локального компьютера на под с веб-сервером nginx.
![](https://habrastorage.org/getpro/habr/upload_files/d8c/1cd/31a/d8c1cd31a829995b623173c2300afdf9.png)
Что такое kubectl-port-forward и почему мы должны использовать его в Kubernetes
kubectl port-forward
— это команда, которая создаёт защищённый туннель между вашим локальным компьютером и подом, который работает в кластере Kubernetes. Это позволяет получить доступ к приложению, которое выполняется в поде, как если бы оно выполнялось локально на вашем компьютере.
Как работает переадресация портов в Kubernetes
Вот как работает переадресация портов в Kubernetes:
Выполнение команды: вы выполняете команду
kubectl port-forward
, указывая целевой под, локальный порт и целевой порт.Настройка сетевого соединения: между вашим локальным компьютером и целевым подом устанавливается сетевое соединение с помощью API-сервера Kubernetes.
Переадресация сетевого трафика: как только сетевое соединение установлено, любой запрос, сделанный с локального компьютера, переадресовывается на целевой под. Аналогично, любой ответ от приложения, которое работает внутри пода, переадресовывается обратно на ваш локальный компьютер. Это позволяет вам взаимодействовать с приложением и диагностировать любые возникающие проблемы.
Синтаксис команды kubectl port-forward
Синтаксис команды kubectl port-forward следующий:
kubectl port-forward POD_NAME LOCAL_PORT:REMOTE_POD_PORT
Разберём компоненты этой команды:
kubectl
— это инструмент командной строки, который используется для взаимодействия с кластерами Kubernetes.port-forward
— это действие, которое мы хотим выполнить с помощью «kubectl».POD_NAME
— это имя пода, к которому мы хотим переадресовать трафик.LOCAL_PORT
— это номер порта на локальном компьютере, который мы хотим использовать для установления соединения.REMOTE_POD_PORT
— это номер порта на поде, к которому мы хотим подключиться.
Чтобы выполнить пример из этой статьи, вам понадобится доступ к работающему кластеру Kubernetes с уже установленным kubectl. Если вы предпочитаете настраивать свой собственный кластер Kubernetes, вы можете использовать такой инструмент, как minikube.
Настройка переадресации портов с помощью kubectl
В примере ниже мы рассмотрим процесс настройки переадресации портов всего за два шага.
Шаг 1. Создайте развёртывание
Откройте окно терминала и выполните следующую команду, чтобы создать развёртывание mynginx в вашем кластере. Nginx — это популярный открытый веб-сервер.
kubectl create deployment mynginx --image=nginx
Здесь mynginx
— это имя развёртывания. Вы можете выбрать любое имя, --image=nginx
— это имя образа Docker, который используется для создания контейнера.
После выполнения команды вы должны увидеть вывод, похожий на этот:
![Источник Источник](https://habrastorage.org/getpro/habr/upload_files/1bd/938/212/1bd938212f02eeae93f38a5e86038d34.png)
Затем проверьте, что развертывание было успешно создано с помощью команды kubectl get deployments
.
![Источник Источник](https://habrastorage.org/getpro/habr/upload_files/091/87e/83b/09187e83b596303eed6e332cfe7fc45b.png)
Мы видим, что развёртывание с именем mynginx
успешно запущено. Теперь давайте убедимся, что под тоже работает. Для этого выполните следующую команду:
kubectl get pods
Эта команда предоставит вам информацию обо всех подах, которые в данный момент запущены в вашем кластере, включая их имена, состояние и другие полезные детали. Найдите под с именем, начинающимся с mynginx
, и убедитесь, что он находится в состоянии Running.
Приведенный ниже вывод показывает, что под mynginx-ff886775c-zdrfc
успешно запущен. Обратите внимание, что имя вашего пода будет отличаться от нашего. Это связано с тем, что Kubernetes создает имя пода путем добавления уникальных символов к имени развертывания.
![Источник Источник](https://habrastorage.org/getpro/habr/upload_files/2fb/724/545/2fb7245455274777f6c392c0adb5fd7c.png)
Шаг 2. Перенаправьте локальный порт на порт в поде
Теперь, когда наш веб-сервер nginx запущен и работает внутри пода, нам нужно найти способ получить к нему доступ с нашего локального компьютера.
Замените часть <INSERT_POD_NAME>
в приведённой ниже команде на имя вашего пода, затем выполните её, чтобы создать маршрут между вашим локальным компьютером и подом:
kubectl port-forward <INSERT_POD_NAME> 8080:80
После выполнения команды вы увидите вывод, похожий на следующий.
![Источник Источник](https://habrastorage.org/getpro/habr/upload_files/2a2/b98/b8a/2a2b98b8a013da412accf64b291c6116.png)
Пока сеанс терминала запущен, откройте веб-браузер и перейдите по адресу http://localhost:8080, чтобы получить доступ к серверу nginx, работающему внутри пода. Вы должны увидеть страницу по умолчанию «Welcome to nginx!». Это указывает на то, что локальный запрос перенаправляется на под.
![Источник Источник](https://habrastorage.org/getpro/habr/upload_files/437/8e0/89a/4378e089a3b83e5928f01a02a01be26c.png)
Поздравляем! Перенаправление портов работает так, как ожидалось.
Помните, что сеанс терминала, в котором выполняется команда kubectl port-forward, должен оставаться открытым, чтобы перенаправление портов продолжало работать. Если вы закроете сеанс терминала, соединение между вашим локальным компьютером и подом, будет потеряно и вы больше не сможете получить доступ к веб-серверу. Если вы хотите продолжить работу с кластером Kubernetes, вам следует открыть другое окно терминала.
В чём разница между kubectl port-forward и nodeport?
Команда kubectl port-forward
позволяет перенаправлять сетевой трафик с локального порта на вашем компьютере на порт в поде Kubernetes. Идея состоит в том, чтобы сделать приложение доступным только вам (пользователю kubectl), а не внешнему миру.
Также важно понимать, что kubectl port-forward
обычно используется для тестирования и отладки. Это не готовая к работе в производственной среде функция.
NodePort
— это тип сервиса Kubernetes. Это способ сделать приложение доступным для внешних клиентов за пределами кластера Kubernetes.
Когда вы создаёте сервис NodePort, Kubernetes открывает порт на каждом рабочем узле в кластере. Затем эти порты могут быть использованы внешними клиентами для доступа к приложению.
В чём разница между kubectl-proxy и kubectl port-forward?
Kubectl-proxy
создаёт прокси-сервер между вашим локальным компьютером и сервером API Kubernetes. Это означает, что все запросы, сделанные клиентом к серверу API Kubernetes, перенаправляются через прокси.
Основное назначение kubectl proxy
— доступ к серверу API Kubernetes.
С другой стороны, команда kubectl port-forward
создаёт туннель с локального порта на вашем компьютере на целевой порт в поде. Это особенно полезно, когда вы хотите получить прямой доступ к определённому поду, например, при отладке приложения.
Вкратце, kubectl proxy
больше подходит для общего доступа к кластеру, а kubectl port-forward
лучше подходит для нацеливания на определённые поды.
Примечание: Сервер API Kubernetes — это веб-сервер, который предоставляет API Kubernetes. Он используют внешние клиенты для связи с кластером. Например, вы могли бы использовать API Kubernetes, чтобы получить список всех запущенных подов в кластере.
Заключение
В этой статье мы узнали, как использовать команду kubectl port-forward
для перенаправления сетевого трафика с нашего локального компьютера на определённый под в кластере Kubernetes. Мы увидели, как легко настроить перенаправление портов всего за несколько шагов, и как это может быть ценным инструментом для локальной разработки и тестирования Kubernetes.
Если вы хотите узнать больше о практиках DevOps, расширить стек технологий и систематизировать свои знания, приходите в Слёрм на курс DevOps Upgrade. Это пятимесячный курс, который позволяет на практике научиться решать наиболее распространённые задачи DevOps-инженера и познакомиться с популярными инструментами: Ansible, Docker, Kubernetes, Grafana & Prometheus, Terraform.
Подробнее о курсе можно узнать на нашем сайте.