概述
在房间类游戏中,每个房间通常需要独立的公网地址。TKE 集群默认只支持 EIP 方案,但 EIP 资源有限,存在申请的数量限制和每日申请的次数限制(详情请参见 EIP 配额限制),在规模较大或频繁扩缩容的情况下,可能会触达限制导致 EIP 分配失败。而如果保留 EIP,在 EIP 没被绑定前,又会产生额外的闲置费。
除了 EIP 方案,您还可以使用
tke-extend-network-controller
插件的方案,本文将介绍如何使用 tke-extend-network-controller
插件来实现为每个 Pod 的指定端口都分配一个独立的公网地址映射(公网 IP:Port
到内网 Pod IP:Port
的映射)。说明:
前提条件
安装
tke-extend-network-controller
前请确保满足以下条件:1. 确保腾讯云账号是带宽上移账号,参考 账户类型说明 进行判断或升级账号类型(标准账号为带宽上移账号,如果您的账号创建时间较早,可能是传统账号,即非带宽上移账号)。
2. 创建了 TKE 集群,且集群版本大于等于 1.26。
3. 集群中安装了 cert-manager(webhook 依赖证书),可通过 TKE 应用市场 安装。
4. 需要一个腾讯云子账号的访问密钥(SecretID、SecretKey),详情请参见 子账号访问密钥管理,要求账号至少具有以下权限:
{"version": "2.0","statement": [{"effect": "allow","action": ["clb:DescribeLoadBalancerBackends","clb:DescribeLoadBalancerListeners","clb:DescribeLoadBalancers","clb:CreateLoadBalancer","clb:DescribeTargets","clb:DeleteLoadBalancer","clb:DeleteLoadBalancerListeners","clb:BatchDeregisterTargets","clb:BatchRegisterTargets","clb:DeregisterTargets","clb:CreateLoadBalancerListeners","clb:CreateListener","clb:RegisterTargets","clb:DeleteLoadBalancers","clb:DescribeLoadBalancersDetail","clb:DescribeQuota","clb:DescribeListeners"],"resource": ["*"]}]}
操作步骤
安装 tke-extend-network-controller
vpcID: "" # TKE 集群所在 VPC ID (vpc-xxx)clusterID: "" # TKE 集群 ID (cls-xxx)secretID: "" # 腾讯云子账号的 SecretIDsecretKey: "" # 腾讯云子账号的 SecretKey
配置完成后单击完成即可安装到集群。
确保 Pod 调度到原生节点或超级节点
要使用 CLB 为 Pod 分配公网地址映射,需保证承载游戏房间的 Pod 调度到原生节点或超级节点上。如果 Pod 在普通节点(CVM),将不会为该 Pod 分配 CLB 公网地址映射。
创建 DedicatedCLBService
为应用创建 DedicatedCLBService:
1.
selector
选中目标应用 Pod 的 labels。2.
existedLbIds
传入用于为 Pod 分配公网映射的 CLB 实例 ID 列表,可动态追加。3.
minPort
和 maxPort
为 CLB 自动创建监听器的端口范围,每个端口只绑定一个 Pod。4.
maxPod
用于限制最大 Pod/监听器 数量。5.
ports
为 Pod 监听的端口列表,通常一个房间进程只监听一个端口。其中 addressPodAnnotation
用于 CLB 绑定 Pod 后,自动将其 CLB 外部映射地址注入到指定的 pod annotation 中,可结合 Kubernetes 的 Downward API 将外部地址挂载到容器内,以便让应用能够感知到自身的公网地址。apiVersion: networking.cloud.tencent.com/v1alpha1kind: DedicatedCLBServicemetadata:namespace: demo # 游戏服 Pod 所在命名空间name: gameserverspec:lbRegion: ap-chengdu # 可选,CLB 所在地域,默认为集群所在地域minPort: 500 # 可选,在 CLB 自动创建监听器,每个 Pod 占用一个端口,默认端口号范围在 500-50000maxPort: 50000maxPod: 50 # 可选,限制最大 Pod/监听器 数量。selector:app: gameserverports:- protocol: TCP # 端口监听的协议(TCP/UDP)targetPort: 9000 # 容器监听的端口 (游戏战斗服、会议等进程监听的端口)addressPodAnnotation: networking.cloud.tencent.com/external-address # 可选,将外部地址自动注入到指定的 pod annotation 中existedLbIds: # 复用已有的 CLB 实例,指定 CLB 实例 ID 的列表- lb-xxxlbAutoCreate:enable: true # 当 CLB 不足时,自动创建 CLBextensiveParameters: | # 购买 CLB 时的参数(JSON 字符串格式):按流量计费,超强型4实例规格,带宽上限 60 Gbps (完整参数列表参考 CreateLoadBalancer 接口 https://cloud.tencent.com/document/api/214/30692){"InternetAccessible": {"InternetChargeType": "TRAFFIC_POSTPAID_BY_HOUR","InternetMaxBandwidthOut": 61440},"SlaType": "clb.c4.xlarge"}
将 CLB 映射的外部地址注入到 Pod 注解中
spec:containers:- ...volumeMounts:- name: podinfomountPath: /etc/podinfovolumes:- name: podinfodownwardAPI:items:- path: "address"fieldRef:fieldPath: metadata.annotations['networking.cloud.tencent.com/external-address']
容器内进程获取自身的 CLB 外部映射地址
进程启动时可轮询指定文件(本例中文件路径为
/etc/podinfo/address
),当文件内容为空说明此时 Pod 还未绑定到 CLB,当读取到内容时说明已经绑定成功,其内容为 Pod 的 CLB 外部映射地址,进程可拿到该地址做进一步处理,如游戏战斗服上报自身房间的外部地址给大厅服或匹配服。文件内容的格式为
Host:Port
,其中 Host
是 CLB 的 VIP 或域名,所以格式又细分成以下两种形式:1.
IP:Port
:CLB 的 VIP 加对外的端口号,如 1.1.1.1:567
,非域名化的 CLB 会使用该形式。2.
Domain:Port
:CLB 的域名加对外的端口号,如 lb-6q0yyqhb-p01vqztldre7is89.clb.cd-tencentclb.work:567
,域名化的 CLB 会使用该形式。CLB 的域名化与非域名化
通常,新创建的 CLB 是域名化的,详情请参见 域名化公网负载均衡上线公告,即 CLB 没有固定的 VIP,其外部地址是一个域名,VIP 根据域名动态解析。可以在 CLB 实例的详情页查看 CLB 是域名化还是非域名化。




注意事项
2. 配置
DedicatedCLBService
时,注意 minPort
和 maxPort
的范围,避免超出限制。根据实际需求选择合适的端口区间。例如,如果单个 Pod 承载流量较大,可以缩小端口范围,限制绑定的 Pod 数量,避免单个 CLB 流量过大超出带宽上限;反之,如果流量较小,可以扩大端口范围以绑定更多 Pod。