Puncte:0

Dirijarea traficului udp de intrare și de ieșire către același port în kubernetes

drapel au

Aceasta este o continuare a o întrebare prealabilă pe care am pus-o, dar cu o altă întrebare/abordare. În cazul în care contează, sunt pe GKE, dar sper că există un răspuns independent de cloud.

Încerc să rulez containerul factoriotools/factorio, dar aplicația are anumite cerințe speciale datorită utilizării unei funcții de listare a serverelor publice specifice aplicației, așa cum se vede în multe jocuri video care folosesc servere găzduite de utilizator.

Până acum, am reușit să fac lucrurile să funcționeze cu rețelele gazdă și conexiuni directe pentru a lucra cu un serviciu NodePort.Cu toate acestea, funcția de listare a serverelor publice a aplicației rămâne o problemă pentru containerele neprivilegiate.

Iată cum Factorio își dă seama cum să gestioneze lista de servere publice:

  • Containerul ascultă pe un soclu, să spunem portul UDP 34197.
  • Serviciul NodePort direcționează public acest trafic către 20635.
  • Containerul trimite un ping prin portul său de ascultare (34197) către un server de ping-pong, iar serverul de ping-pong răspunde cu adresa IP și portul de la care a primit ping-ul. În afara k8s, acesta ar fi încă portul 34197.
  • Containerul folosește apoi aceste informații pentru a se înregistra în lista de server. Adresa IP, portul, numele serverului și alte informații.
  • În GKE, ping-pong-ul este direcționat către un port arbitrar neutilizat (de exemplu, 40792).
  • Containerul crede că ascultă pe un alt port decât cel pe care l-am configurat (20534), apoi se înregistrează pe lista serverului public folosind portul greșit (40792, deoarece serverul de ping-pong a spus așa).
  • Orice încercare de conectare de la lista de servere publice eșuează; clientul crede că serverul ascultă pe portul la care a fost martor serverul de ping-pong (40792), dar containerul a interacționat cu portul său de ascultare (34197) tot timpul.

(Mi s-a spus că acest proces este o variație a modului în care funcționează ICE/STUN)

Deci, asta înseamnă că, dacă containerul ascultă pe 34197, dar Kubernetes îl direcționează către 20635 extern, atât traficul de intrare, cât și cel de ieșire trebuie să treacă prin 20635 din partea publică pentru ca funcția de listare a serverului încorporată a aplicației să funcționeze.

Dacă ocol listarea serverului public și mă conectez direct la adresa IP publică a nodului containerului cu portul 20635, funcționează impecabil. Dar acesta este un compromis destul de masiv pentru ceea ce fac.

Rețeaua gazdă ocolește întreaga problemă, permițând containerului să deschidă direct orice port dorește pe gazdă.Pentru gazdele care sunt deja expuse public, acest lucru înseamnă că nimic de pe gazdă (mai ales nu k8s) nu poate redirecționa traficul containerului prin straturi suplimentare și poate schimba numerele de port. Deci, când containerul deschide portul 34197, primește portul 34197. Când trimite pe portul 34197, acel trafic este trimis pe portul 34197. Serverul de ping-pong vede portul pe care ar trebui să-l vadă. Și pentru că este un port public UDP, nu contează cine a trimis primul trafic; traficul este trafic, portul este portul.

Cu toate acestea, dacă înțeleg documentele corect, rularea unui container pe stiva de rețea a gazdei necesită un container privilegiat, care este efectiv acces root pe gazdă, care este foarte prost în producție. Deci, pentru containerele neprivilegiate, trebuie să existe o altă soluție decât baza pe rețelele gazdă. Nu pot găsi acea „altă soluție”. Nu găsesc nicăieri documentație despre cum să fac asta, sau chiar dovezi că cineva se gândește la asta. Cum fac asta să funcționeze?

