kruise-game/docs/中文/用户手册/网络模型.md

12 KiB
Raw Blame History

功能概述

OKG设计理念中提到的,游戏服接入层网络是游戏开发者非常关注的问题。 非网关架构下游戏开发者需要考虑如何暴露游戏服的外部IP端口供玩家连接访问。 在不同场景下往往需要不同的网络产品而有时网络产品由云厂商提供。OKG 的 Cloud Provider & Network Plugin 源于此而诞生。 OKG 会集成不同云提供商的不同网络插件用户可通过GameServerSet设置游戏服的网络参数并在生成的GameServer中查看网络状态信息极大降低了游戏服接入网络的复杂度。

使用示例

Kubernetes-HostPort

OKG支持在原生Kubernetes集群使用HostPort游戏服网络使用游戏服所在宿主机暴露外部IP及端口转发至游戏服内部端口中。使用方式如下。

部署一个带有network的GameServerSet

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:
    #网络配置以k-v键值对的形式传入由网络插件指定。不同网络插件有着不同的网络配置
    - name: ContainerPorts
      #ContainerPorts对应的值格式如下{containerName}:{port1}/{protocol1},{port2}/{protocol2},...
      value: "gameserver:80"
  gameServerTemplate:
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/gs-demo/gameserver:network
          name: gameserver
EOF

生成的GameServer中通过networkStatus字段查看游戏服网络信息

  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

访问 48.98.98.8:8211 即可

AlibabaCloud-NATGW

OKG支持阿里云下NAT网关模型使用NATGW的外部IP与端口暴露服务流量最终将转发至Pod之中。使用方式如下

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
      #暴露的端口,格式如下 {port1},{port2}...
      value: "80"
    - name: Protocol
      #使用的协议默认为TCP
      value: "TCP"
#   - name: Fixed
#     是否固定映射关系默认不固定pod删除后会生成新的外部IP及端口
#     value: true
  gameServerTemplate:
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/gs-demo/gameserver:network
          name: gameserver
EOF

生成的GameServer中通过networkStatus字段查看游戏服网络信息

  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

访问 47.97.227.137:512 即可

网络插件附录

当前支持的网络插件:

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

Kubernetes-HostPort

插件名称

Kubernetes-HostPort

Cloud Provider

Kubernetes

插件说明

  • Kubernetes-HostPort利用宿主机网络通过主机上的端口转发实现游戏服对外暴露服务。宿主机需要配置公网IP有被公网访问的能力。

  • 用户在配置文件中可自定义宿主机开放的端口段默认为8000-9000该网络插件可以帮助用户分配管理宿主机端口尽量避免端口冲突。

  • 该插件不支持网络隔离。

网络参数

ContainerPorts

  • 含义:填写提供服务的容器名以及对应暴露的端口和协议
  • 填写格式containerName:port1/protocol1,port2/protocol2,...(协议需大写) 比如:game-server:25565/TCP
  • 是否支持变更不支持在创建时即永久生效随pod生命周期结束而结束

插件配置

[kubernetes]
enable = true
[kubernetes.hostPort]
#填写宿主机可使用的空闲端口段用于为pod分配宿主机转发端口
max_port = 9000
min_port = 8000 

Kubernetes-Ingress

插件名称

Kubernetes-Ingress

Cloud Provider

Kubernetes

插件说明

  • 针对页游等需要七层网络模型的游戏场景OKG提供了Ingress网络模型。该插件将会自动地为每个游戏服设置对应的访问路径该路径与游戏服ID相关每个游戏服各不相同。
  • 是否支持网络隔离:否

网络参数

Path

  • 含义访问路径。每个游戏服依据ID拥有各自的访问路径。
  • 填写格式:将<id>添加到原始路径(与HTTPIngressPath中Path一致)的任意位置该插件将会生成游戏服ID对应的路径。例如当设置路径为 /game<id>游戏服0对应路径为/game0游戏服1对应路径为/game1以此类推。
  • 是否支持变更:支持

PathType

  • 含义路径类型。与HTTPIngressPath的PathType字段一致。
  • 填写格式与HTTPIngressPath的PathType字段一致。
  • 是否支持变更:支持

Port

  • 含义:游戏服暴露的端口值。
  • 填写格式:端口数字
  • 是否支持变更:支持

IngressClassName

  • 含义指定IngressClass的名称。与IngressSpec的IngressClassName字段一致。
  • 填写格式与IngressSpec的IngressClassName字段一致。
  • 是否支持变更:支持

