设置高可用性
可以通过在 SIP 负载均衡器后面部署 Voice Gateway 实例的集群来将 IBM® Voice Gateway 配置为在高可用性环境中运行。通过跨多个节点(例如,VM 或服务器)扩展这些实例,Voice Gateway 可处理大量呼叫负载。
高可用性体系结构
每个 Voice Gateway 实例由两个单独的容器 SIP Orchestrator 和 Media Relay 组成。Voice Gateway 可自行伸缩以根据需要使用节点的尽可能多的可用处理能力,因此在节点上添加更多 Voice Gateway 实例(即垂直伸缩)不会进一步增加容量。请改为通过部署多个节点或虚拟机 (VM)(每个包含单个 Voice Gateway 实例)来水平伸缩环境。换句话讲,增大级别是通过添加 VM 而不是为每个节点添加更多实例来实现的。
下图显示了典型的三节点高可用性部署。

由于该体系结构,Voice Gateway 不支持会话复制或会话故障转接。每个 Voice Gateway 实例独立于集群中的其他 Voice Gateway 实例运行。如果发生故障或者 Voice Gateway 的某个实例下线,那么该实例上运行的任何活动呼叫都将丢失。因此,规划和管理 Voice Gateway 的更新就非常关键,如在高可用性环境中更新 Voice Gateway 中所述。
如果任一节点下线,那么该节点上的活动呼叫将失败,但总体服务仍可运行。规划容量时,请记住,在某个节点发生故障时,剩余节点的负载会增加。确定集群中的节点数,以便它在缺少某个节点时也能处理峰值负载。
SIP 负载均衡器
SIP 负载均衡器是用于在高可用性环境中部署 IBM Voice Gateway 的关键组件,具有以下关键职责:
- 在集群中平均地分发新呼叫
- 维护呼叫会话亲缘关系,这需要负载均衡器内省流经它的消息中的 SIP 头,并维护关于每个活动呼叫的状态信息
- 检查它将呼叫传递到的 Voice Gateway 实例的运行状况
为了检查 Voice Gateway 实例的运行状况,负载均衡器向每个实例发送 SIP OPTIONS 消息。缺省情况下,Voice Gateway 在运行状况正常时通过 200 OK 代码对这些 OPTIONS 消息进行响应。在 CMR_HEALTH_CHECK_FAIL_ERR_CODE 环境变量上,可将 Voice Gateway 配置为通过特定错误响应对 Options 消息进行响应。对于 Voice Gateway 暂时无法处理新呼叫,但可以继续处理现有呼叫的情况(例如端口耗尽),还可以将其配置为停止发送
OPTIONS 消息。该配置取决于 SIP 负载均衡器的功能。
由于其关键角色,SIP 负载均衡器还有可能成为单一故障点。通常,SIP 负载均衡器提供用于处理故障情况的部署模型。有关为特定 SIP 负载均衡器配置高可用性的信息,请参阅其文档。
在高可用性环境中更新 Voice Gateway
在需要更新 IBM Voice Gateway 时,您将希望以一种不会干扰现行呼叫的方式来转换到新版本。大多数 SIP 负载均衡器都支持路由表的概念,其中包含了所有可路由的后端 SIP 节点。SIP 负载均衡器通常还支持从该路由表手动添加和除去节点的功能。
如果针对新呼叫从路由表除去了某个节点,只要该节点继续响应运行状况检查消息,SIP 负载均衡器会继续将与现有活动呼叫相关的消息路由至该节点。使用此功能,可以完全停顿某个 Voice Gateway 实例,从而在移除 SIP Orchestrator 和 Media Relay 容器之前更新该实例的所有活动呼叫。然后,可以使用新映像重新启动这些呼叫。
当容器关闭时,将会激活 Kubernetes preStop 生命周期挂钩。preStop 生命周期挂钩发送请求以使 Pod 处于停顿方式下。在停顿过程中,服务器停止响应或拒绝 OPTIONS 请求。preStop 生命周期挂钩定期检查以确定服务器上是否存在任何活动呼叫。
CMR_HEALTH_CHECK_FAIL_ERR_CODE 环境变量定义服务器如何响应 SIP OPTIONS 请求。当服务器不响应或拒绝 OPTIONS 请求时,Voice Gateway 服务器前面的负载均衡器不会将新呼叫转发到服务器。现有呼叫不受影响并继续直至服务器关闭为止。
preStop 挂钩在没有任何活动呼叫或在超时到期时存在,并且定期检查以确定服务器上是否存在任何活动呼叫。超时确定等待服务器宽限关闭的时间长度,并且在缺省情况下设置为 10 分钟。您可以在 PodSpec 级别定制宽限期设置 terminationGracePeriodSeconds。当超时到期时,服务器会关闭,并且所有活动呼叫都将结束。
重新启动 Voice Gateway 实例后,可以将 SIP 负载均衡器配置为通过仅向新节点路由来自特定设备的 INVITE 请求(例如您控制的特定电话号码)来测试新节点。测试新节点之后,可将其添加到生产路由表,此时它将开始接收新的入站 INVITE 请求。集群中的每个节点都必须单独地进行测试。
容器编排框架
从 Voice Gateway 的单个测试实例移至高度可用的集群时,请考虑使用容器编排框架(例如 Kubernetes),它对跨多个节点管理容器进行简化。 IBM Cloud Private 是基于 Kubernetes 的本地容器编排平台,但是具有其他功能部件,包括集中式 GUI 控制台、专用 Docker 注册表、日志记录和监视。
IBM Voice Gateway 已通过 Kubernetes 和 IBM Cloud Private 进行了广泛的测试。可将这些框架配置为提供支持 Voice Gateway 的高可用性部署的功能。
实时通信应用程序(例如 IBM Voice Gateway)有一些独特的功能需求,在选择 Docker 编排框架时必须加以考虑。
- 媒体需要较大的端口范围
- 媒体端口必须可由其他网络设备(例如重叠网络外部的会话边界控制器 (SBC))访问
- SIP 会话亲缘关系必须建立在 UDP 上
- 当容器关闭时,来自容器的 SIP 呼叫必须停顿
重要信息:由于 Docker Swarm 入口负载均衡器中的限制,Docker Swarm 不能与 IBM Voice Gateway 一起使用。
Kubernetes 部署
在 Kubernetes 术语中,单个 Voice Gateway 实例等于单个 Pod,其中包含 SIP Orchestrator 容器和 Media Relay 容器。Voice Gateway Pod 安装到前面有一个外部 SIP 负载均衡器的 Kubernetes 集群中。通过 Kubernetes,Voice Gateway Pod 可以安排为在 VM 的集群上运行。该框架还监视 Pod,并可配置为在检测到故障时自动重新启动 Voice Gateway Pod。
注意:由于当前在 Kubernetes 中不支持 SIP 负载均衡器对新 Pod 进行自动伸缩和自动发现,所以在将新 Pod 添加到 Kubernetes 集群时必须手动更新外部 SIP 负载均衡器的路由表,如以下部分中所述。
配置高可用性
该部分重点描述了将 IBM Voice Gateway 部署到 Kubernetes 环境以实现高可用性。虽然使用 Kubernetes 不是必需的,您完全可以在一组支持 Docker 的独立节点上部署 Voice Gateway 实例的集群,但这样做,您就不能从一个集中位置管理整个集群。请参阅在 Kubernetes 上部署 Voice Gateway。
在 IBM Cloud Private 中配置高可用性
由于 IBM Cloud Private 基于 Kubernetes,因此可以使用与部署 Voice Gateway 相同的过程,但是您具有更多选项用于部署和监视集群。
如果要部署其他 Voice Gateway Pod,那么将需要向集群中添加更多节点,因为只能对每个节点运行单个 Voice Gateway Pod。然后,将副本数更改为不超过 IBM Cloud Private 集群中可用的节点数
- 在用户界面中:在 Voice Gateway Helm 图表配置页面中,设置副本数值。
-
在命令行上:使用
--set选项设置replicaCount属性的值,或者在vgwEnvVariables.yaml文件中指定该值。helm install ibm-charts/ibm-voice-gateway --name my-release \ --set replicaCount=2
谨记:您还将需要设置 SIP 负载均衡器以跨 Voice Gateway 节点进行负载均衡。
在 IBM Cloud Private 中创建共享映像注册表
一项 IBM Cloud Private 功能是能够创建共享 Docker 映像注册表,您可以将其用于存储公司的 Voice Gateway 映像,而不必从 Docker Hub 提取映像。以下步骤将 Voice Gateway 添加到本地 IBM Cloud Private 映像注册表。
-
下载并安装 IBM Cloud Private。
有关安装 IBM Cloud Private 和部署集群的详细信息,请参阅 IBM Cloud Private 文档。
-
从 IBM Cloud Private 主节点将 SIP Orchestrator 和 Media Relay 容器映像提取到本地文件系统。
docker login docker pull ibmcom/voice-gateway-so:latest docker pull ibmcom/voice-gateway-mr:latest -
通过运行以下命令,将映像推送到共享映像注册表:
docker login https://master.cfc:8500 --username admin --password admin docker tag ibmcom/voice-gateway-so:latest master.cfc:8500/admin/voice-gateway-so:latest docker push master.cfc:8500/admin/voice-gateway-so:latest docker tag ibmcom/voice-gateway-mr:latest master.cfc:8500/admin/voice-gateway-mr:latest docker push master.cfc:8500/admin/ibmcom/voice-gateway-mr:latest - 更新 Kubernetes 部署 JSON 文件中的
image属性已指向以下新的映像。"image": "master.cfc:8500/admin/voice-gateway-so:latest" "image": "master.cfc:8500/admin/voice-gateway-mr:latest"