kruise-game/docs/en/user_manuals/network.md

15 KiB

Feature overview

As mentioned in Design concept of OpenKruiseGame, the access network of game servers is the main concern of game developers. For a non-gateway architecture, game developers need to consider how to expose external IP addresses and ports of game servers for access by players. Different network products are usually required for access in different scenarios, and the network products may be provided by different cloud service providers. This increases the complexity of the access network. Cloud Provider & Network Plugin of OpenKruiseGame is designed to resolve this issue. OpenKruiseGame integrates different network plugins of different cloud service providers. You can use GameServerSet to set network parameters for game servers. Moreover, you can view network status information in the generated GameServer. This significantly reduces the complexity of the access network of game servers.

Example

Kubernetes-HostPort

OpenKruiseGame allows game servers to use the HostPort network in native Kubernetes clusters. The host where game servers are located exposes its external IP address and ports by using which Internet traffic is forwarded to the internal ports of the game servers. The following example shows the details:

Deploy the GameServerSet object that contains the network field.

cat <<EOF | kubectl apply -f -
apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
  name: gs-hostport
  namespace: default
spec:
  replicas: 1
  updateStrategy:
    rollingUpdate:
      podUpdatePolicy: InPlaceIfPossible
  network:
    networkType: Kubernetes-HostPort
    networkConf:
    # The network configuration is specified in the form of a key-value pair. The network configuration is determined by the network plugin. Different network plugins correspond to different network configurations.
    - name: ContainerPorts
      # The value of ContainerPorts is in the following format: {containerName}:{port1}/{protocol1},{port2}/{protocol2},...
      value: "gameserver:80"
  gameServerTemplate:
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/gs-demo/gameserver:network
          name: gameserver
EOF

Use the networkStatus field in the generated GameServer to view the network status information of the game server.

  networkStatus:
    createTime: "2022-11-23T10:57:01Z"
    currentNetworkState: Ready
    desiredNetworkState: Ready
    externalAddresses:
    - ip: 48.98.98.8
      ports:
      - name: gameserver-80
        port: 8211
        protocol: TCP
    internalAddresses:
    - ip: 172.16.0.8
      ports:
      - name: gameserver-80
        port: 80
        protocol: TCP
    lastTransitionTime: "2022-11-23T10:57:01Z"
    networkType: Kubernetes-HostPort

Clients can access the game server by using 48.98.98.8:8211.

AlibabaCloud-NATGW

OpenKruiseGame supports the NAT gateway model of Alibaba Cloud. A NAT gateway exposes its external IP addresses and ports by using which Internet traffic is forwarded to pods. The following example shows the details:

cat <<EOF | kubectl apply -f -
apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
  name: gs-natgw
  namespace: default
spec:
  replicas: 1
  updateStrategy:
    rollingUpdate:
      podUpdatePolicy: InPlaceIfPossible
  network:
    networkType: AlibabaCloud-NATGW
    networkConf:
    - name: Ports
      # The ports to be exposed. The value is in the following format: {port1},{port2}...
      value: "80"
    - name: Protocol
      # The protocol. The value is TCP by default.
      value: "TCP"
#   - name: Fixed
# Specify whether the mapping relationship is fixed. By default, the mapping relationship is not fixed, that is, a new external IP address and port are generated after the pod is deleted.
#     value: true
  gameServerTemplate:
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/gs-demo/gameserver:network
          name: gameserver
EOF

Use the networkStatus field in the generated GameServer to view the network status information of the game server.

  networkStatus:
    createTime: "2022-11-23T11:21:34Z"
    currentNetworkState: Ready
    desiredNetworkState: Ready
    externalAddresses:
    - ip: 47.97.227.137
      ports:
      - name: "80"
        port: "512"
        protocol: TCP
    internalAddresses:
    - ip: 172.16.0.189
      ports:
      - name: "80"
        port: "80"
        protocol: TCP
    lastTransitionTime: "2022-11-23T11:21:34Z"
    networkType: AlibabaCloud-NATGW

Clients can access the game server by using 47.97.227.137:512.

Network plugins

OpenKruiseGame supports the following network plugins:

  • Kubernetes-HostPort
  • AlibabaCloud-NATGW
  • AlibabaCloud-SLB
  • AlibabaCloud-SLB-SharedPort

Kubernetes-HostPort

Plugin name

Kubernetes-HostPort

Cloud Provider

Kubernetes

Plugin description

  • HostPort enables game servers to be accessed from the Internet by forwarding Internet traffic to the game servers by using the external IP address and ports exposed by the host where the game servers are located. The exposed IP address of the host must be a public IP address so that the host can be accessed from the Internet.

  • In the configuration file, you can specify a custom range of available host ports. The default port range is 8000 to 9000. This network plugin can help you allocate and manage host ports to prevent port conflicts.

  • This network plugin does not support network isolation.