Host

  • 含义域名。与IngressRule的Host字段一致。
  • 填写格式与IngressRule的Host字段一致。
  • 是否支持变更:支持

TlsHosts

  • 含义包含TLS证书的host列表。含义与IngressTLS的Hosts字段类似。
  • 填写格式host1,host2,... 例如xxx.xx1.com,xxx.xx2.com
  • 是否支持变更:支持

TlsSecretName

  • 含义与IngressTLS的SecretName字段一致。
  • 填写格式与IngressTLS的SecretName字段一致。
  • 是否支持变更:支持

Annotation

  • 含义作为ingress对象的annotation
  • 格式key: value注意:后有空格例如nginx.ingress.kubernetes.io/rewrite-target: /$2
  • 是否支持变更:支持

补充说明

  • 支持填写多个annotation在networkConf中填写多个Annotation以及对应值即可不区分填写顺序。
  • 支持填写多个路径。路径、路径类型、端口按照填写顺序一一对应。当路径数目大于路径类型数目(或端口数目)时,无法找到对应关系的路径按照率先填写的路径类型(或端口)匹配。

插件配置

示例说明

GameServerSet中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

则会生成gss replicas对应数目的service与ingress对象。0号游戏服生成的ingress字段如下所示

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

其他序号的游戏服只有path字段与service name不同生成的其他参数都相同。

对应的0号GameServer的networkStatus如下

  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

插件名称

AlibabaCloud-NATGW

Cloud Provider

AlibabaCloud

插件说明

  • AlibabaCloud-NATGW 使用阿里云公网网关作为游戏服对外服务的承载实体外网流量通过DNAT规则转发至对应的游戏服中。

  • 是否支持网络隔离:否

网络参数

Ports

  • 含义填写pod需要暴露的端口
  • 填写格式port1,port2,port3… 例如80,8080,8888
  • 是否支持变更:不支持

Protocol

  • 含义:填写服务的网络协议
  • 填写格式例如tcp默认为tcp
  • 是否支持变更:不支持

Fixed

  • 含义是否固定访问IP/端口。若是即使pod删除重建网络内外映射关系不会改变
  • 填写格式false / true
  • 是否支持变更:不支持

插件配置


AlibabaCloud-SLB

插件名称

AlibabaCloud-SLB

Cloud Provider

AlibabaCloud

插件说明

  • AlibabaCloud-SLB 使用阿里云经典四层负载均衡SLB又称CLB作为对外服务的承载实体在此模式下不同游戏服将使用同一SLB的不同端口此时SLB只做转发并未均衡流量。

  • 是否支持网络隔离:是

相关设计:https://github.com/openkruise/kruise-game/issues/20

网络参数

SlbIds

  • 含义填写slb的id。暂只支持填写一例未来将支持填写多例
  • 填写格式例如lb-9zeo7prq1m25ctpfrw1m7
  • 是否支持变更:暂不支持。未来将支持

PortProtocols

  • 含义pod暴露的端口及协议支持填写多个端口/协议
  • 格式port1/protocol1,port2/protocol2,...(协议需大写)
  • 是否支持变更:暂不支持。未来将支持

Fixed

  • 含义是否固定访问IP/端口。若是即使pod删除重建网络内外映射关系不会改变
  • 填写格式false / true
  • 是否支持变更:不支持

插件配置

[alibabacloud]
enable = true
[alibabacloud.slb]
#填写slb可使用的空闲端口段用于为pod分配外部接入端口范围为200
max_port = 700
min_port = 500

AlibabaCloud-SLB-SharedPort

插件名称

AlibabaCloud-SLB-SharedPort

Cloud Provider

AlibabaCloud

插件说明

  • AlibabaCloud-SLB-SharedPort 使用阿里云经典四层负载均衡SLB又称CLB作为对外服务的承载实体。但与AlibabaCloud-SLB不同AlibabaCloud-SLB-SharedPort 使用SLB同一端口转发流量具有负载均衡的特点。 适用于游戏场景下代理proxy或网关等无状态网络服务。

  • 是否支持网络隔离:是

网络参数

SlbIds

  • 含义填写slb的id支持填写多例
  • 填写格式例如lb-9zeo7prq1m25ctpfrw1m7
  • 是否支持变更:支持。

PortProtocols

  • 含义pod暴露的端口及协议支持填写多个端口/协议
  • 格式port1/protocol1,port2/protocol2,...(协议需大写)
  • 是否支持变更:暂不支持。未来将支持

插件配置