Best Practices von ACK One x OpenKruiseGame für die konsistente Bereitstellung globaler Spieleserver in mehreren Regionen

Autor: Liu Qiuyang, Cai Jing

Vorwort

Im heutigen global integrierten Wirtschaftsumfeld wird die digitale Unterhaltungsindustrie zunehmend zu einem starken Vertreter des kulturellen und kommerziellen Austauschs. In diesem Zusammenhang haben zahlreiche Spielehersteller versucht, ihre Spiele ins Ausland zu bringen und dabei bemerkenswerte Ergebnisse erzielt. Viele Spiele haben mit einer globalen Serverstruktur ein breites Spektrum an Spielergruppen auf der ganzen Welt angezogen. Der weltweite Einsatz von Spielen vergrößert nicht nur die Marktgröße einzelner Produkte, sondern erhöht auch den globalen Einfluss der Spielehersteller, bringt aber gleichzeitig auch viele technische Herausforderungen mit sich:

Die für Spieledienste erforderliche hochfrequente Interaktion und geringe Latenz erfordern die Bereitstellung von Spieleservern in mehreren Regionen im Rahmen des globalen Server-Frameworks. Im tatsächlichen Betrieb müssen wir den Standort des Servers normalerweise im Voraus planen, basierend auf dem geografischen Standort der Zielbenutzergruppe und der Latenztoleranz. Im Allgemeinen sind die folgenden Gebiete unsere vorrangigen Serveradressen: Der Osten der Vereinigten Staaten ist dicht besiedelt und kann Dienste für eine große Anzahl nordamerikanischer Spieler bereitstellen. Der Raum Frankfurt ist der Schnittpunkt des europäischen Internets und kann das Netzwerkerlebnis effektiv bedienen Spieler in ganz Europa; Singapur Die Region deckt im Großen und Ganzen die Spielerbasis in Südostasien ab; die Region Tokio bietet hauptsächlich Unterstützung für Spieler in Japan und Südkorea.

Angesichts möglicher Konfigurationsunterschiede, Spielversionsaktualisierungen und Inkonsistenzen bei der Anzahl der Server in verschiedenen Regionen ist die effektive Erzielung einer konsistenten Bereitstellung von Spieleservern auf globaler Ebene zu einer zentralen Herausforderung geworden, der wir uns beim Entwurf des globalen Servers stellen und die wir lösen müssen die Architektur. . In diesem Artikel werden anhand eines Beispiels die Best Practices für die multiregionale Konsistenzbereitstellung globaler Spieleserver erläutert.

Bereitstellungsarchitektur

Im Beispiel planen wir, Server in Shanghai, Tokio und Frankfurt zu eröffnen, daher benötigen wir Infrastrukturressourcen in diesen drei Regionen. Angesichts heterogener und komplexer Infrastrukturszenarien können die deklarative API und die konsistenten Bereitstellungsfunktionen von Cloud Native die Unterschiede in den zugrunde liegenden Ressourcen vollständig abschirmen, sodass sich Spielbetriebs- und Wartungsingenieure auf die Anwendung selbst konzentrieren und die Effizienz der Spieleserverbereitstellung erheblich verbessern können . Aus der Perspektive der Stabilität der regionalen Autonomie und der Komplexität der Benutzerplanung glauben wir, dass die unabhängige Bereitstellung von Kubernetes-Clustern in jeder Serverregion und ein einheitliches Betriebs- und Wartungsmanagement durch Multi-Cluster-Funktionen der beste Weg ist, konsistente Spieleserver bereitzustellen.

In dieser Praxis haben wir uns für die verteilte Cloud-Container-Plattform ACK One von Alibaba Cloud entschieden, um Kubernetes-Cluster mit mehreren Regionen zu verwalten. Als cloudnative Plattform der Enterprise-Klasse von Alibaba Cloud für Hybrid Cloud, Multi-Cluster, Disaster Recovery und andere Szenarien kann ACK One Kubernetes-Cluster in jeder Region und auf jeder Infrastruktur verbinden und verwalten und bietet eine konsistente Verwaltung zur Unterstützung von Anwendungen und Datenverkehr. , Sicherheit, Speicherung, Beobachtbarkeit usw. unterliegen einer einheitlichen Kontrolle.

Die Bereitstellungsarchitektur dieses Beispiels ist in der Abbildung dargestellt und umfasst drei Produktionsumgebungen in verschiedenen Regionen und eine Entwicklungs- und Testumgebung. Im Allgemeinen trägt dieser Prozess durch die Überprüfung und Bestätigung, dass die Version in der F&E-Testumgebung stabil ist, bevor sie in der Produktionsumgebung bereitgestellt wird, dazu bei, die Gesamtstabilität des Projekts sicherzustellen und potenzielle Risiken wirksam zu verhindern.

