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