Score:0

Kubernetes จัดการเซิร์ฟเวอร์ UDP ที่แตกต่างกันจำนวนมากบน GKE

ธง au

ฉันกำลังพยายามตั้งค่าระบบที่สามารถหมุนเซิร์ฟเวอร์วิดีโอเกมขึ้นและลงโดยอัตโนมัติเป็นอิมเมจนักเทียบท่า ในกรณีนี้, factoriotools/แฟกทอรี-นักเทียบท่า. แต่ละเกมมีการปรับใช้พอดเดี่ยวที่แตกต่างกันของคอนเทนเนอร์นั้น ดังนั้น (ในกรณีแบบง่าย) จึงต้องการที่อยู่ IP ของตัวเองที่สามารถฟังบนพอร์ต UDP เฉพาะได้ ตัวจัดสรรภาระงานนั้นซ้ำซ้อนและไม่เกี่ยวข้อง และ Cloud NAT ก็ดูเหมือนจะไม่อนุญาตทราฟฟิกขาเข้าอย่างง่ายดาย

มีสองวิธีที่ฉันรู้ในการทำให้สิ่งนี้ใช้งานได้ ทั้งสองอย่างมีการประนีประนอมที่ค่อนข้างสำคัญ:

  • ฉันสามารถใช้บริการ NodePort และสูญเสียการควบคุมพอร์ตที่ไคลเอนต์ต้องการเชื่อมต่อ นั่นเป็นปัญหาเนื่องจากเซิร์ฟเวอร์ลงทะเบียนตัวเองด้วยรายชื่อเซิร์ฟเวอร์
  • ฉันสามารถใช้เครือข่ายโฮสต์ได้ หากข้อมูลของฉันถูกต้อง นั่นต้องใช้คอนเทนเนอร์พิเศษ ซึ่งไม่ดีอย่างแน่นอน
  • ฉันอาจใช้ตัวจัดสรรภาระงาน UDP ได้ แต่แม้ว่าจะมีอยู่จริงและใช้งานได้ แต่ก็มีราคาแพง

อาจมีวิธีแก้ไขข้อ จำกัด ของทั้งสองวิธี (สำหรับวิธีที่สอง ให้โฮสต์มีอายุสั้นและรักษาไฟร์วอลล์ให้เข้มงวด และส่วนใหญ่ควรจะใช้ได้) แต่ฉันอดไม่ได้ที่จะคิดว่ามีตัวเลือกที่ดีกว่า ที่ฉันไม่พบคำอธิบายในเอกสาร kubernetes อย่างเป็นทางการ Traefik มีเคล็ดลับที่ฉันไม่รู้หรือไม่? มีวิธีใดบ้างในการรับ MetalLB ที่สามารถจัดสรรที่อยู่ IP สาธารณะแบบไดนามิกตามที่ฉันต้องการ

ฉันจะทำให้คอนเทนเนอร์เซิร์ฟเวอร์แต่ละรายการรับฟังที่อยู่ IP สาธารณะที่แตกต่างกันด้วยพอร์ต UDP เฉพาะได้อย่างไร โดยไม่ทำให้การรักษาความปลอดภัยเป็นไปไม่ได้ในกระบวนการนี้

แก้ไข:

  • สามารถกำหนดค่าพอร์ตได้ ตราบเท่าที่ฉันรู้ว่าพอร์ตใดที่เซิร์ฟเวอร์ต้องใช้งานก่อนที่พ็อดจะเริ่มทำงาน
  • ไคลเอนต์ต้องสามารถเชื่อมต่อกับพอร์ตเดียวกันกับที่เซิร์ฟเวอร์กำลังฟังอยู่ เว้นแต่ว่าฉันจะเข้าใจผิดเกี่ยวกับเอกสารของเซิร์ฟเวอร์ ความแตกต่างของ k8s ระหว่างพอร์ตการฟังแอปและพอร์ตเชื่อมต่อไคลเอนต์นั้นไม่มีประโยชน์ในกรณีของฉัน
  • ที่อยู่ คำถามนี้ ฉันไม่ต้องการโหลดบาลานเซอร์เพราะมันไม่ได้ทำอะไรให้ฉันเลย การเปลี่ยนที่อยู่ IP ไม่ใช่เรื่องสำคัญ ระบบออกแบบมาเพื่อจัดการเรื่องนั้น หากเซิร์ฟเวอร์หยุดทำงานเป็นเวลา 15 วินาที ทุกคนจะต้องเชื่อมต่อใหม่อยู่ดี และพวกเขาจะพบที่อยู่ IP ใหม่ เซิร์ฟเวอร์ไม่สามารถจัดการหลายพ็อดในเกมเดียวกันได้ ดังนั้นจะไม่มีการจำลองมากกว่าหนึ่งรายการ
  • ฉันเพิ่งลอง โหนดพอร์ต บริการด้วยพอร์ตสาธารณะแบบสุ่ม (ยังไม่เห็นว่าฉันสามารถเลือกพอร์ตภายนอกได้) และฉันได้รับการเชื่อมต่อโดยตรงเพื่อทำงาน แต่ไม่ใช่การเชื่อมต่อรายชื่อเซิร์ฟเวอร์ขั้นแรก กระบวนการแสดงรายการเซิร์ฟเวอร์จะตรวจหาวิธีการเชื่อมต่อกับเซิร์ฟเวอร์โดยอัตโนมัติโดยให้เซิร์ฟเวอร์ส่งทราฟฟิก UDP ขาออกไปยังปลายทางที่กำหนด ดังนั้น ไม่เพียงแต่ฉันต้องควบคุมว่าทราฟฟิกขาเข้าของพอร์ตใดเชื่อมต่อกับพอร์ตใด ฉันยังต้องควบคุมวิธีกำหนดเส้นทางทราฟฟิกขาออก รวมถึง NAT ใดๆ ที่อาจถูกใช้ด้วย