Das Beispiel verwendet eine Multi-Cluster-Hybrid-Cloud-Architektur. Insbesondere sind der Shanghai-Cluster, der Frankfurt-Cluster und der ShangHai Dev-Cluster Alibaba Cloud ACK-Cluster, während der Japan-Cluster ein Nicht-Alibaba Cloud Kubernetes-Cluster ist, der durch die Registrierung des Clusters integriert und verwaltet wird. Innerhalb jedes Clusters verwenden wir GameServerSet, um Spieleserver bereitzustellen. GameServerSet ist ein spielspezifischer Workload, der von OpenKruise bereitgestellt wird, einem Open-Source-Projekt der Cloud Native Computing Foundation (CNCF). Im Vergleich zu den nativen Deployment- und StatefulSet-Workloads verfügt GameServerSet über Spielesemantik und ist näher an der Spieleszene, wodurch die Betriebs- und Wartungsverwaltung des Spieleservers bequemer und effizienter wird.

Clustermanagement

Nachdem die Vorbereitung des Kubernetes-Clusters abgeschlossen ist, verwenden wir die ACK One-Flotte, um die Cluster in und außerhalb der Cloud einheitlich zu verwalten:

Registrieren Sie zunächst den IDC oder einen öffentlichen Cloud-Cluster eines Drittanbieters über den ACK One-Registrierungscluster [ 1] bei Alibaba Cloud , insbesondere:

  1. Erstellen Sie einen Registrierungscluster [ 2] und klicken Sie in der Operationsspalte auf der rechten Seite des erstellten Registrierungsclusters auf Details .

  2. Klicken Sie auf der Cluster-Informationsseite auf die Registerkarte Verbindungsinformationen .

  3. Wählen Sie im Konfigurationsbereich des Cluster-Import-Agenten nach Bedarf ein öffentliches Netzwerk oder ein privates Netzwerk aus, klicken Sie dann rechts auf Kopieren, um den Inhalt des Tags „Öffentliches Netzwerk“ oder „Privates Netzwerk“ in eine Datei zu kopieren, und führen Sie den Befehl kubectl aus, um den Zielcluster zu registrieren der neue Cluster. Erstellen Sie beispielsweise eine neue Datei agent.yaml, kopieren Sie den obigen Inhalt in die Datei agent.yaml und führen Sie den Befehl kubectl apply -f agent.yaml im Zielcluster aus.

Durch diesen Schritt wurde der Japan-Cluster bei Alibaba Cloud registriert.

Zweitens öffnen Sie die ACK One-Multi-Cluster-Flotte [ 3] und verknüpfen den registrierten Cluster mit dem Cloud-Cluster auf der ACK One-Konsole [ 4] . Da sich der Cluster über mehrere Regionen erstreckt, nutzt die ACK One-Flotte das öffentliche Netzwerk, um sich mit dem Cluster zu verbinden, und die VPC, in der sich die Flotte befindet, muss mit einem NAT-Gateway des öffentlichen Netzwerks konfiguriert werden.

Zu diesem Zeitpunkt ist eine Multi-Cluster-Flotte bereit. Das dem Beispiel entsprechende schematische Diagramm sieht wie folgt aus:

Veröffentlichung des Gameservers

Bevor wir den spezifischen Release-Vorgang des Beispiels ausführen, lernen wir die Idee der cloudnativen Bereitstellung kennen – deklarativ statt prozessorientiert, was bedeutet, dass sich die cloudnative Anwendungsbereitstellung nicht auf den Anwendungsbereitstellungsprozess, sondern auf die Anwendungsdefinition konzentriert. Die Definition einer Anwendung ist Yaml, die durch Konfigurationsparameter beschreibt, wie die Anwendung aussehen soll. Daher handelt es sich bei allen Änderungen und Veröffentlichungen im Zusammenhang mit der Anwendung tatsächlich um Änderungen der Anwendungsbeschreibung (Yaml).

