kubectl port-forward позволяет устанавливать прямой туннель между локальным компьютером и подом (или сервисом) внутри кластера Kubernetes. Это особенно полезно для отладки, тестирования или доступа к внутренним сервисам без открытия их через LoadBalancer или Ingress.
kubectl port-forward [ТИП_РЕСУРСА/ИМЯ_РЕСУРСА] [ЛОКАЛЬНЫЙ_ПОРТ]:ПОРТ_ПОДА
Примеры ресурсов:
pod/nginx-pod
service/nginx-svc
deployment/my-app
Обратите внимание:
port-forwardработает только с подами, даже если вы указываетеservice. Kubernetes автоматически выбирает один из подов, обслуживаемых сервисом.
Для практического ознакомления рассмотрим полный пример: создадим простой под с Nginx и сервис, затем подключимся к ним через port-forward.
Сохраните следующее в файл test-nginx.yaml:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 8080
targetPort: 80
type: ClusterIP
kubectl apply -f test-nginx.yaml
Проверьте статус:
kubectl get pods,svc
# Ожидаемый вывод:
# NAME READY STATUS RESTARTS AGE
# pod/nginx-pod 1/1 Running 0 1m
#
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# service/nginx-svc ClusterIP 10.96.45.212 <none> 8080/TCP 1m
kubectl port-forward pod/nginx-pod 8080:80
Теперь Nginx доступен локально по адресу http://localhost:8080.
Проверка:
curl http://localhost:8080
# → возвращает HTML-контент Nginx
kubectl port-forward service/nginx-svc 9000:8080
Локальный доступ: http://localhost:9000
Проверка:
curl http://localhost:9000
# → тоже возвращает HTML-контент Nginx
Если второй порт не указан, kubectl использует тот же локальный порт, что и порт сервиса или пода
kubectl port-forward service/nginx-svc 8080
Эта команда эквивалентна следующей:
kubectl port-forward service/nginx-svc 8080:8080
Для одновременного проброса нескольких портов:
kubectl port-forward pod/nginx-pod 8080:80 9090:80
Обратите внимание: в версиях v1.23+ поддерживается проброс нескольких портов за один вызов. Если под не принимает соединения на втором порту — команда завершится ошибкой.
Для того, чтобы автоматически выбрать свободный локальный порт можно воспользоваться следующей командой:
kubectl port-forward pod/nginx-pod :80
По умолчанию port-forward принимает соединения только по адресу 127.0.0.1. Чтобы сделать порт доступным в локальной сети:
kubectl port-forward --address 0.0.0.0 pod/nginx-pod 8080:80
⚠️ Осторожно: это может быть небезопасно — порт станет доступен всем в локальной сети.