นี่คือการติดตามผล คำถามก่อนหน้านี้ที่ฉันถามแต่ด้วยการถาม/แนวทางที่ต่างออกไป ในกรณีที่เป็นเรื่องสำคัญ ฉันใช้ GKE แต่ฉันหวังว่าจะมีคำตอบที่ไม่เชื่อเรื่องพระเจ้าในระบบคลาวด์
ฉันกำลังพยายามเรียกใช้คอนเทนเนอร์ แฟกทอรีโอทูลส์/Factorio
แต่แอปพลิเคชันมีข้อกำหนดเฉพาะบางประการเนื่องจากการใช้ฟังก์ชันการแสดงรายการเซิร์ฟเวอร์สาธารณะเฉพาะแอปพลิเคชัน ดังที่เห็นในวิดีโอเกมจำนวนมากที่ใช้เซิร์ฟเวอร์ที่โฮสต์โดยผู้ใช้
จนถึงตอนนี้ ฉันสามารถทำงานกับเครือข่ายโฮสต์และการเชื่อมต่อโดยตรงเพื่อทำงานกับบริการ NodePort ได้อย่างไรก็ตาม ฟังก์ชันแสดงรายการเซิร์ฟเวอร์สาธารณะของแอปพลิเคชันยังคงเป็นปัญหาสำหรับคอนเทนเนอร์ที่ไม่มีสิทธิพิเศษ
นี่คือวิธีที่ Factorio กำหนดวิธีการจัดการรายชื่อเซิร์ฟเวอร์สาธารณะ:
- คอนเทนเนอร์รับฟังในซ็อกเก็ตเดียว เช่น UDP Port 34197
- บริการ NodePort กำหนดเส้นทางการรับส่งข้อมูลไปยัง 20635 แบบสาธารณะ
- คอนเทนเนอร์ส่ง ping ผ่านพอร์ตการฟัง (34197) ไปยังเซิร์ฟเวอร์ ping-pong และเซิร์ฟเวอร์ ping-pong ตอบกลับด้วยที่อยู่ IP และพอร์ตที่ได้รับ ping จาก นอก k8s นี่ยังคงเป็นพอร์ต 34197
- จากนั้นคอนเทนเนอร์จะใช้ข้อมูลนี้เพื่อลงทะเบียนกับรายชื่อเซิร์ฟเวอร์ ที่อยู่ IP พอร์ต ชื่อเซิร์ฟเวอร์ และข้อมูลอื่นๆ
- ใน GKE ปิงปองจะถูกส่งไปยังพอร์ตที่ไม่ได้ใช้งานโดยพลการ (เช่น 40792)
- คอนเทนเนอร์เชื่อว่ากำลังฟังพอร์ตอื่นที่ไม่ใช่พอร์ตที่ฉันตั้งค่าไว้ (20534) จากนั้นลงทะเบียนกับเซิร์ฟเวอร์สาธารณะที่แสดงรายการโดยใช้พอร์ตที่ไม่ถูกต้อง (40792 เนื่องจากเซิร์ฟเวอร์ปิงปองพูดเช่นนั้น)
- ความพยายามใดๆ ในการเชื่อมต่อจากรายชื่อเซิร์ฟเวอร์สาธารณะจะล้มเหลว ลูกค้าเชื่อว่าเซิร์ฟเวอร์กำลังฟังพอร์ตที่เซิร์ฟเวอร์ปิงปองพบเห็น (40792) แต่คอนเทนเนอร์โต้ตอบกับพอร์ตรับฟัง (34197) ตลอดเวลา
(ฉันได้รับแจ้งว่ากระบวนการนี้เป็นรูปแบบของการทำงานของ ICE/STUN)
นั่นหมายความว่าหากคอนเทนเนอร์รับฟัง 34197 แต่ Kubernetes กำหนดเส้นทางนั้นไปยัง 20635 จากภายนอก การรับส่งข้อมูลทั้งขาเข้าและขาออกจำเป็นต้องผ่าน 20635 ทางฝั่งสาธารณะเพื่อให้ฟังก์ชันการแสดงรายการเซิร์ฟเวอร์ในตัวของแอปพลิเคชันทำงานได้
ถ้าฉันข้ามรายการเซิร์ฟเวอร์สาธารณะและเชื่อมต่อโดยตรงกับที่อยู่ IP สาธารณะของโหนดของคอนเทนเนอร์ด้วยพอร์ต 20635 มันจะทำงานได้อย่างไร้ที่ติ แต่นั่นเป็นการประนีประนอมที่ค่อนข้างใหญ่สำหรับสิ่งที่ฉันกำลังทำอยู่
เครือข่ายโฮสต์ข้ามปัญหาทั้งหมดนี้โดยอนุญาตให้คอนเทนเนอร์เปิดพอร์ตใดก็ได้ที่ต้องการบนโฮสต์โดยตรงสำหรับโฮสต์ที่เปิดเผยต่อสาธารณะแล้ว หมายความว่าไม่มีสิ่งใดบนโฮสต์ (โดยเฉพาะที่ไม่ใช่ k8s) สามารถเปลี่ยนเส้นทางทราฟฟิกคอนเทนเนอร์ผ่านชั้นพิเศษและเปลี่ยนหมายเลขพอร์ตได้ ดังนั้นเมื่อคอนเทนเนอร์เปิดพอร์ต 34197 จะได้รับพอร์ต 34197 เมื่อส่งที่พอร์ต 34197 การรับส่งข้อมูลนั้นจะถูกส่งไปที่พอร์ต 34197 เซิร์ฟเวอร์ปิงปองจะเห็นพอร์ตที่ควรจะเห็น และเนื่องจากเป็นพอร์ต UDP สาธารณะ จึงไม่สำคัญว่าใครจะส่งทราฟฟิกก่อน การจราจรก็คือการจราจร ท่าเรือก็คือท่าเรือ
อย่างไรก็ตาม หากฉันเข้าใจเอกสารอย่างถูกต้อง การเรียกใช้คอนเทนเนอร์บนสแต็กเครือข่ายของโฮสต์นั้นต้องใช้คอนเทนเนอร์ที่มีสิทธิพิเศษ ซึ่งเป็นการเข้าถึงรูทบนโฮสต์ได้อย่างมีประสิทธิภาพ ซึ่งถือว่าแย่มากในการผลิต ดังนั้น สำหรับคอนเทนเนอร์ที่ไม่มีสิทธิพิเศษ จำเป็นต้องมีโซลูชันอื่นนอกเหนือจากการใช้เครือข่ายโฮสต์ ฉันไม่พบ "วิธีแก้ปัญหาอื่น" นั้น
ฉันไม่พบเอกสารใดๆ เกี่ยวกับวิธีการทำเช่นนี้ หรือแม้แต่หลักฐานว่ามีใครกำลังคิดเรื่องนี้อยู่ ฉันจะทำให้งานนี้ได้อย่างไร