Network parameters

ContainerPorts

  • Meaning: the name of the container that provides services, the ports to be exposed, and the protocols.
  • Value: in the format of containerName:port1/protocol1,port2/protocol2,... The protocol names must be in uppercase letters. Example: game-server:25565/TCP.
  • Configuration change supported or not: no. The value of this parameter is effective until the pod lifecycle ends.

Plugin configuration

[kubernetes]
enable = true
[kubernetes.hostPort]
# Specify the range of available ports of the host. Ports in this range can be used to forward Internet traffic to pods.
max_port = 9000
min_port = 8000

Kubernetes-Ingress

Plugin name

Kubernetes-Ingress

Cloud Provider

Kubernetes

Plugin description

  • OKG provides the Ingress network model for games such as H5 games that require the application layer network model. This plugin will automatically set the corresponding path for each game server, which is related to the game server ID and is unique for each game server.

  • This network plugin does not support network isolation.

Network parameters

PathType

  • Meaning: Path type. Same as the PathType field in HTTPIngressPath.
  • Value format: Same as the PathType field in HTTPIngressPath.
  • Configuration change supported or not: yes.

Path

  • Meaning: Access path. Each game server has its own access path based on its ID.
  • Value format: Add <id> to any position in the original path(consistent with the Path field in HTTPIngressPath), and the plugin will generate the path corresponding to the game server ID. For example, when setting the path to /game<id>, the path for game server 0 is /game0, the path for game server 1 is /game1, and so on.
  • Configuration change supported or not: yes.

Port

  • Meaning: Port value exposed by the game server.
  • Value format: port number
  • Configuration change supported or not: yes.

IngressClassName

  • Meaning: Specify the name of the IngressClass. Same as the IngressClassName field in IngressSpec.
  • Value format: Same as the IngressClassName field in IngressSpec.
  • Configuration change supported or not: yes.

Host

  • Meaning: Domain name. Same as the Host field in IngressRule.
  • Value format: Same as the Host field in IngressRule.
  • Configuration change supported or not: yes.

TlsHosts

  • Meaning: List of hosts containing TLS certificates. Similar to the Hosts field in IngressTLS.
  • Value format: host1,host2,... For example, xxx.xx1.com,xxx.xx2.com
  • Configuration change supported or not: yes.

TlsSecretName

  • Meaning: Same as the SecretName field in IngressTLS.
  • Value format: Same as the SecretName field in IngressTLS.
  • Configuration change supported or not: yes.

Annotation

  • Meaning: as an annotation of the Ingress object
  • Value format: key: value (note the space after the colon), for example: nginx.ingress.kubernetes.io/rewrite-target: /$2
  • Configuration change supported or not: yes.

additional explanation

  • If you want to fill in multiple annotations, you can define multiple slices named Annotation in the networkConf.
  • Supports filling in multiple paths. The path, path type, and port correspond one-to-one in the order of filling. When the number of paths is greater than the number of path types(or port), non-corresponding paths will match the path type(or port) that was filled in first.

Plugin configuration

None

Example

Set GameServerSet.Spec.Network:

  network:
    networkConf:
    - name: IngressClassName
      value: nginx
    - name: Port
      value: "80"
    - name: Path
      value: /game<id>(/|$)(.*)
    - name: Path
      value: /test-<id>
    - name: Host
      value: test.xxx.cn-hangzhou.ali.com
    - name: PathType
      value: ImplementationSpecific
    - name: TlsHosts
      value: xxx.xx1.com,xxx.xx2.com
    - name: Annotation
      value: 'nginx.ingress.kubernetes.io/rewrite-target: /$2'
    - name: Annotation
      value: 'nginx.ingress.kubernetes.io/random: xxx'
    networkType: Kubernetes-Ingress

This will generate a service and an ingress object for each replica of GameServerSet. The configuration for the ingress of the 0th game server is shown below:

spec:
  ingressClassName: nginx
  rules:
  - host: test.xxx.cn-hangzhou.ali.com
    http:
      paths:
      - backend:
          service:
            name: ing-nginx-0
            port:
              number: 80
        path: /game0(/|$)(.*)
        pathType: ImplementationSpecific
      - backend:
          service:
            name: ing-nginx-0
            port:
              number: 80
        path: /test-0
        pathType: ImplementationSpecific
  tls:
  - hosts:
    - xxx.xx1.com
    - xxx.xx2.com
status:
  loadBalancer:
    ingress:
    - ip: 47.xx.xxx.xxx