Bisher haben wir herausgefunden, dass wir ein Warehouse benötigen, um Yaml zu speichern, die aktuelle Beschreibung der Anwendung aufzuzeichnen und in der Lage zu sein, vergangene Yaml-Änderungen nachzuverfolgen und zu prüfen. Ich glaube jedoch, dass jeder feststellen wird, dass das Git-Repo diese Eigenschaft auf natürliche Weise erfüllt. Betriebs- und Wartungsingenieure können Yaml hochladen und auf die Festplatte legen, indem sie eine Commit- und Merge-Anfrage einreichen und alle Git-Spezifikationen überwachen. In einer idealen Welt müssen wir nur eine Reihe von YAML-Beschreibungen für Spieleserver verwalten und die Veröffentlichung von Spieleservern in mehreren Regionen auf der ganzen Welt mit einem Klick auslösen. Es ist nicht erforderlich, den Cluster einzeln zu bedienen, um die Bereitstellung durchzuführen Aktionen. Das ist die Idee von GitOps.

Die größte Herausforderung im Implementierungsprozess von GitOps ist tatsächlich die abstrakte Beschreibung der Spieleserveranwendung. Wie am Anfang des Artikels erwähnt, gibt es in den einzelnen Regionen mehr oder weniger Unterschiede bei den Spieleservern, und es scheint schwierig, alle Spieleserver in einem Yaml zusammenzufassen. In Shanghai möchte ich beispielsweise 10 regionale Spielserver veröffentlichen, in Frankfurt jedoch nur 3 regionale Server. Auf diese Weise kann ein Yaml aufgrund von Unterschieden im Replikatbereich keine Spielserver in verschiedenen Regionen beschreiben. Müssen wir für jede Region ein Yaml pflegen? Dies ist auch unangemessen, wenn wir nicht differenzierte Feldänderungen vornehmen (z. B. die Bezeichnung von Spieleservern in allen Regionen). Wenn die Anzahl der Cluster groß ist, kann es leicht zu Auslassungen oder Fehlern kommen. Dies steht nicht im Einklang mit der Idee der Cloud-nativen Bereitstellung.

Tatsächlich können wir die Spieleserveranwendung über Helm Chart weiter abstrahieren und die verschiedenen Teile als Wert extrahieren. In unserem Beispiel dieses Mal (GitHub-Spieleserver-Helm-Chart-Beispiel [ 5] ) haben wir mehrere verschiedene Felder abstrahiert:

  • Master-Image – das Master-Image jeder Region/jedes Clusters kann unterschiedlich sein
  • Sidecar-Bild – Das Sidecar-Bild jeder Region/jedes Clusters kann unterschiedlich sein
  • Anzahl der Kopien – die Anzahl der pro Region/Cluster veröffentlichten Spielserver kann variieren
  • Ob automatische Skalierung – jede Region/jeder Cluster kann unterschiedliche Anforderungen an die automatische Skalierung haben

Ansonsten bleiben die übrigen Bereiche konsistent, sodass es keine regionalen Unterschiede gibt.

Nachdem wir GitOps verstanden und Spieleserveranwendungen abstrahiert und beschrieben hatten, verwendeten wir ACK One GitOps, um die praktische Anwendungsbereitstellung durchzuführen. Als nächstes starten wir die spezifischen Vorgänge:

Stellen Sie eine Verbindung zum Git-Repository her

Melden Sie sich bei der ArgoCD-Benutzeroberfläche an: Gehen Sie zu Fleet -> GitOps -> GitOps Console in der linken Navigationsleiste der ACK One-Konsole und klicken Sie auf der Anmeldeseite auf LOG IN VIA ALIYUN , um sich bei der ArgoCD-Benutzeroberfläche anzumelden. Wenn Sie Zugriff auf ein öffentliches Netzwerk benötigen, müssen Sie ein öffentliches Netzwerk öffnen, um auf GitOps zuzugreifen [ 6] .

  1. Wählen Sie Einstellungen in der linken Navigationsleiste der ArgoCD-Benutzeroberfläche und dann Repositorys > + Repo verbinden.

  2. Konfigurieren Sie die folgenden Informationen im Popup-Fenster und klicken Sie dann auf VERBINDEN, um eine Verbindung hinzuzufügen.

Veröffentlichen Sie PvE-Spiele

PvE-Spiele basieren normalerweise auf regionalen Servern. In den meisten Fällen steuern Betriebs- und Wartungsingenieure manuell die Anzahl der in jeder Region geöffneten Server. Informationen zu den Best Practices für Cloud-native PvE-Spiele finden Sie im OKG-Dokument zu Best Practices für PvE-Spiele [ 7] .

White-Screen-Verwaltungsanwendung