Dawid Kruk avatar
cn flag
ฉันคิดว่าวิธีที่แนะนำคือสร้าง `Deployment` ด้วย `Service` ประเภท `LoadBalancer` สำหรับแต่ละเกม ซึ่งจะมีค่าใช้จ่ายตาม: https://cloud.google.com/vpc/network-pricingนอกจากนี้ ฉันไม่แน่ใจว่า Traefik สามารถ "กำหนดเส้นทาง" แพ็กเก็ต UDP: [แหล่งที่มา](https://doc.traefik.io/traefik/routing/routers/#configuring-udp-routers) ในการตั้งค่านี้ คุณมี 2 พอร์ตที่ควรกำหนดค่า (`พอร์ต` (ไคลเอ็นต์เชื่อมต่อกับพอร์ต) และ `targetPort` (แอปฟัง) `พอร์ต` สามารถเปลี่ยนหรือควรเหมือนกันในแต่ละเกมได้หรือไม่?
xenrelay avatar
au flag
การแก้ไขเหล่านั้นช่วยได้หรือไม่?
Dawid Kruk avatar
cn flag
ใช่ผู้ที่ช่วยเหลือจริง ฉันไม่มีความรู้มากนักเกี่ยวกับ `Factorio` แต่ฉันคิดว่าคุณสามารถตั้งค่า `Deployment` สำหรับแต่ละเกมที่จะสำรองข้อมูลด้วย `Service` ประเภท `nodePort` [ด้วยพอร์ต nodePort เฉพาะ](https:/ /stackoverflow.com/a/60116792/12257134). รับทราบประเด็นอื่น ๆ ของคุณ (ละเว้น `บริการ` ประเภท `LoadBalancer`) ฉันไม่สามารถบอกวิธีแก้ปัญหาอื่นที่จะใช้งานได้ในกรณีนั้น โปรดแจ้งว่าจะเหมาะกับคุณหรือคุณมีข้อกังวลอื่นๆ
xenrelay avatar
au flag
ฉันจะต้องทดสอบเพื่อดูว่า NodePort ทำงานตามที่ลิงก์อธิบายไว้หรือไม่ แต่ถ้าทำได้ นั่นจะช่วยได้มาก สถานการณ์ที่ทราฟฟิกขาออกถูกเปลี่ยนเส้นทางไปยังพอร์ตอื่น และผลกระทบที่มีต่อรายชื่อเซิร์ฟเวอร์นั้นน่าจะคู่ควรกับคำถามใหม่
Score:1
ธง cn

โพสต์คำตอบ wiki ชุมชนนี้เพื่อกำหนดแนวทางพื้นฐานสำหรับคำถามนี้มากกว่าที่จะให้คำตอบที่ชัดเจน

อย่าลังเลที่จะแก้ไขและขยาย


