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

7.6 KiB
Raw Blame History

功能概述

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

使用示例

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: 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: 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 即可

网络插件附录

当前支持的网络插件:

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

插件名称

HostPort

Cloud Provider

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 

插件名称

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

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

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,...(协议需大写)
  • 是否支持变更:暂不支持。未来将支持

插件配置