Wenn wir ArgoCD zum ersten Mal ausprobieren, können wir die White-Screen-Konsole verwenden, um Anwendungen für die Cluster in jeder Region zu erstellen:

  1. Wählen Sie  in der linken Navigationsleiste der ArgoCD-Benutzeroberfläche Anwendungen aus und klicken Sie dann auf + NEUE APP.

  2. Konfigurieren Sie die folgenden Informationen im Popup-Fenster und klicken Sie dann  zum Erstellen auf ERSTELLEN  . (Nehmen Sie als Beispiel opengame-demo-shanghai-dev).

  1. Nachdem die Erstellung abgeschlossen ist,   können Sie den Anwendungsstatus von opengame-demo-shanghai-dev auf der Anwendungsseite sehen. Wenn  die SYNC-RICHTLINIE den manuellen Modus  auswählt   , müssen Sie manuell auf  SYNC klicken , um die Anwendung synchron auf dem Zielcluster bereitzustellen. Der Status der Anwendung   lautet  „Gesund“ und „Synced“ , was darauf hinweist, dass die Synchronisierung erfolgreich war.

  1. Klicken Sie auf den Anwendungsnamen opengame-demo-shanghai-dev, um die Anwendungsdetails anzuzeigen und die Topologie und den entsprechenden Status der mit der Anwendung verbundenen Kubernetes-Ressourcen anzuzeigen.

Veröffentlichen Sie mit einem Klick über ApplicationSet

Nachdem wir uns mit ArgoCD vertraut gemacht haben, können wir das ApplicationSet-Objekt auch verwenden, um Spieleserver mit einem Klick zu veröffentlichen. Die Unterschiede zwischen den einzelnen Clustern werden durch Elemente abstrahiert. Im folgenden Yaml werden beispielsweise drei Felder von der Clusterdimension abstrahiert: Der Clustername wird zur Unterscheidung der Zielclusteradressen verwendet um von verschiedenen Clustern veröffentlichte Spiele zu unterscheiden.

Nachdem Sie das ApplicationSet Yaml geschrieben haben, stellen Sie es im ACK One-Flottencluster bereit, um automatisch vier Anwendungen zu erstellen.

kubectl apply -f pve.yaml -n argocd

# pve.yaml 内容如下:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: minecraft
spec:
  generators:
  - list:
      elements:
      - cluster: shanghai-dev
        url: <https://47.100.237.xxx:6443>
        replicas: '1'
      - cluster: shanghai-prod
        url: <https://47.101.214.xxx:6443>
        replicas: '3'
      - cluster: frankfurt-prod
        url: <https://8.209.103.xxx:6443>
        replicas: '2'
      - cluster: japan-prod
        url: <https://10.0.0.xxx:6443>
        replicas: '2'
  template:
    metadata:
      name: '{{cluster}}-minecraft'
    spec:
      project: default
      source:
        repoURL: '<https://github.com/AliyunContainerService/gitops-demo.git>'
        targetRevision: HEAD
        path: manifests/helm/open-game
        helm:
          valueFiles:
          - values.yaml
          parameters: #对应helm chart中提取的value参数
          - name: replicas
            value: '{{replicas}}'
          - name: scaled.enabled 
            value: 'false'
      destination:
        server: '{{url}}'
        namespace: game-server #部署到对应集群的game-server命名空间下
      syncPolicy:
        syncOptions:
          - CreateNamespace=true #若集群中命名空间不存在则自动创建

In diesem Yaml sind alle Image-Versionen konsistent. Wenn Sie möchten, dass die Image-Versionen jedes Clusters unterschiedlich sind, können Sie neue Parameter auf die gleiche Weise wie Replikate hinzufügen.

Veröffentlichen Sie PvP-Spiele

Bei PvP-Spielen wird die Anzahl der Raumserver von einem eigenen Skalierer zugewiesen und nicht manuell von Betriebs- und Wartungsingenieuren festgelegt. Informationen zu Cloud-nativen Best Practices für PvP-Spiele finden Sie im OKG-Dokument zu Best Practices für PvP-Spiele [ 8] .