คุณสามารถเปิดเผยแอปพลิเคชันของคุณด้วย บริการ. มีตัวเลือกสองสามตัวที่แต่ละตัวเลือกแตกต่างจากตัวเลือกอื่น:

  • คลัสเตอร์ไอพี: เปิดเผยบริการบน IP ภายในคลัสเตอร์ การเลือกค่านี้จะทำให้บริการสามารถเข้าถึงได้จากภายในคลัสเตอร์เท่านั้น นี่คือค่าเริ่มต้น ประเภทบริการ.
  • โหนดพอร์ต: เปิดเผยบริการบน IP ของแต่ละโหนดที่พอร์ตแบบคงที่ (the โหนดพอร์ต). ก คลัสเตอร์ไอพี บริการซึ่งการ โหนดพอร์ต เส้นทางบริการจะถูกสร้างขึ้นโดยอัตโนมัติ คุณจะสามารถติดต่อ โหนดพอร์ต บริการจากภายนอกคลัสเตอร์โดยการร้องขอ <NodeIP>:<NodePort>.
  • โหลดบาลานเซอร์: เปิดเผยบริการภายนอกโดยใช้โหลดบาลานซ์ของผู้ให้บริการระบบคลาวด์ โหนดพอร์ต และ คลัสเตอร์ไอพี บริการซึ่งกำหนดเส้นทางโหลดบาลานเซอร์ภายนอกจะถูกสร้างขึ้นโดยอัตโนมัติ
  • ชื่อภายนอก: แมปบริการกับเนื้อหาของ ชื่อภายนอก ฟิลด์ (เช่น foo.bar.example.com) โดยส่งคืน a CNAME บันทึกด้วยค่าของมัน ไม่มีการตั้งค่าพร็อกซีใด ๆ

-- Kubernetes.io: เอกสาร: แนวคิด: บริการเครือข่าย: บริการ: ประเภทบริการสิ่งพิมพ์

เอกสารประกอบเฉพาะสำหรับการเปิดเผยแอป เครื่องยนต์ Google Kubernetes ได้ที่นี่:


โดยเน้นเฉพาะบางประเด็นที่รวมอยู่ในคำถาม:


ฉันสามารถใช้บริการ NodePort และสูญเสียการควบคุมพอร์ตที่ไคลเอนต์ต้องการเชื่อมต่อ นั่นเป็นปัญหาเนื่องจากเซิร์ฟเวอร์ลงทะเบียนตัวเองด้วยรายชื่อเซิร์ฟเวอร์

คุณสามารถระบุ โหนดพอร์ต ท่าเรือใน บริการ YAML (เช่น โหนดพอร์ต: 32137 หรือ โหนดพอร์ต: 30911).

คุณสามารถกำหนดค่าแอปพลิเคชันของคุณให้รับฟังบนพอร์ตเดียวกันกับ โหนดพอร์ต:

  • แอปพลิเคชันกำลังฟังพอร์ต 30000
  • บริการโดยใช้ก โหนดพอร์ต กับ ท่า:30000 (ไคลเอ็นต์/ผู้ใช้ควรเชื่อมต่อกับพอร์ตนี้) และ targetPort:30000. ในกรณีนั้นจะไม่มีการเปลี่ยนแปลงพอร์ต

ข้อสังเกต!

โดยค่าเริ่มต้น โหนดพอร์ต ช่วงพอร์ตถูกบล็อกโดย GCP ไฟร์วอลล์ คุณจะต้องสร้างกฎ (หรือชุดของกฎ) ที่จะอนุญาต


ฉันสามารถใช้เครือข่ายโฮสต์ได้ หากข้อมูลของฉันถูกต้อง นั่นต้องใช้คอนเทนเนอร์พิเศษ ซึ่งไม่ดีอย่างแน่นอน

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

นโยบาย Privileged เปิดโดยเจตนาและไม่ถูกจำกัดโดยสิ้นเชิง นโยบายประเภทนี้มักมุ่งเป้าไปที่ปริมาณงานระดับระบบและโครงสร้างพื้นฐานที่จัดการโดยผู้ใช้ที่ได้รับสิทธิพิเศษและเชื่อถือได้

-- Kubernetes.io: เอกสาร: แนวคิด: ความปลอดภัย: มาตรฐานความปลอดภัยของ Pod: สิทธิ์


สามารถกำหนดค่าพอร์ตได้ ตราบเท่าที่ฉันรู้ว่าพอร์ตใดที่เซิร์ฟเวอร์ต้องใช้งานก่อนที่พ็อดจะเริ่มทำงาน

เพราะคุณจะมีโสดมากมาย พ็อด (แต่ละอันแยกกัน การปรับใช้) คุณสามารถกำหนดพารามิเตอร์แต่ละตัวได้ สิ่งที่ฉันหมายถึงคือคุณสามารถสร้างเทมเพลตและแก้ไขเฉพาะส่วนของรายการของคุณ (เช่น พอร์ต ตัวแปร env เป็นต้น)

คุณสามารถส่งตัวแปรสภาพแวดล้อมไปยังของคุณ พ็อด เพื่อให้สามารถใช้เป็นพารามิเตอร์ในคำสั่งของคุณ คุณยังสามารถแก้ไขคำสั่งที่ พ็อด เริ่มต้นด้วย

โพสต์คำตอบ

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