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

54 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
  • Kubernetes-NodePort
  • Kubernetes-Ingress
  • AlibabaCloud-NATGW
  • AlibabaCloud-SLB
  • AlibabaCloud-NLB
  • AlibabaCloud-EIP
  • AlibabaCloud-SLB-SharedPort
  • AlibabaCloud-NLB-SharedPort
  • Volcengine-CLB
  • Volcengine-EIP
  • HwCloud-ELB
  • HwCloud-CCE-ELB
  • HwCloud-CCE-EIP

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字段声明如下

  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。可填写多个。
  • 填写格式各个slbId用,分割。例如lb-9zeo7prq1m25ctpfrw1m7,lb-bp1qz7h50yd3w58h2f8je,...
  • 是否支持变更支持。可追加填写SLB实例id。建议不要更换正在被使用的实例id。

PortProtocols

  • 含义pod暴露的端口及协议支持填写多个端口/协议
  • 格式port1/protocol1,port2/protocol2,... (多协议相同端口 比如: 8000/TCPUDP)(协议需大写)
  • 是否支持变更:支持

Fixed

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

ExternalTrafficPolicyType

  • 含义Service LB 是否只转发给本地实例。若是Local 创建Local类型Service, 配合cloud-manager只配置对应Node可以保留客户端源IP地址
  • 填写格式: Local/Cluster 默认Cluster
  • 是否支持变更不支持。跟是否固定IP/端口有关系,建议不更改

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组件详情请见组件说明页

网络参数

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资源的描述。
  • 是否支持变更:否

插件配置

示例说明

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字段如下所示

  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 如下所示:

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}命名,与每一个游戏服一一对应。


Volcengine-EIP

插件名称

Volcengine-EIP

Cloud Provider

Volcengine

