## 功能概述 如[OKG设计理念](../核心概念/OpenKruiseGame的设计理念.md)中提到的,游戏服接入层网络是游戏开发者非常关注的问题。 非网关架构下,游戏开发者需要考虑如何暴露游戏服的外部IP端口,供玩家连接访问。 在不同场景下,往往需要不同的网络产品,而有时网络产品由云厂商提供。OKG 的 Cloud Provider & Network Plugin 源于此而诞生。 OKG 会集成不同云提供商的不同网络插件,用户可通过GameServerSet设置游戏服的网络参数,并在生成的GameServer中查看网络状态信息,极大降低了游戏服接入网络的复杂度。 ## 使用示例 ### Kubernetes-HostPort OKG支持在原生Kubernetes集群使用HostPort游戏服网络,使用游戏服所在宿主机暴露外部IP及端口,转发至游戏服内部端口中。使用方式如下。 部署一个带有network的GameServerSet: ``` cat <添加到原始路径(与HTTPIngressPath中Path一致)的任意位置,该插件将会生成游戏服ID对应的路径。例如,当设置路径为 /game\,游戏服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字段声明如下: ```yaml network: networkConf: - name: IngressClassName value: nginx - name: Port value: "80" - name: Path value: /game(/|$)(.*) - name: Path value: /test- - 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字段如下所示: ```yaml 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如下: ```yaml 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,...(协议需大写) - 是否支持变更:暂不支持。未来将支持 #### 插件配置 无