Как работает kubectl port-forward?

Команды kubectl expose могут использоваться для создания службы для приложений и назначения IP-адреса для доступа к нему из Интернета.

Насколько я понимаю, для доступа к любому приложению в кластере Kubernetes должен быть создан ресурс службы, который должен иметь IP-адрес, доступный из внешней сети.

Но в случае переадресации портов, как kubectl создает соединение с приложением без IP-адреса, доступного извне?

Ответ 1

kubectl port-forward делает определенный запрос API Kubernetes. Это означает, что системе, в которой она работает, требуется доступ к серверу API, и любой трафик будет туннелироваться через одно соединение HTTP.

Наличие этого действительно полезно для отладки (если один конкретный модуль работает, вы можете подключиться к нему напрямую; в микросервисной среде вы можете общаться с серверной службой, которую вы не представляете иначе), но это не альтернатива настройке объекты обслуживания. Когда я работал с kubectl port-forward это было заметно медленнее, чем подключение к модулю через службу, и я обнаружил, что команда просто останавливается через пару минут. Опять же, это не большие проблемы для отладки, но это не то, что я хотел бы для производственной системы.

Ответ 2

kubectl port-forward переадресует соединения с локального порта на порт на модуле. По сравнению с kubectl proxy kubectl port-forward является более общей, поскольку она может пересылать трафик TCP, тогда kubectl proxy может только пересылать трафик HTTP.

kubectl port-forward полезен для целей тестирования/отладки, поэтому вы можете получить доступ к своему сервису локально, не раскрывая его.

Ниже приведено имя pod и он перенаправит порт 6379 на localhost:6379.

kubectl port-forward redis-master-765d459796-258hz 6379:6379 

который так же, как

kubectl port-forward pods/redis-master-765d459796-258hz 6379:6379

или же

kubectl port-forward deployment/redis-master 6379:6379 

или же

kubectl port-forward rs/redis-master 6379:6379 

или же

kubectl port-forward svc/redis-master 6379:6379

Вот также небольшой пример переадресации портов для доступа к службе базы данных (clusterip) без ее предоставления.

Ответ 3

Если вы хотите перенаправить на другой порт в localhost. Попробуй это

kubectl port-forward <pod-name> <locahost-port>:<pod-port>
kubectl port-forward sample-pod-sadasds-sxawdd 8090:6379

Приведенная выше команда перенаправляет на локальный хост 8090 из стручка 6379