Рейтинг:0

Double port forwarding kubernetes + docker

флаг au

Summary:

I have a docker container which is running kubectl port-forward, forwarding the port (5432) of a postgres service running as a k8s service to a local port (2223). In the Dockerfile, I have exposed the relevant port 2223. Then I ran the container by publishing the said port (-p 2223:2223)

Now when I am trying to access the postgres through psql -h localhost -p 2223, I am getting the following error:

psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.

However, when I do docker exec -ti to the said container and run the above psql command, I am able to connect to postgres.

Dockerfile CMD:

EXPOSE 2223
CMD ["bash", "-c", "kubectl -n namespace_test port-forward service/postgres-11-2 2223:5432"]

Docker Run command:

docker run -it --name=k8s-conn-12 -p 2223:2223 my_image_name:latest

Output of the docker run command:

Forwarding from 127.0.0.1:2223 -> 5432

So the port forwarding is successful, and I am able to connect to the postgres instance from inside the docker container. What I am not able to do is to connect from outside the container with the exposed and published port

Рейтинг:2
флаг in

Я думаю, что есть два возможных решения, которые могут помочь в вашем случае:

  1. Вы можете добавить --адрес аргумент в пользу kubectl перенаправление портов команду с IP-адресом контейнера, выполняющего эту команду. По умолчанию, кубектл привязывается только к локальному хосту и поэтому не работает так, как вы ожидаете (см.: Справочная документация по Kubectl).
  2. Все вновь запущенные контейнеры подключаются к контейнеру по умолчанию. мост сети, если не указано иное. Для решения вашей проблемы вы можете использовать хозяин сети вместо мост сеть. Как можно найти в Сеть хоста Docker документация:

Если вы используете сетевой режим хоста для контейнера, сетевой стек этого контейнера не изолирован от хоста Docker (контейнер разделяет сетевое пространство имен хоста), и контейнеру не выделяется собственный IP-адрес. .

Я кратко опишу оба решения, чтобы показать вам, как они работают.


Сначала я подготовил постгрес:

# kubectl получить pod,svc
ИМЯ ГОТОВ СТАТУС ПЕРЕЗАПУСКА ВОЗРАСТ
pod/postgres 1/1 Бег 0 155м

НАЗВАНИЕ ТИП КЛАСТЕР-IP ВНЕШНИЙ-IP ПОРТ(Ы) ВОЗРАСТ
service/postgres ClusterIP 10.110.151.73 <нет> 5432/TCP 2s

Объявление 1.

Этот подход очень похож на ваш, я просто добавил --адрес аргумент:
ПРИМЕЧАНИЕ: Я использовал контейнер с кубектл уже установлено. Я просто хочу, чтобы вы обратили внимание на kubectl port-forward --address $(hostname -i),localhost service/postgres 2223:5432 команда.

root@kworker:~# docker run -it --name=k8s-conn-12 -p 2223:2223 -v /config:/config mattjcontainerregistry/forward:latest bash
root@31b05af956ab:/# kubectl port-forward --address $(hostname -i),localhost service/postgres 2223:5432 --kubeconfig=config
Пересылка с 127.0.0.1:2223 -> 5432
Пересылка с 172.17.0.2:2223 -> 5432

На другой вкладке терминала мы можем проверить, работает ли он:

root@kworker:~# docker exec -it k8s-conn-12 bash
root@31b05af956ab:/# psql -U postgres -h localhost -p 2223
psql (12.7 (Ubuntu 12.7-0ubuntu0.20.04.1), сервер 13.3 (Debian 13.3-1.pgdg100+1))
ВНИМАНИЕ: основная версия psql 12, основная версия сервера 13.
         Некоторые функции psql могут не работать.
Введите "помощь" для помощи.

постгрес=# 

Кроме того, мы можем сделать то же самое с хост-компьютера (из-за пределов контейнера с открытым и опубликованным портом):

root@kworker:~# psql -U postgres -h localhost -p 2223
psql (11.12 (Debian 11.12-0+deb10u1), сервер 13.3 (Debian 13.3-1.pgdg100+1))
ВНИМАНИЕ: основная версия psql 11, основная версия сервера 13.
         Некоторые функции psql могут не работать.
Введите "помощь" для помощи.

постгрес=# 

Объявление 2.

Этот подход требует использования хозяин сеть:

хост: для автономных контейнеров удалите сетевую изоляцию между контейнером и хостом Docker и используйте сеть хоста напрямую.

ПРИМЕЧАНИЕ: Я просто хочу, чтобы вы обратили внимание на --сеть=хост вариант (я использовал тот же контейнер, что и раньше):

root@kworker:~# docker run -it --name=k8s-conn-12 --network=host -v /config:/config mattjcontainerregistry/forward:latest bash
root@kworker:/# служба переадресации портов kubectl/postgres 2223:5432 --kubeconfig=config
Пересылка с 127.0.0.1:2223 -> 5432
Пересылка с [::1]:2223 -> 5432

Опять же, мы можем проверить, работает ли он должным образом снаружи контейнера:

root@kworker:~# psql -U postgres -h localhost -p 2223
psql (11.12 (Debian 11.12-0+deb10u1), сервер 13.3 (Debian 13.3-1.pgdg100+1))
ВНИМАНИЕ: основная версия psql 11, основная версия сервера 13.
         Некоторые функции psql могут не работать.
Введите "помощь" для помощи.

постгрес=# 

Кроме того, стоит подумать, действительно ли вам нужен док-контейнер для переадресации портов. Возможно работает kubectl перенаправление портов в фоновом режиме было бы лучше (см.: Выполнить переадресацию портов kubectl в фоновом режиме).

Chayan Ghosh avatar
флаг au
Большое спасибо @matt_i, особенно за объяснение. Работал как шарм.

Ответить или комментировать

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