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

1158 lines
30 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 功能概述
如[OKG设计理念](../核心概念/OpenKruiseGame的设计理念.md)中提到的,游戏服接入层网络是游戏开发者非常关注的问题。
非网关架构下游戏开发者需要考虑如何暴露游戏服的外部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字段查看游戏服网络信息
```shell
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之中。使用方式如下
```shell
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字段查看游戏服网络信息
```shell
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
- Kubernetes-NodePort
- Kubernetes-Ingress
- AlibabaCloud-NATGW
- AlibabaCloud-SLB
- AlibabaCloud-NLB
- AlibabaCloud-EIP
- AlibabaCloud-SLB-SharedPort
- AlibabaCloud-NLB-SharedPort
- Volcengine-CLB
---
### 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
- 是否支持变更:支持
Fixed
- 含义是否需要保持ingress让其不随pod的删除而删除
- 取值true / false
- 是否支持变更:支持
_补充说明_
- 支持填写多个annotation在networkConf中填写多个Annotation以及对应值即可不区分填写顺序。
- 支持填写多个路径。路径、路径类型、端口按照填写顺序一一对应。当路径数目大于路径类型数目(或端口数目)时,无法找到对应关系的路径按照率先填写的路径类型(或端口)匹配。
#### 插件配置
#### 示例说明
GameServerSet中network字段声明如下
```yaml
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字段如下所示
```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。可填写多个。
- 填写格式各个slbId用,分割。例如lb-9zeo7prq1m25ctpfrw1m7,lb-bp1qz7h50yd3w58h2f8je,...
- 是否支持变更支持。可追加填写SLB实例id。建议不要更换正在被使用的实例id。
PortProtocols
- 含义pod暴露的端口及协议支持填写多个端口/协议
- 格式port1/protocol1,port2/protocol2,...(协议需大写)
- 是否支持变更:支持
Fixed
- 含义是否固定访问IP/端口。若是即使pod删除重建网络内外映射关系不会改变
- 填写格式false / true
- 是否支持变更:支持
AllowNotReadyContainers
- 含义:在容器原地升级时允许不断流的对应容器名称,可填写多个
- 格式:{containerName_0},{containerName_1},... 例如sidecar
- 是否支持变更:在原地升级过程中不可变更。
LBHealthCheckSwitch
- 含义:是否开启健康检查
- 格式“on”代表开启“off”代表关闭。默认为on
- 是否支持变更:支持
LBHealthCheckFlag
- 含义是否开启http类型健康检查
- 格式“on”代表开启“off”代表关闭。默认为off
- 是否支持变更:支持
LBHealthCheckType
- 含义:健康检查协议
- 格式:填写 “tcp” 或者 “http”默认为tcp
- 是否支持变更:支持
LBHealthCheckConnectTimeout
- 含义:健康检查响应的最大超时时间。
- 格式:单位:秒。取值范围[1, 300]。默认值为“5”
- 是否支持变更:支持
LBHealthyThreshold
- 含义:健康检查连续成功多少次后,将服务器的健康检查状态由失败判定为成功。
- 格式:取值范围[2, 10]。默认值为“2”
- 是否支持变更:支持
LBUnhealthyThreshold
- 含义:健康检查连续失败多少次后,将服务器的健康检查状态由成功判定为失败。
- 格式:取值范围[2, 10]。默认值为“2”
- 是否支持变更:支持
LBHealthCheckInterval
- 含义:健康检查的时间间隔。
- 格式:单位:秒。取值范围[1, 50]。默认值为“10”
- 是否支持变更:支持
LBHealthCheckProtocolPort
- 含义http类型健康检查的协议及端口。
- 格式:多个值之间用英文半角逗号(,分隔。如https:443,http:80
- 是否支持变更:支持
LBHealthCheckUri
- 含义健康检查类型为HTTP时对应的检查路径。
- 格式长度为1~80个字符只能使用字母、数字、字符。 必须以正斜线(/)开头。
- 是否支持变更:支持
LBHealthCheckDomain
- 含义健康检查类型为HTTP时对应的域名。
- 格式特定域名长度限制1~80个字符只能使用小写字母、数字、短划线-)、半角句号(.)。
- 是否支持变更:支持
LBHealthCheckMethod
- 含义健康检查类型为HTTP时对应的方法。
- 格式“GET” 或者 “HEAD”
- 是否支持变更:支持
#### 插件配置
```
[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,...(协议需大写)
- 是否支持变更:暂不支持。未来将支持
AllowNotReadyContainers
- 含义:在容器原地升级时允许不断流的对应容器名称,可填写多个
- 格式:{containerName_0},{containerName_1},... 例如sidecar
- 是否支持变更:在原地升级过程中不可变更。
#### 插件配置
---
### AlibabaCloud-NLB
#### 插件名称
`AlibabaCloud-NLB`
#### Cloud Provider
AlibabaCloud
#### 插件说明
- AlibabaCloud-NLB 使用阿里云网络型负载均衡作为对外服务的承载实体在此模式下不同游戏服将使用同一NLB的不同端口此时NLB只做转发并未均衡流量。
- 是否支持网络隔离:是
#### 网络参数
NlbIds
- 含义填写nlb的id。可填写多个。
- 填写格式各个nlbId用,分割。例如nlb-ji8l844c0qzii1x6mc,nlb-26jbknebrjlejt5abu,...
- 是否支持变更支持。可追加填写NLB实例id。建议不要更换正在被使用的实例id。
PortProtocols
- 含义pod暴露的端口及协议支持填写多个端口/协议
- 格式port1/protocol1,port2/protocol2,...(协议需大写)
- 是否支持变更:支持
Fixed
- 含义是否固定访问IP/端口。若是即使pod删除重建网络内外映射关系不会改变
- 填写格式false / true
- 是否支持变更:支持
AllowNotReadyContainers
- 含义:在容器原地升级时允许不断流的对应容器名称,可填写多个
- 格式:{containerName_0},{containerName_1},... 例如sidecar
- 是否支持变更:在原地升级过程中不可变更。
LBHealthCheckFlag
- 含义:是否开启健康检查
- 格式“on”代表开启“off”代表关闭。默认为on
- 是否支持变更:支持
LBHealthCheckType
- 含义:健康检查协议
- 格式:填写 “tcp” 或者 “http”默认为tcp
- 是否支持变更:支持
LBHealthCheckConnectPort
- 含义:健康检查的服务器端口。
- 格式:取值范围[0, 65535]。默认值为“0”
- 是否支持变更:支持
LBHealthCheckConnectTimeout
- 含义:健康检查响应的最大超时时间。
- 格式:单位:秒。取值范围[1, 300]。默认值为“5”
- 是否支持变更:支持
LBHealthyThreshold
- 含义:健康检查连续成功多少次后,将服务器的健康检查状态由失败判定为成功。
- 格式:取值范围[2, 10]。默认值为“2”
- 是否支持变更:支持
LBUnhealthyThreshold
- 含义:健康检查连续失败多少次后,将服务器的健康检查状态由成功判定为失败。
- 格式:取值范围[2, 10]。默认值为“2”
- 是否支持变更:支持
LBHealthCheckInterval
- 含义:健康检查的时间间隔。
- 格式:单位:秒。取值范围[1, 50]。默认值为“10”
- 是否支持变更:支持
LBHealthCheckUri
- 含义健康检查类型为HTTP时对应的检查路径。
- 格式长度为1~80个字符只能使用字母、数字、字符。 必须以正斜线(/)开头。
- 是否支持变更:支持
LBHealthCheckDomain
- 含义健康检查类型为HTTP时对应的域名。
- 格式特定域名长度限制1~80个字符只能使用小写字母、数字、短划线-)、半角句号(.)。
- 是否支持变更:支持
LBHealthCheckMethod
- 含义健康检查类型为HTTP时对应的方法。
- 格式“GET” 或者 “HEAD”
- 是否支持变更:支持
#### 插件配置
```
[alibabacloud]
enable = true
[alibabacloud.nlb]
#填写nlb可使用的空闲端口段用于为pod分配外部接入端口范围为500
max_port = 1500
min_port = 1000
```
#### 示例说明
```
cat <<EOF | kubectl apply -f -
apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
name: gs-nlb
namespace: default
spec:
replicas: 1
updateStrategy:
rollingUpdate:
podUpdatePolicy: InPlaceIfPossible
network:
networkConf:
- name: NlbIds
value: nlb-muyo7fv6z646ygcxxx
- name: PortProtocols
value: "80"
- name: Fixed
value: "true"
- name: LBHealthCheckFlag
value: "off"
networkType: AlibabaCloud-NLB
gameServerTemplate:
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/gs-demo/gameserver:network
name: gameserver
EOF
```
生成的GameServer中通过networkStatus字段查看游戏服网络信息
```
networkStatus:
createTime: "2024-04-28T12:41:56Z"
currentNetworkState: Ready
desiredNetworkState: Ready
externalAddresses:
- endPoint: nlb-muyo7fv6z646ygcxxx.cn-xxx.nlb.aliyuncs.com
ip: ""
ports:
- name: "80"
port: 1047
protocol: TCP
internalAddresses:
- ip: 172.16.0.1
ports:
- name: "80"
port: 80
protocol: TCP
lastTransitionTime: "2024-04-28T12:41:56Z"
networkType: AlibabaCloud-NLB
```
访问 nlb-muyo7fv6z646ygcxxx.cn-xxx.nlb.aliyuncs.com:1047 即可
---
### AlibabaCloud-EIP
#### 插件名称
`AlibabaCloud-EIP`
#### Cloud Provider
AlibabaCloud
#### 插件说明
- 为每个GameServer单独分配EIP
- 暴露的公网访问端口与容器中监听的端口一致,通过安全组管理
- 需要在ACK集群安装最新版本ack-extend-network-controller组件详情请见[组件说明页](https://cs.console.aliyun.com/#/next/app-catalog/ack/incubator/ack-extend-network-controller)
#### 网络参数
ReleaseStrategy
- 含义EIP回收策略。
- 填写格式:
- Follow默认值跟随游戏服生命周期。当游戏服被删除时EIP也将被回收。
- Never不删除podEIP。当不需要时需要手动删除这个podEIP。(通过kubectl delete podeip {游戏服name} -n {游戏服所在namespace})
- 可直接配置过期时间例如5m30s表示Pod删除5.5分钟后删除podEIP。支持Go类型时间表达式。
- 是否支持变更:否
PoolId
- 含义EIP地址池ID。可为空则不使用EIP地址池。
- 是否支持变更:否
ResourceGroupId
- 含义EIP资源组ID。可为空则使用默认资源组。
- 是否支持变更:否
Bandwidth
- 含义峰值带宽。单位Mbps。可为空默认为5
- 是否支持变更:否
BandwidthPackageId
- 含义要绑定已有的共享带宽包ID。可为空则EIP不绑定共享带宽包。
- 是否支持变更:否
ChargeType
- 含义EIP的计费方式。
- 填写格式:
- PayByTraffic按使用流量计费。
- PayByBandwidth按带宽计费为默认值。
- 是否支持变更:否
Description
- 含义对EIP资源的描述。
- 是否支持变更:否
#### 插件配置
#### 示例说明
```yaml
apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
name: eip-nginx
namespace: default
spec:
replicas: 1
updateStrategy:
rollingUpdate:
podUpdatePolicy: InPlaceIfPossible
network:
networkType: AlibabaCloud-EIP
networkConf:
- name: ReleaseStrategy
value: Never
- name: Bandwidth
value: "3"
- name: ChargeType
value: PayByTraffic
gameServerTemplate:
spec:
containers:
- image: nginx
name: nginx
```
生成的gameserver eip-nginx-0 networkStatus字段如下所示
```yaml
networkStatus:
createTime: "2023-07-17T10:10:18Z"
currentNetworkState: Ready
desiredNetworkState: Ready
externalAddresses:
- ip: 47.98.xxx.xxx
internalAddresses:
- ip: 192.168.1.51
lastTransitionTime: "2023-07-17T10:10:18Z"
networkType: AlibabaCloud-EIP
```
生成对应的podeip eip-nginx-0 如下所示:
```yaml
apiVersion: alibabacloud.com/v1beta1
kind: PodEIP
metadata:
annotations:
k8s.aliyun.com/eip-controller: ack-extend-network-controller
creationTimestamp: "2023-07-17T09:58:12Z"
finalizers:
- podeip-controller.alibabacloud.com/finalizer
generation: 1
name: eip-nginx-1
namespace: default
resourceVersion: "41443319"
uid: 105a9575-998e-4e17-ab91-8f2597eeb55f
spec:
allocationID: eip-xxx
allocationType:
releaseStrategy: Never
type: Auto
status:
eipAddress: 47.98.xxx.xxx
internetChargeType: PayByTraffic
isp: BGP
networkInterfaceID: eni-xxx
podLastSeen: "2023-07-17T10:36:02Z"
privateIPAddress: 192.168.1.51
resourceGroupID: rg-xxx
status: InUse
```
此外生成的EIP资源在阿里云控制台中会以{pod namespace}/{pod name}命名,与每一个游戏服一一对应。
### AlibabaCloud-NLB-SharedPort
#### 插件名称
`AlibabaCloud-NLB-SharedPort`
#### Cloud Provider
AlibabaCloud
#### 插件说明
- AlibabaCloud-NLB-SharedPort 使用阿里云网络型负载均衡NLB作为对外服务的承载实体。其与AlibabaCloud-SLB-SharedPort作用类似。
适用于游戏场景下代理proxy或网关等无状态网络服务。
- 是否支持网络隔离:是
#### 网络参数
SlbIds
- 含义填写nlb的id暂不支持填写多例
- 填写格式例如nlb-9zeo7prq1m25ctpfrw1m7
- 是否支持变更:暂不支持。
PortProtocols
- 含义pod暴露的端口及协议支持填写多个端口/协议
- 格式port1/protocol1,port2/protocol2,...(协议需大写)
- 是否支持变更:暂不支持。
AllowNotReadyContainers
- 含义:在容器原地升级时允许不断流的对应容器名称,可填写多个
- 格式:{containerName_0},{containerName_1},... 例如sidecar
- 是否支持变更:在原地升级过程中不可变更。
#### 插件配置
#### 示例说明
部署一个具有两个容器的GameServerSet一个容器名为app-2048另一个为sidecar。
指定网络参数 AllowNotReadyContainers 为 sidecar则在sidecar原地更新时整个pod依然会提供服务不会断流。
```yaml
apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
name: gss-2048-nlb
namespace: default
spec:
replicas: 3
updateStrategy:
rollingUpdate:
maxUnavailable: 100%
podUpdatePolicy: InPlaceIfPossible
network:
networkType: AlibabaCloud-NLB-SharedPort
networkConf:
- name: NlbIds
value: nlb-26jbknebrjlejt5abu
- name: PortProtocols
value: 80/TCP
- name: AllowNotReadyContainers
value: sidecar
gameServerTemplate:
spec:
containers:
- image: registry.cn-beijing.aliyuncs.com/acs/2048:v1.0
name: app-2048
volumeMounts:
- name: shared-dir
mountPath: /var/www/html/js
- image: registry.cn-beijing.aliyuncs.com/acs/2048-sidecar:v1.0
name: sidecar
args:
- bash
- -c
- rsync -aP /app/js/* /app/scripts/ && while true; do echo 11;sleep 2; done
volumeMounts:
- name: shared-dir
mountPath: /app/scripts
volumes:
- name: shared-dir
emptyDir: {}
```
部署成功后将sidecar镜像更新到v2.0版本同时观察对应endpoint情况:
```bash
kubectl get ep -w | grep nlb-26jbknebrjlejt5abu
nlb-26jbknebrjlejt5abu 192.168.0.8:80,192.168.0.82:80,192.168.63.228:80 10m
```
等待整个更新过程结束可以发现ep没有任何变化说明并未进行摘流。
---
### TencentCloud-CLB
#### 插件名称
`TencentCloud-CLB`
#### Cloud Provider
TencentCloud
#### 插件说明
- TencentCloud-CLB 使用腾讯云负载均衡器CLB作为对外服务的承载实体在此模式下不同游戏服使用 CLB 的不同端口对外暴露,此时 CLB 只做转发,并未均衡流量。
- 需安装 [tke-extend-network-controller](https://github.com/tkestack/tke-extend-network-controller) 网络插件(可通过 TKE 应用市场安装)。
- 是否支持网络隔离:是。
#### 网络参数
ClbIds
- 含义填写clb的id。可填写多个。
- 填写格式各个clbId用,分割。例如lb-xxxx,lb-yyyy,...
- 是否支持变更:支持。
PortProtocols
- 含义pod暴露的端口及协议支持填写多个端口/协议。
- 格式port1/protocol1,port2/protocol2,...(协议需大写)
- 是否支持变更:支持。
#### 插件配置
```
[tencentcloud]
enable = true
[tencentcloud.clb]
# 填写clb可使用的空闲端口段用于为pod分配外部接入端口
min_port = 1000
max_port = 1100
```
#### 示例说明
```yaml
apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
name: clb-nginx
namespace: default
spec:
replicas: 1
updateStrategy:
rollingUpdate:
podUpdatePolicy: InPlaceIfPossible
network:
networkType: TencentCloud-CLB
networkConf:
- name: ClbIds
value: "lb-3ip9k5kr,lb-4ia8k0yh"
- name: PortProtocols
value: "80/TCP,7777/UDP"
gameServerTemplate:
spec:
containers:
- image: nginx
name: nginx
```
生成的 gameserver clb-nginx-0 networkStatus 字段如下所示:
```yaml
networkStatus:
createTime: "2024-10-28T03:16:20Z"
currentNetworkState: Ready
desiredNetworkState: Ready
externalAddresses:
- ip: 139.155.64.52
ports:
- name: "80"
port: 1002
protocol: TCP
- ip: 139.155.64.52
ports:
- name: "7777"
port: 1003
protocol: UDP
internalAddresses:
- ip: 172.16.7.106
ports:
- name: "80"
port: 80
protocol: TCP
- ip: 172.16.7.106
ports:
- name: "7777"
port: 7777
protocol: UDP
lastTransitionTime: "2024-10-28T03:16:20Z"
networkType: TencentCloud-CLB
```
## 获取网络信息
GameServer Network Status可以通过两种方式获取
### k8s API
调用K8s API获取GameServer对象。该方式适用于中心组件通常在匹配服务获取游戏服网络信息用于路由选择等。
### DownwardAPI
通过DownwardAPI将网络信息下沉至业务容器中供游戏服业务容器使用
该方法的示例如下:
```yaml
apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
name: gs-slb
namespace: default
spec:
replicas: 1
updateStrategy:
rollingUpdate:
podUpdatePolicy: InPlaceIfPossible
network:
networkType: AlibabaCloud-SLB
networkConf:
- name: SlbIds
value: "xxx"
- name: PortProtocols
value: "xxx"
- name: Fixed
value: true
gameServerTemplate:
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/gs-demo/gameserver:network
name: gameserver
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo
volumes:
- name: podinfo
downwardAPI:
items:
- path: "network"
fieldRef:
fieldPath: metadata.annotations['game.kruise.io/network-status']
```
字段说明:
- 在对应container字段中声明 volumeMounts定义访问路径此例中为 /etc/podinfo
- 在 gameServerTemplate.spec 里声明downwardAPI文件名设置为 “network“并指定使用 “game.kruise.io/network-status” 该annotation。注意annotation的key要使用单引号''双引号pod将创建失败。
业务pod及容器创建成功后在对应的/etc/podinfo路径下存在 network 文件其中记录了序列化后的网络信息该信息可通过json解码成对应structure在程序获取相应字段使用。解码的sample如下golang版本
```go
package demo
import (
"encoding/json"
"github.com/openkruise/kruise-game/apis/v1alpha1"
"os"
)
func getNetwork() {
network, err := os.ReadFile("/etc/podinfo/network")
if err != nil {
return
}
networkStatus := &v1alpha1.NetworkStatus{}
err = json.Unmarshal(network, networkStatus)
if err != nil {
return
}
// 访问networkStatus各个字段
}
```