In OKG implementieren wir die elastische Skalierung von Raumservern, indem wir das ScaledObject-Objekt für GameServerSet konfigurieren. Daher muss Scaled.enabled in diesem Szenario aktiviert werden. Darüber hinaus gibt es Konflikte mit der Anzahl der Kopien des Raumservers mit zwei Controllern, ArgoCD und OKG. Dies kann dadurch gelöst werden, dass ArgoCD Änderungen in der Anzahl der Kopien der GameServerSet-Ressource ignoriert. Legen Sie insbesondere die entsprechenden Felder in spec.ignoreDifferences fest. Unter Berücksichtigung des oben Gesagten sieht die pvp.yaml folgendermaßen aus:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: pvp
spec:
  generators:
  - list:
      elements:
      - cluster: shanghai-dev
        url: <https://47.100.237.xxx:6443>
      - cluster: shanghai-prod
        url: <https://47.101.214.xxx:6443>
      - cluster: frankfurt-prod
        url: <https://8.209.103.xxx:6443>
      - cluster: japan-prod
        url: <https://10.0.0.xxx:6443>
  template:
    metadata:
      name: '{{cluster}}-pvp'
    spec:
      project: defaultminecraft
      ignoreDifferences: # 设置 GameServerSet minecraft副本数目由集群自控制
      - group: game.kruise.io
        kind: GameServerSet
        name: minecraft
        namespace: game
        jsonPointers:
        - /spec/replicas
      source:
        repoURL: '<https://github.com/AliyunContainerService/gitops-demo.git>'
        targetRevision: HEAD
        path: manifests/helm/open-game
        helm:
          valueFiles:
          - values.yaml
      destination:
        server: '{{url}}'
        namespace: pvp-server
      syncPolicy:
        syncOptions:
          - CreateNamespace=true

Zusammenfassen

In diesem Artikel werden anhand eines Beispiels die Best Practices für die konsistente Bereitstellung von ACK One in mehreren Regionen auf globalen Spieleservern vorgestellt. Das Beispiel umfasst 4 Kubernetes-Cluster und einen einfachen Spieleserver Yaml. In der tatsächlichen Produktionsumgebung ist die Anzahl der Cluster wahrscheinlich größer und die Beschreibung der Spieleserveranwendung komplexer. Zu diesem Zeitpunkt liegt der Schlüssel darin, die Anwendung gut zu abstrahieren.

Willkommen in der DingTalk-Gruppe für Cloud-native Spiele (Gruppennummer: 44862615), um mit OpenKruiseGame-Entwicklern und F&E- und Betriebsingenieuren der Spielebranche zu kommunizieren und zu diskutieren. Bei Fragen zu ACK One können Sie auch der DingTalk-Gruppe beitreten (Gruppennummer: 35688562). zur Beratung.

Verwandte Links:

[1] ACK Ein Registrierungscluster

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/overview-9?spm=a2c4g.11186623.0.0.3e4157eb3o9J3v

[2] Erstellen Sie einen Registrierungscluster

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/create-a-cluster-registration-proxy-and-register-a-kubernetes-cluster- ployed-in-a-data-center?spm=a2c4g.11186623.0.0.2f833eb6R1YTOq

[3] Starten Sie die ACK One Multi-Cluster-Flotte

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/enable-fleet-management?spm=a2c4g.11186623.0.0.8cc462853sti0H

[4] ACK Eine Konsole

https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fcs.console.aliyun.com%2Fone

[5] Helm-Chart-Beispiel für den GitHub-Spieleserver

https://github.com/AliyunContainerService/gitops-demo/tree/main/manifests/helm/open-game

[6] Für den Zugriff auf GitOps muss ein öffentliches Netzwerk geöffnet werden

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/enable-gitops-public-network-access?spm=a2c4g.11186623.0.0.e7db48aeenz8AX

[7] Best Practices-Dokument für OKG-PvE-Spiele

https://openkruise.io/zh/kruisegame/best-practices/pve-game

[8] OKG-Dokument mit Best Practices für PvP-Spiele

https://openkruise.io/zh/kruisegame/best-practices/session-based-game/

Das Team der Google Python Foundation wurde entlassen , und die an Flutter, Dart und Python beteiligten Teams stürmten auf die GitHub-Hotlist – Wie können Open-Source-Programmiersprachen und Frameworks so süß sein? Xshell 8 startet Betatest: Unterstützt das RDP-Protokoll und kann eine Fernverbindung zu Windows 10/11 herstellen. Wenn Passagiere eine Verbindung zum Hochgeschwindigkeits-WLAN der Bahn herstellen , taucht der „35 Jahre alte Fluch“ chinesischer Programmierer auf, wenn sie sich mit Hochgeschwindigkeit verbinden Rail WiFi. MySQLs erstes KI-Suchtool mit Langzeitunterstützung für Version 8.4 GA : Vollständig Open Source und kostenlos, eine Open-Source-Alternative zu Perplexity. Hongmeng: Es verfügt trotz anhaltender Unterdrückung immer noch über ein eigenes Betriebssystem Das deutsche Automobilsoftwareunternehmen Elektrobit hat eine auf Ubuntu basierende Automobil-Betriebssystemlösung als Open Source bereitgestellt .
{{o.name}}
{{m.name}}

Ich denke du magst

Origin my.oschina.net/u/3874284/blog/11067468
Empfohlen
Rangfolge