插件说明

  • 为每个 GameServer 单独分配或绑定火山引擎的弹性公网 IPEIP支持通过注解或 networkConf 指定已有 EIP 或自动分配新 EIP。
  • 暴露的公网访问端口与容器中监听的端口一致,安全组策略需自行配置。
  • 适用于需要公网访问能力的游戏服务器等场景。
  • 需要在集群中安装 vpc-cni-controlplane 组件,详情请见组件说明页 `

网络参数

更多参数请参考:https://www.volcengine.com/docs/6460/1152127

name

  • EIP 名称,未指定时由系统自动生成。
  • 是否支持变更:否

isp

  • EIP 线路类型
  • 是否支持变更:否

projectName

  • 含义EIP 所属项目名称,默认为 default。
  • 是否支持变更:否

bandwidth

  • 含义峰值带宽。单位Mbps。可为空
  • 是否支持变更:否

bandwidthPackageId

  • 含义:要绑定的共享带宽包 ID。可为空则 EIP 不绑定共享带宽包。
  • 是否支持变更:否

billingType

  • 含义EIP 的计费方式。
  • EIP 计费方式,取值:
    • 2默认值按量计费-按带宽上限计费。
    • 3按量计费-按实际流量计费。
  • 是否支持变更:否

description

  • 含义:对 EIP 资源的描述。
  • 是否支持变更:否

注解参数

  • vke.volcengine.com/primary-eip-id:指定已有 EIP IDPod 启动时绑定该 EIP。

插件配置

示例说明

apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
  name: eip-nginx
  namespace: default
spec:
  replicas: 1
  updateStrategy:
    rollingUpdate:
      podUpdatePolicy: InPlaceIfPossible
  network:
    networkType: Volcengine-EIP
  gameServerTemplate:
    spec:
      containers:
        - image: nginx
          name: nginx

生成的 GameServer networkStatus 字段如下所示:

  networkStatus:
    createTime: "2025-01-17T10:10:18Z"
    currentNetworkState: Ready
    desiredNetworkState: Ready
    externalAddresses:
    - ip: 106.xx.xx.xx
    internalAddresses:
    - ip: 192.168.1.51
    lastTransitionTime: "2025-01-17T10:10:18Z"
    networkType: Volcengine-EIP

Pod 相关注解示例:

metadata:
  annotations:
    vke.volcengine.com/primary-eip-id: eip-xxx
    vke.volcengine.com/primary-eip-attributes: '{"bandwidth":3,"billingType":"2"}'

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依然会提供服务不会断流。

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情况:

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 网络插件(可通过 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

HwCloud-ELB

Plugin name

HwCloud-ELB

Cloud Provider

HwCloud

Plugin description

  • HwCloud-ELB 使用华为云负载均衡器ELB作为对外服务的承载实体在此模式下不同游戏服使用 ELB 的不同端口对外暴露,此时 ELB 只做转发,并未均衡流量。
  • 需安装https://github.com/kubernetes-sigs/cloud-provider-huaweicloud
  • 是否支持网络隔离:是。

Network parameters

ElbIds

  • 含义: elb 的ID, 可填写多个 (必须至少1)
  • 填写格式: 例如 "lb-9zeo7prq1m25ctpfrw1m7,lb-bp1qz7h50yd3w58h2f8je"
  • 是否支持变更:支持,只追加

PortProtocols

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

Fixed

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

AllowNotReadyContainers

  • 含义:在容器原地升级时允许不断流的对应容器名称,可填写多个
  • 格式:{containerName_0},{containerName_1},... 例如sidecar
  • 是否支持变更:在原地升级过程中不可变更。

ExternalTrafficPolicyType

  • 含义Service LB 是否只转发给本地实例。若是Local 创建Local类型Service, 配合cloud-manager只配置对应Node可以保留客户端源IP地址
  • 填写格式: Local/Cluster 默认Cluster
  • 是否支持变更不支持。跟是否固定IP/端口有关系,建议不更改

LB config parameters consistent with huawei cloud ccm https://github.com/kubernetes-sigs/cloud-provider-huaweicloud/blob/master/docs/usage-guide.md

LBHealthCheckFlag

  • 含义:是否开启健康检查
  • 填写格式: on 或者 off ,默认 on
  • 是否支持变更:支持

LBHealthCheckOption

  • 含义:健康检查的配置信息
  • 填写格式: json 字符串 比如 {"delay": 3, "timeout": 15, "max_retries": 3} 默认空
  • 是否支持变更:支持

ElbClass

  • 含义elb 类型
  • 填写格式: 独享dedicated 或者 共享shared 默认dedicated
  • 是否支持变更:不支持

ElbConnLimit

  • 含义共享型LB的连接限制数
  • 填写格式: -1 到 2147483647 默认-1 不限制
  • 是否支持变更:不支持

ElbLbAlgorithm

  • 含义RS 的 LB 算法
  • 填写格式: ROUND_ROBIN,LEAST_CONNECTIONS,SOURCE_IP default ROUND_ROBIN
  • 是否支持变更: 支持

ElbSessionAffinityFlag

  • 含义是否开启session亲和
  • 填写格式: on 或者 off 默认 off
  • 是否支持变更:不支持

ElbSessionAffinityOption

  • 含义session亲和的超时配置
  • 填写格式: json 字符串 比如 {"type": "SOURCE_IP", "persistence_timeout": 15}
  • 是否支持变更:支持

ElbTransparentClientIP

  • 含义是否透传源IP
  • 填写格式: true 或者 false 默认 false
  • 是否支持变更:支持

ElbXForwardedHost

  • 含义是否重写X-Forwarded-Host头
  • 填写格式: true 或者 false 默认 false
  • 是否支持变更:支持

ElbIdleTimeout

  • 含义rs 的空闲超时时间,最后会彻底删除
  • 填写格式: 0 到 4000默认不设置使用LB的默认配置
  • 是否支持变更:支持

ElbRequestTimeout

  • 含义httphttps请求超时时间
  • 填写格式: 1 到 300默认不设置使用LB的默认配置
  • 是否支持变更:支持

ElbResponseTimeout

  • 含义httphttps响应超时时间
  • 填写格式: 1 到 300默认不设置使用LB的默认配置
  • 是否支持变更:支持

Plugin configuration

[hwcloud]
enable = true
[hwcloud.elb]
max_port = 700
min_port = 500
block_ports = []

示例说明

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 字段如下所示:

  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

HwCloud-CCE-ELB

插件名称

HwCloud-CCE-ELB
注意:

  • 此插件仅仅适用于华为云的CCE Standard和CCE Turbo集群.
  • 如果使用已有的ELB, 请保证ELB的VPC和CCE集群的VPC一致, 否则无法访问.

Cloud Provider

HuaweiCloud

插件说明

  • HwCloud-ELB 使用华为云负载均衡器ELB作为对外服务的承载实体可以通过弹性负载均衡ELB将外部流量向集群内的多个Pod进行分发与NodePort类型相比提供了高可靠的保障。
  • 支持的annotations,可以参看文档: https://support.huaweicloud.com/usermanual-cce/cce_10_0681.html
  • 暴露的公网访问端口与容器中监听的端口一致.
  • 可以绑定安全组进行管理(使用注解为Pod绑定安全组),需要CCE Turbo集群才支持。
    • Pod的网卡使用annotation配置的安全组: yangtse.io/security-group-ids
    • Pod的网卡在使用已有安全组的基础上额外再增加annotation配置的安全组: yangtse.io/additional-security-group-ids
  • 是否支持网络隔离:是。

网络参数

PortProtocols

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

Fixed

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

AllowNotReadyContainers

  • 含义:在容器原地升级时允许不断流的对应容器名称,可填写多个
  • 格式:{containerName_0},{containerName_1},... 例如sidecar
  • 是否支持变更:在原地升级过程中不可变更。

ExternalTrafficPolicyType

  • 含义Service LB 是否只转发给本地实例。若是Local 创建Local类型Service, 配合cloud-manager只配置对应Node可以保留客户端源IP地址
  • 填写格式: Local/Cluster 默认Cluster
  • 是否支持变更不支持。跟是否固定IP/端口有关系,建议不更改

其他与华为CCE集群相关的参数
参考文档里的annotation的key与value进行填写

Plugin configuration

这里的端口范围可以根据您的业务范围自行配置, block_ports请参考这个issue: https://github.com/openkruise/kruise-game/issues/174

[hwcloud]
enable = true
[hwcloud.cce.elb]
max_port = 65535
min_port = 32768
block_ports = []

示例说明

使用已有的elb(https://support.huaweicloud.com/usermanual-cce/cce_10_0385.html#section1),其他可用的annotation请参考华为云文档

apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
  name: hw-cce-elb-nginx
  namespace: default
spec:
  replicas: 2
  updateStrategy:
    rollingUpdate:
      podUpdatePolicy: InPlaceIfPossible
  network:
    networkType: HwCloud-CCE-ELB
    networkConf:
      - name: PortProtocols
        value: "80/TCP"
      - name: kubernetes.io/elb.class # ELB实例的类型
        value: performance
      - name: kubernetes.io/elb.id # ELB实例的ID
        value: 8f4cf216-a659-40dc-8c77-xxxx
  gameServerTemplate:
    spec:
      containers:
        - image: nginx
          name: nginx

生成的svc如下所示,可以看到2个svc都指向了同一个elb:

apiVersion: v1
kind: Service
metadata:
  annotations:
    game.kruise.io/network-config-hash: "3594992400"
    kubernetes.io/elb.class: performance
    kubernetes.io/elb.connection-drain-enable: "true"
    kubernetes.io/elb.connection-drain-timeout: "300"
    kubernetes.io/elb.id: 8f4cf216-a659-40dc-8c77-xxxx
    kubernetes.io/elb.mark: "0"
  creationTimestamp: "2025-07-23T08:15:09Z"
  finalizers:
    - service.kubernetes.io/load-balancer-cleanup
  name: hw-cce-elb-nginx-0
  namespace: kruise-game-system
  ownerReferences:
    - apiVersion: v1
      blockOwnerDeletion: true
      controller: true
      kind: Pod
      name: hw-cce-elb-nginx-0
      uid: 4f9f37f9-16d4-4ee7-b553-9b6e0039c5d5
  resourceVersion: "13369506"
  uid: 23815818-a626-4be3-b31f-4b95a4f89786
spec:
  allocateLoadBalancerNodePorts: true
  clusterIP: 10.247.213.xxx
  clusterIPs:
    - 10.247.213.xxx
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  loadBalancerIP: 192.168.0.xxx
  ports:
    - name: 80-tcp
      nodePort: 30622
      port: 3308
      protocol: TCP
      targetPort: 80
    - name: 80-udp
      nodePort: 30622
      port: 3308
      protocol: UDP
      targetPort: 80
  selector:
    statefulset.kubernetes.io/pod-name: hw-cce-elb-nginx-0
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
      - ip: 192.168.0.xxx
      - ip: 189.1.225.xxx

---
apiVersion: v1
kind: Service
metadata:
  annotations:
    game.kruise.io/network-config-hash: "3594992400"
    kubernetes.io/elb.class: performance
    kubernetes.io/elb.connection-drain-enable: "true"
    kubernetes.io/elb.connection-drain-timeout: "300"
    kubernetes.io/elb.id: 8f4cf216-a659-40dc-8c77-xxxx
    kubernetes.io/elb.mark: "0"
  creationTimestamp: "2025-07-23T08:15:08Z"
  finalizers:
    - service.kubernetes.io/load-balancer-cleanup
  name: hw-cce-elb-nginx-1
  namespace: kruise-game-system
  ownerReferences:
    - apiVersion: v1
      blockOwnerDeletion: true
      controller: true
      kind: Pod
      name: hw-cce-elb-nginx-1
      uid: 0f42b430-49ba-4203-8b50-4be059619b79
  resourceVersion: "13369489"
  uid: 92a56054-ad92-4dbd-9d1b-e717e0a14af2
spec:
  allocateLoadBalancerNodePorts: true
  clusterIP: 10.247.14.xxx
  clusterIPs:
    - 10.247.14.xxx
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  loadBalancerIP: 192.168.0.xxx
  ports:
    - name: 80-tcp
      nodePort: 32227
      port: 3611
      protocol: TCP
      targetPort: 80
    - name: 80-udp
      nodePort: 32227
      port: 3611
      protocol: UDP
      targetPort: 80
  selector:
    statefulset.kubernetes.io/pod-name: hw-cce-elb-nginx-1
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
      - ip: 192.168.0.xxx
      - ip: 189.1.225.xxx

生成的svc如下,可以看到2个svc指向了同一个ip, 只是端口不同:

kubectl get svc |grep hw-cce-elb-nginx
hw-cce-elb-nginx-0                           LoadBalancer   10.247.213.xxx   189.1.225.xxx,192.168.0.xxx   3308:30622/TCP,3308:30622/UDP   2m3s
hw-cce-elb-nginx-1                           LoadBalancer   10.247.14.xxx    189.1.225.xxx,192.168.0.xxx   3611:32227/TCP,3611:32227/UDP   2m4s

自动创建ELB并绑定到创建出来的svc上面 注意:

  • 自动创建elb,如果为多副本,每个svc都使用自动创建的elb,每个elb的id是不一样的,暴露的external ip也是不一样的.
  • 当删除svc时, 关联的自动创建的elb也会被删除.
apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
  name: hw-cce-elb-auto-performance
  namespace: kruise-game-system
spec:
  replicas: 2
  updateStrategy:
    rollingUpdate:
      podUpdatePolicy: InPlaceIfPossible
  network:
    networkType: HwCloud-CCE-ELB
    networkConf:
      - name: PortProtocols
        value: "80/TCP"
      - name: kubernetes.io/elb.class
        value: performance # ELB实例的类型
      - name: kubernetes.io/elb.autocreate # 自动创建ELB的选项: https://support.huaweicloud.com/usermanual-cce/cce_10_0385.html#section21
        value: '{
                  "type": "public",
                  "bandwidth_name": "bandwidth-xxxx",
                  "bandwidth_chargemode": "traffic",
                  "bandwidth_size": 5,
                  "bandwidth_sharetype": "PER",
                  "eip_type": "5_bgp",
                  "available_zone": [
                     "ap-southeast-1a",
                     "ap-southeast-1b"
                  ],
                  "l4_flavor_name": "L4_flavor.elb.s1.small"
                }'
      - name: kubernetes.io/elb.enterpriseID # 创建出来的负载均衡所属企业项目ID
        value: 'aff97261-4dbd-4593-8236-xxxx'
      - name: kubernetes.io/elb.lb-algorithm
        value: ROUND_ROBIN # 负载均衡器算法
  gameServerTemplate:
    spec:
      containers:
        - image: nginx
          name: nginx
         

生成的svc如下所示,可以看到2个svc都指向不同的elb:

apiVersion: v1
kind: Service
metadata:
  annotations:
    game.kruise.io/network-config-hash: "3090934611"
    kubernetes.io/elb.autocreate: '{ "type": "public", "bandwidth_name": "bandwidth-89f0",
      "bandwidth_chargemode": "traffic", "bandwidth_size": 5, "bandwidth_sharetype":
      "PER", "eip_type": "5_bgp", "available_zone": [ "ap-southeast-1a", "ap-southeast-1b"
      ], "l4_flavor_name": "L4_flavor.elb.s1.small" }'
    kubernetes.io/elb.class: performance
    kubernetes.io/elb.eip-id: 566d5f4c-3484-4d7e-aa6b-xxxx
    kubernetes.io/elb.enterpriseID: aff97261-4dbd-4593-8236-xxxx
    kubernetes.io/elb.id: 75e06e8b-a246-48cb-b05c-xxxx
    kubernetes.io/elb.lb-algorithm: ROUND_ROBIN
    kubernetes.io/elb.mark: "0"
  creationTimestamp: "2025-07-23T09:25:01Z"
  finalizers:
    - service.kubernetes.io/load-balancer-cleanup
  name: hw-cce-elb-auto-performance-0
  namespace: kruise-game-system
  ownerReferences:
    - apiVersion: v1
      blockOwnerDeletion: true
      controller: true
      kind: Pod
      name: hw-cce-elb-auto-performance-0
      uid: 1da0edf4-f45d-4635-8db0-ed5ccea2441d
  resourceVersion: "13401553"
  uid: 13efd440-65a7-4b45-bafc-2268102a4fd7
spec:
  allocateLoadBalancerNodePorts: true
  clusterIP: 10.247.50.xxx
  clusterIPs:
    - 10.247.50.xxx
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  loadBalancerIP: 49.0.251.xxx
  ports:
    - name: 80-tcp
      nodePort: 30918
      port: 1
      protocol: TCP
      targetPort: 80
  selector:
    statefulset.kubernetes.io/pod-name: hw-cce-elb-auto-performance-0
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
      - ip: 49.0.251.xxx
      - ip: 192.168.1.xxx
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    game.kruise.io/network-config-hash: "3090934611"
    kubernetes.io/elb.autocreate: '{ "type": "public", "bandwidth_name": "bandwidth-89f0",
      "bandwidth_chargemode": "traffic", "bandwidth_size": 5, "bandwidth_sharetype":
      "PER", "eip_type": "5_bgp", "available_zone": [ "ap-southeast-1a", "ap-southeast-1b"
      ], "l4_flavor_name": "L4_flavor.elb.s1.small" }'
    kubernetes.io/elb.class: performance
    kubernetes.io/elb.eip-id: 4a5396b1-e750-4ba5-a5d3-xxxx
    kubernetes.io/elb.enterpriseID: aff97261-4dbd-4593-8236-xxxx
    kubernetes.io/elb.id: b093db79-3c3e-4e77-a2ee-xxxx
    kubernetes.io/elb.lb-algorithm: ROUND_ROBIN
    kubernetes.io/elb.mark: "0"
  creationTimestamp: "2025-07-23T09:25:01Z"
  finalizers:
    - service.kubernetes.io/load-balancer-cleanup
  name: hw-cce-elb-auto-performance-1
  namespace: kruise-game-system
  ownerReferences:
    - apiVersion: v1
      blockOwnerDeletion: true
      controller: true
      kind: Pod
      name: hw-cce-elb-auto-performance-1
      uid: abfc9ad1-1ae3-45fa-b956-4617c465a44f
  resourceVersion: "13401664"
  uid: 01dd8e13-b1c8-4d9f-8b1c-13c2f001c614
spec:
  allocateLoadBalancerNodePorts: true
  clusterIP: 10.247.196.xxx
  clusterIPs:
    - 10.247.196.xxx
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  loadBalancerIP: 150.40.245.xxx
  ports:
    - name: 80-tcp
      nodePort: 30942
      port: 1
      protocol: TCP
      targetPort: 80
  selector:
    statefulset.kubernetes.io/pod-name: hw-cce-elb-auto-performance-1
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
      - ip: 150.40.245.xxx
      - ip: 192.168.1.xxx

生成的svc如下,可以看到2个svc指向不同的external ip:

kubectl get svc |grep hw-cce-elb-auto-performance
hw-cce-elb-auto-performance-0                    LoadBalancer   10.247.50.xxx    192.168.1.xxx,49.0.251.xxx      1:30918/TCP                       4m29s
hw-cce-elb-auto-performance-1                    LoadBalancer   10.247.196.xxx   150.40.245.xxx,192.168.1.xxx    1:30942/TCP                       4m29s

HwCloud-CCE-EIP

插件名称

HwCloud-CCE-EIP
注意: 此插件仅仅适用于华为云的CCE Turbo集群

Cloud Provider

HuaweiCloud

插件说明

  • 仅适用于华为云CCE Turbo集群: https://support.huaweicloud.com/usermanual-cce/cce_10_0284.html#section1
  • 为每个pod单独分配EIP
  • 暴露的公网访问端口与容器中监听的端口一致,可以绑定安全组进行管理(使用注解为Pod绑定安全组)
    • Pod的网卡使用annotation配置的安全组: yangtse.io/security-group-ids
    • Pod的网卡在使用已有安全组的基础上额外再增加annotation配置的安全组: yangtse.io/additional-security-group-ids
  • 支持自动创建EIP并绑定到对应的pod上, 或者使用已有的EIP
  • 自动创建EIP时不支持指定企业项目

网络参数

参考华为云的文档: https://support.huaweicloud.com/usermanual-cce/cce_10_0734.html, 本插件支持这个页面所有的annotation.

插件配置

示例说明

独占带宽EIP跟随Pod创建, 其他可用的annotation请参考华为云文档
注意: 这里创建出来的EIP属于default这个企业项目, 华为云CCE Turbo集群暂时不支持在这种模式下指定企业项目

apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
  name: hw-cce-eip-performance
  namespace: default
spec:
  replicas: 2
  updateStrategy:
    rollingUpdate:
      podUpdatePolicy: InPlaceIfPossible
  network:
    networkType: HwCloud-CCE-EIP
    networkConf:
      # https://support.huaweicloud.com/usermanual-cce/cce_10_0734.html
      - name: yangtse.io/pod-with-eip
        value: "true"
      - name: yangtse.io/eip-bandwidth-size
        value: "5"
      - name: yangtse.io/eip-network-type
        value: "5_bgp"
      - name: yangtse.io/eip-charge-mode
        value: "traffic"
  gameServerTemplate:
    spec:
      containers:
        - image: nginx
          name: nginx

生成的pod的annotation如下,yangtse.io/allocated-eip-id对应的eip可以在华为云的弹性公网IP详情中查看, yangtse.io/allocated-ipv4-eip 即为pod的eip

apiVersion: v1
kind: Pod
metadata:
  annotations:
    apps.kruise.io/runtime-containers-meta: '{"containers":[{"name":"nginx","containerID":"containerd://302f710dc7fb5771be5b16a31de84ff457fd84c9aa1ce00b7e7f2ddc3b7c3978","restartCount":0,"hashes":{"plainHash":2641665875,"plainHashWithoutResources":0,"extractedEnvFromMetadataHash":86995377}}]}'
    game.kruise.io/network-conf: '[{"name":"yangtse.io/pod-with-eip","value":"true"},{"name":"yangtse.io/eip-bandwidth-size","value":"5"},{"name":"yangtse.io/eip-network-type","value":"5_bgp"},{"name":"yangtse.io/eip-charge-mode","value":"traffic"}]'
    game.kruise.io/network-status: '{"currentNetworkState":"Ready","createTime":null,"lastTransitionTime":null}'
    game.kruise.io/network-trigger-time: "2025-07-16 17:03:07"
    game.kruise.io/network-type: HwCloud-EIP
    game.kruise.io/opsState-last-changed-time: "2025-07-16 17:03:07"
    game.kruise.io/state-last-changed-time: "2025-07-16 09:03:13"
    lifecycle.apps.kruise.io/timestamp: "2025-07-16T09:03:03Z"
    yangtse.io/allocated-eip-id: 3a52ca79-d78d-4fc2-8590-xxxx
    yangtse.io/allocated-ipv4-eip: 94.74.110.xxx
    yangtse.io/eip-bandwidth-size: "5"
    yangtse.io/eip-charge-mode: traffic
    yangtse.io/eip-network-type: 5_bgp
    yangtse.io/pod-with-eip: "true"

使用已有的EIP, spec.network.networkConf添加yangtse.io/eip-id,你需要事先在华为云创建好EIP

apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
  name: hw-cce-eip-exist
  namespace: kruise-game-system
spec:
  replicas: 1
  updateStrategy:
    rollingUpdate:
      podUpdatePolicy: InPlaceIfPossible
  network:
    networkType: HwCloud-CCE-EIP
    networkConf:
      - name: yangtse.io/eip-id
        value: "7ec474aa-3bd9-46a2-a45c-xxxx" # 使用已有的EIP
  gameServerTemplate:
    spec:
      containers:
        - image: nginx
          name: nginx

pod的yaml, 可以看到pod的annotations里yangtse.io/allocated-eip-id为我们指定的EIP,登录华为云EIP控制台,可以看到这个EIP已经绑定了pod

apiVersion: v1
kind: Pod
metadata:
  annotations:
    apps.kruise.io/runtime-containers-meta: '{"containers":[{"name":"nginx","containerID":"containerd://0fc9de69e30b48cf13ad2d2c6f5fe3be86e48e922a982dbb77b53ffd0ca6f54b","restartCount":0,"hashes":{"plainHash":2957831032,"plainHashWithoutResources":0,"extractedEnvFromMetadataHash":86995377}}]}'
    game.kruise.io/network-conf: '[{"name":"yangtse.io/eip-id","value":"7ec474aa-3bd9-46a2-a45c-xxxx"}]'
    game.kruise.io/network-status: '{"currentNetworkState":"Ready","createTime":null,"lastTransitionTime":null}'
    game.kruise.io/network-trigger-time: "2025-07-18 15:38:21"
    game.kruise.io/network-type: HwCloud-EIP
    game.kruise.io/opsState-last-changed-time: "2025-07-18 15:38:21"
    game.kruise.io/state-last-changed-time: "2025-07-18 15:38:31"
    lifecycle.apps.kruise.io/timestamp: "2025-07-18T07:38:13Z"
    yangtse.io/allocated-eip-id: 7ec474aa-3bd9-46a2-a45c-xxxx
    yangtse.io/allocated-ipv4-eip: 159.138.21.xxx
    yangtse.io/eip-id: 7ec474aa-3bd9-46a2-a45c-xxxx
  creationTimestamp: "2025-07-18T07:38:14Z
# other info ignored

获取网络信息

GameServer Network Status可以通过两种方式获取

k8s API

调用K8s API获取GameServer对象。该方式适用于中心组件通常在匹配服务获取游戏服网络信息用于路由选择等。

DownwardAPI

通过DownwardAPI将网络信息下沉至业务容器中供游戏服业务容器使用

该方法的示例如下:

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版本

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各个字段
}