1. 为什么选择容器化部署FreeSWITCHFreeSWITCH作为一款开源的软交换平台在VoIP领域已经深耕十余年。我最早接触它是在2015年做呼叫中心系统时当时还是以物理机部署为主。直到2018年第一次尝试Docker化部署后才发现容器化带来的三大核心优势环境一致性难题迎刃而解传统部署方式最头疼的就是环境差异问题。FreeSWITCH依赖的库文件版本如libopus、libsndfile在不同Linux发行版上表现各异。曾经在Ubuntu 16.04上调试好的语音转码参数放到CentOS 7上就会出现杂音。容器化后开发、测试、生产环境完全一致再也不用为在我机器上是好的这种问题扯皮。资源隔离与快速伸缩语音服务对CPU和内存资源极为敏感。在裸金属服务器上一个配置错误的语音编码参数可能拖垮整个系统。通过Docker的cgroup限制我们可以为每个FreeSWITCH实例分配固定的CPU份额和内存上限。去年双十一大促期间我们通过Kubernetes在2分钟内完成了10个实例的横向扩容全程零停机。版本管理的革命性改进FreeSWITCH的版本升级向来是运维人员的噩梦。现在通过镜像tag管理可以轻松实现灰度发布先升级20%的容器观察效果快速回滚直接切换回旧版本镜像A/B测试同时运行v1.8和v1.10对比效果提示生产环境建议使用Alpine Linux作为基础镜像最终镜像大小可控制在150MB左右比Ubuntu基础镜像节省70%空间2. HoRain云环境下的特殊考量HoRain作为国内新兴的云服务商其网络架构与主流云平台存在一些差异需要特别注意2.1 网络拓扑适配HoRain的SDN网络对UDP协议有特殊限制单播UDP包大小超过1200字节时可能被分片丢弃组播需要单独申请开通客服系统常用到解决方案是在vars.xml中添加X-PRE-PROCESS cmdset datartp_mtu1100/ X-PRE-PROCESS cmdset datadisable_rtp_auto_adjusttrue/2.2 存储性能优化HoRain的云硬盘在随机写性能上较弱而FreeSWITCH的CDR通话详单记录是典型的随机写场景。我们通过以下组合方案提升性能将mod_local_stream的录音文件写入内存盘mount -t tmpfs -o size512m tmpfs /usr/local/freeswitch/storage/recordingsCDR日志改用mod_odbc_cdr写入MySQL并启用批量插入param namedb-insert-multi value10/2.3 安全组配置要点HoRain的安全组规则有两条特殊限制不允许配置全端口范围必须明确指定端口ICMP协议默认关闭影响心跳检测建议的最小开放端口清单端口协议用途备注5060TCPSIP信令必须开放5060UDPSIP信令NAT环境建议TCP优先5080TCP外部SIP Profile用于跨域连接8021TCPEvent Socket控制接口需加密16384-32768UDPRTP媒体流范围可适当缩小3. 容器化实施全流程3.1 基础镜像构建推荐使用多阶段构建来优化镜像大小以下是经过生产验证的Dockerfile# 构建阶段 FROM debian:bullseye as builder RUN apt-get update \ apt-get install -y git build-essential automake libtool pkg-config \ libssl-dev libpcre3-dev libedit-dev libsqlite3-dev libcurl4-openssl-dev \ libldns-dev libedit-dev libjpeg-dev libopus-dev liblua5.2-dev \ libsndfile1-dev libavformat-dev libavresample-dev WORKDIR /usr/src RUN git clone https://github.com/signalwire/freeswitch.git \ cd freeswitch \ ./bootstrap.sh \ ./configure --enable-portable-binary \ --prefix/usr/local/freeswitch \ --with-lua/usr/include/lua5.2 \ --with-opus/usr/include/opus \ make -j$(nproc) \ make install # 运行时阶段 FROM debian:bullseye-slim RUN apt-get update \ apt-get install -y --no-install-recommends \ libssl1.1 libpcre3 libedit2 libsqlite3-0 libcurl4 \ libldns2 libjpeg62-turbo libopus0 liblua5.2-0 \ libsndfile1 libavformat58 libavresample4 \ rm -rf /var/lib/apt/lists/* COPY --frombuilder /usr/local/freeswitch /usr/local/freeswitch # 关键目录挂载点 VOLUME [/usr/local/freeswitch/conf, /usr/local/freeswitch/recordings] ENTRYPOINT [/usr/local/freeswitch/bin/freeswitch]构建命令docker build -t freeswitch:1.10.7 -t freeswitch:latest .3.2 关键配置调整容器环境下需要修改的几个核心配置文件1. vars.xml 网络相关参数X-PRE-PROCESS cmdset dataexternal_rtp_ipstun:stun.horain.com/ X-PRE-PROCESS cmdset dataexternal_sip_ipstun:stun.horain.com/ X-PRE-PROCESS cmdset datartp_start_port16384/ X-PRE-PROCESS cmdset datartp_end_port32768/2. autoload_configs/switch.conf.xml 内存限制param namemax-sessions value1000/ param namesessions-per-second value30/ param namemax-db-handles value100/3. 日志轮转配置在容器中建议关闭传统的logrotate改用stdout输出param nameauto-rotate valuefalse/ param nameconsole-log-level valueinfo/3.3 启动与健康检查生产环境推荐使用docker-compose管理version: 3.8 services: freeswitch: image: freeswitch:1.10.7 restart: unless-stopped ports: - 5060:5060/tcp - 5060:5060/udp - 8021:8021/tcp - 16384-32768:16384-32768/udp volumes: - ./conf:/usr/local/freeswitch/conf - ./recordings:/usr/local/freeswitch/recordings environment: - TZAsia/Shanghai healthcheck: test: [CMD, fs_cli, -x, status] interval: 30s timeout: 10s retries: 3健康检查的几种实用方法基础状态检测fs_cli -x status | grep -q Ready媒体功能测试fs_cli -x originate user/1000 echo数据库连接检查适用于ODBCfreeswitch.consoleLog(INFO, DB connection: .. dbh:connected())4. 性能调优实战经验4.1 容器参数优化在HoRain云的K8S环境中这些参数经过实测能提升20%性能1. CPU调度策略# deployment.yaml片段 resources: limits: cpu: 2 memory: 2Gi requests: cpu: 1.5 memory: 1.5Gi2. 网络栈优化sysctl -w net.core.rmem_max16777216 sysctl -w net.core.wmem_max16777216 sysctl -w net.ipv4.udp_mem4096 87380 167772164.2 FreeSWITCH核心参数1. 线程池配置conf/autoload_configs/switch.conf.xmlparam namethreads value20/ param nametimer-slots value500/ param namertp-timer-slots value200/2. 语音编码优先级根据国内网络优化!-- conf/vars.xml -- X-PRE-PROCESS cmdset dataglobal_codec_prefsOPUS,G722,PCMU,PCMA,GSM/ X-PRE-PROCESS cmdset dataoutbound_codec_prefsOPUS,PCMA,PCMU,G722,GSM/4.3 高可用方案我们在HoRain云上实现的方案架构----------------- | ALB (TCP:5060) | ---------------- | -------------------------------- | | -------------------- -------------------- | FS Node 1 | | FS Node 2 | | (K8S StatefulSet) | | (K8S StatefulSet) | -------------------- -------------------- | | -------------------------------- | ---------------- | Redis Cluster | | (共享状态存储) | -----------------关键实现点注册状态共享param nameenable-shared-registrations valuetrue/ param nameshared-registrations-host valueredis://redis:6379/故障转移检测-- 在拨号计划中添加健康检查 action applicationlua dataha_check.lua/5. 常见问题排查指南5.1 容器启动失败排查现象容器不断重启日志显示[ERR] switch_core.c: Failed to initialize switch_core排查步骤检查挂载的conf目录权限ls -ld conf # 应为drwxr-xr-x且属主为root验证关键配置文件完整性grep -r external_rtp_ip conf/ # 必须存在有效值检查端口冲突docker run --rm -it --nethost nicolaka/netshoot netstat -tulnp | grep 50605.2 语音质量问题现象通话中出现杂音或断续诊断方法获取RTP统计fs_cli -x rtp stats检查网络抖动docker exec -it freeswitch ping -c 100 client_ip抓包分析tcpdump -i any -s 0 -w /tmp/rtp.pcap port 5060 or portrange 16384-32768典型解决方案调整jitter buffer参数param namejitterbuffer-msec value60/ param namejitterbuffer-len value200/强制使用TCP传输param nameaggressive-nat-detection valuetrue/ param namertp-enable-tcp valuetrue/5.3 注册失败问题现象SIP终端无法注册到FreeSWITCH排查流程检查ACL配置fs_cli -x acl list验证NAT设置!-- conf/sip_profiles/internal.xml -- param nameNDLB-received-in-nat-reg valuetrue/ param nameNDLB-force-rport valuetrue/查看完整信令流fs_cli -x sofia global siptrace on在HoRain云环境中我们总结出注册问题的三大常见原因安全组未放行UDP 5060虽然建议用TCP但很多客户端默认UDP容器时间未同步导致SIP注册过期时间计算错误内存不足导致sofia模块加载失败
阅读完成 · 觉得有帮助?