Anant Swaraj avatar
drapel cn
În rețeaua generală, nu este recomandat să plasați Inbound și Outbound în același port. Există o alocare dinamică de porturi la sursă atunci când este inițiată o conexiune, care este utilizată pentru a urmări conexiunea și starea acesteia. După cum ați menționat, „înregistrarea serverului public rămâne o problemă pentru containerele neprivilegiate” ce înseamnă aceasta? Listarea serverelor publice înseamnă listare DNS? Funcționează pentru un container privilegiat? Puteți detalia mai multe despre configurație?
xenrelay avatar
drapel au
Întrebarea este editată, sper să vă ajute. Mai multe detalii despre care nu sunt sigur că ar trebui să fie în întrebare: DNS nu are legătură. Lista de servere publice despre care vorbesc este mai aproape de o bază de date cu o interfață de utilizare personalizată. Unele servere centralizate acceptă înregistrări de la serverele de jocuri reale, iar serverele de jocuri reale trebuie să păstreze o conexiune deschisă. Serverul centralizat facilitează apoi conexiunile de la client la serverele de joc reale. Toate acestea se fac cu cod personalizat specific pentru Factorio. Notă importantă: Factorio nu a fost conceput pentru a fi containerizat.
James Rhoat avatar
drapel cn
Ai primit vreodată o soluție bună pentru asta? În prezent, încerc să rezolv acest lucru pentru diagrama mea de cârmă.
xenrelay avatar
drapel au
Nu chiar. Fără piesa de autentificare a serverului, am fost forțat să amân toată această configurare. De asemenea, nu-mi amintesc majoritatea experimentelor pe care le făceam. Îmi amintesc că, din câte mi-am dat seama, orice făcea magia agonistă a făcut trucul.Este doar păcat că nu-mi permit echilibratoarele de încărcare pe care le folosește. Se pare că traefik acceptă rutarea udp în zilele noastre, ceea ce s-ar putea să nu fi fost cazul în urmă cu 6 luni, așa că este un lucru pe care l-aș verifica dacă lucrez la asta acum.
Puncte:0
drapel us
  • Vă sugerez să utilizați GCP GameServer caracteristică. Este un server de jocuri dedicat, care elimină durerea de a vă gestiona infrastructura globală a serverului de jocuri, astfel încât să vă puteți concentra pe crearea de lucruri grozave jocurile mai repede, fără a crește complexitatea sau a face compromisuri performanţă.

  • Oferă gestionarea clusterelor de servere de jocuri folosind Kubernetes pentru orchestrare container şi Agones pentru flota de servere de jocuri orchestrare și managementul ciclului de viață. Agones este o sursă deschisă proiect de găzduire și scalare a serverului de jocuri dedicat construit pe deasupra Kubernetes cu flexibilitate de care aveți nevoie pentru a-l adapta nevoilor jocul tău multiplayer.

  • În timp ce creați un server de joc folosind Agones, trebuie să adăugați câteva reguli de firewall pentru a deschide porturile UDP necesare pentru a se conecta la cluster.

  • Pentru a crea un server de joc folosind Agones, puteți parcurge Pornire rapidă care vă ghidează prin crearea unui GameServer în Kubernetes folosind Agones resursă personalizată.

  • Pentru a obține starea GameServer, utilizați comanda de mai jos. Va oferi cu diverse evenimente ale ciclului de viață ale GameServer.

                urmăriți kubectl descrie serverul de jocuri
    
  • Pentru a configura un GameServer în GCP cu Agones, puteți verifica oficialul Google document.

xenrelay avatar
drapel au
Interesant și funcțional. Nu jocul meu, nu codul meu sursă, dar faptul că au o abordare de integrare bazată pe sidecar este bun. Ar fi bine dacă aș putea face ceva mai simplu (serviciu de plasă, ACL-uri de rețea, ....), dar dacă nu aud alte idei, voi încerca.
xenrelay avatar
drapel au
De fapt, nu îl folosesc acum, deoarece au existat unele probleme legate de conectarea și funcționarea în sistemul mai larg, dar omit și această problemă în întregime pentru moment, deoarece există alte probleme care împiedică listarea serverului public să funcționeze. Probabil că voi reveni la asta într-o zi.
xenrelay avatar
drapel au
Neacceptat, deoarece sub coperte, Agones folosește 3 balansoare de încărcare, ceea ce este inacceptabil de scump la scara mea.

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.