Puncte:0

Double port forwarding kubernetes + docker

drapel 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

Puncte:2
drapel in

Cred că există două soluții posibile care te pot ajuta în cazul tău:

  1. Puteți adăuga --abordare argument la kubectl port-forward comanda cu adresa IP a containerului care rulează această comandă. În mod implicit, kubectl se leagă numai la localhost și, prin urmare, nu funcționează așa cum vă așteptați (vezi: Documente de referință Kubectl).
  2. Toate containerele nou-pornite se conectează la o valoare implicită pod rețea, dacă nu se specifică altfel. Pentru a vă rezolva problema, puteți utiliza gazdă reţea în loc de pod reţea. După cum se poate găsi în Rețea gazdă Docker documentație:

Dacă utilizați modul de rețea gazdă pentru un container, stiva de rețea a containerului respectiv nu este izolată de gazda Docker (containerul partajează spațiul de nume de rețea al gazdei), iar containerul nu primește propria sa adresă IP alocată. .

Voi descrie pe scurt ambele soluții pentru a vă arăta cum funcționează.


În primul rând, m-am pregătit postgres:

# kubectl get pod,svc
STAREA NUMELE GATA REINCEPE VARSTA
pod/postgres 1/1 Alergare 0 155m

NUME TIP CLUSTER-IP EXTERN-IP PORT(E) Vârsta
service/postgres ClusterIP 10.110.151.73 <niciunul> 5432/TCP 2s

Anunțul 1.

Această abordare este foarte asemănătoare cu a ta, tocmai am adăugat --abordare argument:
NOTĂ: Am folosit un recipient cu kubectl deja instalat. Vreau doar să fii atent la kubectl port-forward --address $(hostname -i), localhost service/postgres 2223:5432 comanda.

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
Redirecționare de la 127.0.0.1:2223 -> 5432
Redirecționare de la 172.17.0.2:2223 -> 5432

Din altă filă de terminal putem verifica dacă funcționează:

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), server 13.3 (Debian 13.3-1.pgdg100+1))
AVERTISMENT: psql major versiunea 12, server major versiunea 13.
         Este posibil ca unele caracteristici psql să nu funcționeze.
Tastați „ajutor” pentru ajutor.

postgres=# 

În plus, putem face același lucru de la mașina gazdă (din exteriorul containerului cu portul expus și publicat):

root@kworker:~# psql -U postgres -h localhost -p 2223
psql (11.12 (Debian 11.12-0+deb10u1), server 13.3 (Debian 13.3-1.pgdg100+1))
AVERTISMENT: psql major versiunea 11, server major versiunea 13.
         Este posibil ca unele caracteristici psql să nu funcționeze.
Tastați „ajutor” pentru ajutor.

postgres=# 

Anunțul 2.

Această abordare necesită utilizarea a gazdă reţea:

gazdă: pentru containerele autonome, eliminați izolarea rețelei dintre container și gazda Docker și utilizați direct rețeaua gazdei.

NOTĂ: Vreau doar să fii atent la --network=gazdă opțiune (am folosit același recipient ca înainte):

root@kworker:~# docker run -it --name=k8s-conn-12 --network=host -v /config:/config mattjcontainerregistry/forward:latest bash
root@kworker:/# kubectl port-forward service/postgres 2223:5432 --kubeconfig=config
Redirecționare de la 127.0.0.1:2223 -> 5432
Redirecționare de la [::1]:2223 -> 5432

Din nou, putem verifica dacă funcționează conform așteptărilor din afara containerului:

root@kworker:~# psql -U postgres -h localhost -p 2223
psql (11.12 (Debian 11.12-0+deb10u1), server 13.3 (Debian 13.3-1.pgdg100+1))
AVERTISMENT: psql major versiunea 11, server major versiunea 13.
         Este posibil ca unele caracteristici psql să nu funcționeze.
Tastați „ajutor” pentru ajutor.

postgres=# 

În plus, merită să vă gândiți dacă aveți într-adevăr nevoie de un container docker pentru redirecționarea portului. Poate alergând kubectl port-forward în fundal ar fi mai bine (vezi: Efectuați kubectl port-forward în fundal).

Chayan Ghosh avatar
drapel au
Mulțumesc mult @matt_i în special pentru explicație. A mers perfect.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.