Введение
В этом практическом занятии (лабораторной работе) вы узнаете, как использовать команду Kubernetes port-forward для перенаправления локального порта на порт в поде (pod). Перенаправление портов является важным инструментом отладки, которое позволяет безопасно получать доступ к приложениям, запущенным в вашем кластере, не открывая их для доступа из интернета. Вы начнете с простых примеров и постепенно перейдете к более сложным сценариям, включая работу с несколькими портами, несколькими контейнерами и службами (services).
Запустите кластер Minikube
Перед созданием ресурсов вам нужен работающий кластер Kubernetes. Minikube - это легковесная среда Kubernetes, которая запускается на вашем локальном компьютере.
Перейдите в рабочую директорию:
Откройте терминал и перейдите в папку проекта по умолчанию:
cd /home/labex/projectЗапустите Minikube:
Запустите Minikube для инициализации кластера Kubernetes:
minikube start- Эта команда настраивает однодневный кластер Kubernetes на вашем локальном компьютере.
- В зависимости от производительности вашей системы Minikube может потребовать несколько минут для запуска.
Проверьте, что Minikube запущен:
Проверьте статус кластера Minikube:
minikube status- Найдите компоненты, такие как
kubeletиapiserver, перечисленные какRunning(работающие). - Если кластер не запущен, запустите команду
minikube startснова.
- Найдите компоненты, такие как
Если у вас возникли проблемы при запуске Minikube, используйте minikube delete для сброса среды при необходимости.
Изучите команду kubectl port-forward
Команда kubectl port-forward позволяет перенаправить один или несколько локальных портов на под (pod), развертывание (deployment) или службу (service) в вашем кластере Kubernetes. Она обычно используется для тестирования и отладки служб без их внешнего доступа.
Запустите следующую команду, чтобы просмотреть доступные параметры для kubectl port-forward:
kubectl port-forward -h
Вы увидите следующий вывод:
Перенаправить один или несколько локальных портов на под.
Используйте тип ресурса/имя, например, deployment/mydeployment, чтобы выбрать под. Если тип ресурса не указан, по умолчанию используется 'pod'.
Если есть несколько подов, соответствующих критериям, под будет выбран автоматически. Сеанс перенаправления завершается,
когда выбранный под завершает работу, и для возобновления перенаправления необходимо перезапустить команду.
Примеры:
## Прослушивать порты 5000 и 6000 локально, перенаправляя данные в/из портов 5000 и 6000 в поде
kubectl port-forward pod/mypod 5000 6000
## Прослушивать порты 5000 и 6000 локально, перенаправляя данные в/из портов 5000 и 6000 в поде, выбранном по развертыванию
kubectl port-forward deployment/mydeployment 5000 6000
## Прослушивать порт 8443 локально, перенаправляя на целевой порт (targetPort) порта службы с именем "https" в поде, выбранном по службе
kubectl port-forward service/myservice 8443:https
## Прослушивать порт 8888 локально, перенаправляя на порт 5000 в поде
kubectl port-forward pod/mypod 8888:5000
## Прослушивать порт 8888 на всех адресах, перенаправляя на порт 5000 в поде
kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000
## Прослушивать порт 8888 на локальном хосте и выбранном IP-адресе, перенаправляя на порт 5000 в поде
kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000
## Прослушивать случайный порт локально, перенаправляя на порт 5000 в поде
kubectl port-forward pod/mypod :5000
Перенаправление локального порта на под
На этом шаге вы узнаете, как перенаправить локальный порт на порт в поде (pod). Это полезно для отладки приложений или доступа к службам, которые не доступны за пределами кластера.
Примечание о работе с терминалом:
- Команда
kubectl port-forwardбудет работать в терминале и блокировать его для других операций. - Вам нужно будет открыть новое окно терминала, чтобы выполнять дополнительные команды, пока работает перенаправление портов.
- Чтобы остановить перенаправление портов в любое время, вы можете нажать
Ctrl+Cв терминале, где она запущена.
Сначала создайте развертывание (deployment) с одним репликой и контейнером Nginx:
kubectl create deployment nginx --image=nginx --replicas=1Эта команда создает развертывание, запускающее официальный образ контейнера Nginx.
Подождите, пока под будет готов к работе:
kubectl wait --for=condition=Ready pod -l app=nginxПолучите имя пода, которое будем использовать для перенаправления портов:
kubectl get pod -l app=nginxВы должны увидеть вывод, похожий на следующий:
NAME READY STATUS RESTARTS AGE nginx-66b6c48dd5-abcd1 1/1 Running 0 30sИспользуйте команду
kubectl port-forwardдля перенаправления локального порта на под:Сначала получите имя вашего пода:
export POD_NAME=$(kubectl get pods -l app=nginx -o jsonpath='{.items[0].metadata.name}') echo $POD_NAMEВы должны увидеть вывод, похожий на:
nginx-748c667d99-pdhzsТеперь используйте имя пода для настройки перенаправления портов:
kubectl port-forward $POD_NAME 19000:80Вы должны увидеть вывод, похожий на:
Forwarding from 127.0.0.1:19000 -> 80 Forwarding from [::1]:19000 -> 80Откройте новое окно терминала (поскольку перенаправление портов продолжает работать в текущем терминале) и проверьте перенаправление портов:
curl http://localhost:19000Вы должны увидеть HTML - содержимое приветственной страницы Nginx.
Вы также можете открыть веб - браузер и перейти по адресу
http://localhost:19000, чтобы увидеть отрендеренную страницу.
Перенаправление нескольких локальных портов на под
Перед началом этого шага вам нужно:
- Остановить перенаправление портов из Шага 1. Вернитесь в тот терминал и нажмите
Ctrl+C.
На этом шаге вы узнаете, как перенаправить несколько локальных портов на под. Мы перенаправим два разных локальных порта на один и тот же порт контейнера, что полезно, когда вы хотите предоставить разные точки доступа к одной и той же службе.
Используйте следующие команды для настройки перенаправления портов:
Сначала получите имя вашего пода, если вы еще этого не сделали:
export POD_NAME=$(kubectl get pods -l app=nginx -o jsonpath='{.items[0].metadata.name}') echo $POD_NAMEВы должны увидеть вывод, похожий на:
nginx-748c667d99-pdhzsТеперь настройте перенаправление портов, чтобы сопоставить два локальных порта (19080 и 19081) с портом 80 контейнера:
## Правильный формат: kubectl port-forward POD_NAME LOCAL_PORT:CONTAINER_PORT [LOCAL_PORT:CONTAINER_PORT...] kubectl port-forward pod/$POD_NAME 19080:80 19081:80Вы должны увидеть вывод, похожий на:
Forwarding from 127.0.0.1:19080 -> 80 Forwarding from [::1]:19080 -> 80 Forwarding from 127.0.0.1:19081 -> 80 Forwarding from [::1]:19081 -> 80Эта команда перенаправляет:
- Локальный порт 19080 на порт 80 контейнера
- Локальный порт 19081 на порт 80 контейнера
Оба локальных порта сопоставлены с одним и тем же портом 80 контейнера Nginx, что позволяет вам получить доступ к одному и тому же веб - серверу через разные локальные порты.
Проверьте перенаправление портов, проверив прослушиваемые порты:
ss -tulnp | grep 1908Вы должны увидеть вывод, похожий на следующий:
tcp LISTEN 0 4096 0.0.0.0:19080 0.0.0.0:* tcp LISTEN 0 4096 0.0.0.0:19081 0.0.0.0:*Теперь вы можете получить доступ к приветственной странице Nginx через любой из портов:
curl http://localhost:19080curl http://localhost:19081
Оба URL - адреса покажут одну и ту же приветственную страницу Nginx, так как они оба перенаправлены на один и тот же порт контейнера.
Перенаправление локального порта на под с несколькими контейнерами
Перед началом этого шага:
- Если у вас есть запущенные команды перенаправления портов из предыдущих шагов, перейдите в соответствующие терминалы и нажмите
Ctrl+C, чтобы остановить их. - Мы начнем с нуля, настроив новый под с несколькими контейнерами.
На этом шаге вы узнаете, как перенаправить локальный порт на определенный контейнер в поде с несколькими контейнерами. Это распространенный сценарий в архитектурах микросервисов, где используются sidecar - контейнеры.
Сначала очистим предыдущие ресурсы:
kubectl delete deployment nginxСоздадим под с двумя контейнерами: Nginx и BusyBox:
cat << EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: nginx-busybox labels: app: nginx-multi spec: containers: - name: nginx image: nginx ports: - containerPort: 80 - name: busybox image: busybox command: ['sh', '-c', 'while true; do sleep 3600; done'] EOFПодождем, пока под будет готов к работе:
kubectl wait --for=condition=Ready pod/nginx-busyboxПроверим, что оба контейнера запущены:
kubectl get pod nginx-busybox -o wideВ столбце
READYвы должны увидеть2/2.Используем команду
kubectl port-forwardдля перенаправления локального порта на контейнер Nginx:kubectl port-forward pod/nginx-busybox 19001:80В новом терминале проверим соединение:
curl http://localhost:19001Вы должны увидеть HTML - содержимое приветственной страницы Nginx.
Использование перенаправления портов с Kubernetes Services
Перед началом этого шага:
- Если у вас есть запущенная команда перенаправления портов из Шага 3, перейдите в соответствующий терминал и нажмите
Ctrl+C, чтобы остановить ее. - Имейте в виду, что на этом шаге мы создадим новое развертывание (deployment) и службу (service), но вам не нужно удалять предыдущий под (pod), так как он не будет мешать нашим новым ресурсам.
На этом шаге вы узнаете, как использовать команду kubectl port-forward с службами Kubernetes. Перенаправление портов на службу отличается от перенаправления на под, так как оно позволяет вам получить доступ к любому поду, на который указывает служба.
Сначала создайте новое развертывание с несколькими репликами:
kubectl create deployment nginx-service --image=nginx --replicas=3Подождите, пока все поды будут готовы:
kubectl wait --for=condition=Ready pod -l app=nginx-serviceСоздайте службу для развертывания:
kubectl expose deployment nginx-service --port=80 --type=ClusterIP --name=nginx-serviceПроверьте, что служба создана:
kubectl get service nginx-serviceВы должны увидеть вывод, похожий на:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service ClusterIP 10.96.123.456 <none> 80/TCP 10sИспользуйте команду
kubectl port-forwardдля перенаправления локального порта на службу:kubectl port-forward service/nginx-service 20000:80В новом терминале проверьте соединение:
curl http://localhost:20000Вы должны увидеть HTML - содержимое приветственной страницы Nginx. Попробуйте выполнить эту команду несколько раз - вы можете заметить, что ответы приходят от разных подов, скрывающихся за службой.
Резюме
В этом практическом занятии вы узнали, как эффективно использовать команду перенаправления портов Kubernetes в различных сценариях. Вы практиковали:
- Перенаправление одного локального порта на под.
- Перенаправление нескольких локальных портов на один и тот же порт контейнера.
- Работу с подами, содержащими несколько контейнеров, и перенаправлением портов.
- Перенаправление портов на службы Kubernetes.
Эти навыки являются важными для отладки и тестирования приложений в кластере Kubernetes. Перенаправление портов обеспечивает безопасный способ доступа к вашим приложениям во время разработки и устранения неполадок без их публикации в Интернете.
Основные выводы:
- Перенаправление портов представляет собой временное соединение, которое существует только до тех пор, пока выполняется команда
kubectl port-forward. - Вы можете перенаправить несколько локальных портов на один и тот же порт контейнера.
- Перенаправление портов работает как с подами, так и со службами.
- При перенаправлении портов на службу запросы могут быть распределены между несколькими подами.
Не забывайте, что перенаправление портов в первую очередь является инструментом отладки и не должно использоваться для доступа к приложениям в производственной среде. В производственных сценариях вы должны использовать соответствующие типы служб Kubernetes (LoadBalancer, NodePort) или контроллеры Ingress.