The other GameServers only have different path fields and service names, while the other generated parameters are the same.

The network status of GameServer is as follows:

  networkStatus:
    createTime: "2023-04-28T14:00:30Z"
    currentNetworkState: Ready
    desiredNetworkState: Ready
    externalAddresses:
    - ip: 47.xx.xxx.xxx
      ports:
      - name: /game0(/|$)(.*)
        port: 80
        protocol: TCP
      - name: /test-0
        port: 80
        protocol: TCP
    internalAddresses:
    - ip: 10.xxx.x.xxx
      ports:
      - name: /game0(/|$)(.*)
        port: 80
        protocol: TCP
      - name: /test-0
        port: 80
        protocol: TCP
    lastTransitionTime: "2023-04-28T14:00:30Z"
    networkType: Kubernetes-Ingress

AlibabaCloud-NATGW

Plugin name

AlibabaCloud-NATGW

Cloud Provider

AlibabaCloud

Plugin description

  • AlibabaCloud-NATGW enables game servers to be accessed from the Internet by using an Internet NAT gateway of Alibaba Cloud. Internet traffic is forwarded to the corresponding game servers based on DNAT rules.

  • This network plugin does not support network isolation.

Network parameters

Ports

  • Meaning: the ports in the pod to be exposed.
  • Value: in the format of port1,port2,port3… Example: 80,8080,8888.
  • Configuration change supported or not: no.

Protocol

  • Meaning: the network protocol.
  • Value: an example value can be tcp. The value is tcp by default.
  • Configuration change supported or not: no.

Fixed

  • Meaning: whether the mapping relationship is fixed. If the mapping relationship is fixed, the mapping relationship remains unchanged even if the pod is deleted and recreated.
  • Value: false or true.
  • Configuration change supported or not: no.

Plugin configuration

None


AlibabaCloud-SLB

Plugin name

AlibabaCloud-SLB

Cloud Provider

AlibabaCloud

Plugin description

  • AlibabaCloud-SLB enables game servers to be accessed from the Internet by using Layer 4 Classic Load Balancer (CLB) of Alibaba Cloud. CLB is a type of Server Load Balancer (SLB). AlibabaCloud-SLB uses different ports of the same CLB instance to forward Internet traffic to different game servers. The CLB instance only forwards traffic, but does not implement load balancing.

  • This network plugin supports network isolation.

Related design: https://github.com/openkruise/kruise-game/issues/20

Network parameters

SlbIds

  • Meaning: the CLB instance ID. You can specify only one CLB instance ID. Multiple CLB instance IDs will be supported in the future.
  • Value: an example value can be lb-9zeo7prq1m25ctpfrw1m7.
  • Configuration change supported or not: no. The configuration change can be supported in future.

PortProtocols

  • Meaning: the ports in the pod to be exposed and the protocols. You can specify multiple ports and protocols.
  • Value: in the format of port1/protocol1,port2/protocol2,... The protocol names must be in uppercase letters.
  • Configuration change supported or not: no. The configuration change can be supported in future.

Fixed

  • Meaning: whether the mapping relationship is fixed. If the mapping relationship is fixed, the mapping relationship remains unchanged even if the pod is deleted and recreated.
  • Value: false or true.
  • Configuration change supported or not: no.

Plugin configuration

[alibabacloud]
enable = true
[alibabacloud.slb]
# Specify the range of available ports of the CLB instance. Ports in this range can be used to forward Internet traffic to pods. In this example, the range includes 200 ports.
max_port = 700
min_port = 500

AlibabaCloud-SLB-SharedPort

Plugin name

AlibabaCloud-SLB-SharedPort

Cloud Provider

AlibabaCloud

Plugin description

  • AlibabaCloud-SLB-SharedPort enables game servers to be accessed from the Internet by using Layer 4 CLB of Alibaba Cloud. Unlike AlibabaCloud-SLB, AlibabaCloud-SLB-SharedPort uses the same port of a CLB instance to forward traffic to game servers, and the CLB instance implements load balancing. This network plugin applies to stateless network services, such as proxy or gateway, in gaming scenarios.

  • This network plugin supports network isolation.

Network parameters

SlbIds

  • Meaning: the CLB instance IDs. You can specify multiple CLB instance IDs.
  • Value: an example value can be lb-9zeo7prq1m25ctpfrw1m7.
  • Configuration change supported or not: yes.

PortProtocols

  • Meaning: the ports in the pod to be exposed and the protocols. You can specify multiple ports and protocols.
  • Value: in the format of port1/protocol1,port2/protocol2,... The protocol names must be in uppercase letters.
  • Configuration change supported or not: no. The configuration change can be supported in future.

Plugin configuration

None