Score: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

Score:2
ธง in

ฉันคิดว่ามีวิธีแก้ไขที่เป็นไปได้สองวิธีที่อาจช่วยในกรณีของคุณ:

  1. คุณสามารถเพิ่ม --ที่อยู่ อาร์กิวเมนต์เพื่อ kubectl พอร์ตไปข้างหน้า คำสั่งพร้อมที่อยู่ IP ของคอนเทนเนอร์ที่เรียกใช้คำสั่งนี้ โดยค่าเริ่มต้น, คูเบก ผูกเฉพาะกับ localhost ดังนั้นจึงไม่ทำงานตามที่คุณคาดหวัง (ดู: เอกสารอ้างอิง Kubectl).
  2. คอนเทนเนอร์ที่เริ่มต้นใหม่ทั้งหมดเชื่อมต่อกับค่าเริ่มต้น สะพาน เครือข่ายเว้นแต่จะระบุไว้เป็นอย่างอื่น เพื่อแก้ปัญหาของคุณ คุณสามารถใช้ เจ้าภาพ เครือข่ายแทนการ สะพาน เครือข่าย ดังจะพบได้ใน เครือข่ายโฮสต์นักเทียบท่า เอกสาร:

หากคุณใช้โหมดเครือข่ายโฮสต์สำหรับคอนเทนเนอร์ สแต็กเครือข่ายของคอนเทนเนอร์นั้นจะไม่ถูกแยกออกจากโฮสต์ Docker (คอนเทนเนอร์ใช้เนมสเปซเครือข่ายของโฮสต์ร่วมกัน) และคอนเทนเนอร์ไม่ได้รับการจัดสรรที่อยู่ IP ของตัวเอง .

ฉันจะอธิบายวิธีแก้ปัญหาทั้งสองอย่างสั้น ๆ เพื่อแสดงให้คุณเห็นว่ามันทำงานอย่างไร


ก่อนอื่นฉันเตรียม โพสต์เกรส:

# kubectl รับพ็อด svc
ชื่อ พร้อม สถานะ เริ่มอายุใหม่
pod/postgres 1/1 วิ่ง 0 155ม

ประเภทชื่อ CLUSTER-IP EXTERNAL-IP PORT(S) อายุ
บริการ/postgres ClusterIP 10.110.151.73 <ไม่มี> 5432/TCP 2 วินาที

โฆษณา 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:~# นักเทียบท่า 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 port-forward ในพื้นหลัง).

Chayan Ghosh avatar
au flag
ขอบคุณมาก @matt_i โดยเฉพาะอย่างยิ่งสำหรับคำอธิบาย ทำงานเหมือนจับใจ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา