1、场景
由于haproxy的随机端口,是通过系统分配的,也就是32768 60999,,但是业务端口的随机端口范围是30000-40000会偶尔冲突,导致服务起不来
猜测有2个原因
1、临时端口冲突
2、haproxy的bing端口和游戏端口冲突(因为可能分配到同一台node)
listen 910001007_37186_2887385566
bind *:37186
server 910001007_37186_2887385566 172.26.1.222:37186 maxconn 20480
对应的解决办法:
1、临时端口冲突
容器,里面是不可以修改内核参数的,无论是docker还是k8s
报错:
参考资料
k8s: https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/
docker: https://blog.csdn.net/xingzuo_1840/article/details/129247014
docker的解决办法:
emqx:
image: "emqx/emqx:4.3.11"
sysctls:
- net.ipv4.ip_local_port_range=1024 65535
或者直接启动指定
docker run --sysctl net.ipv4.ip_local_port_range="40000 65000" -d --name test helloworld:latest
测试:
docker exec jenkins sysctl net.ipv4.ip_local_port_range
k8s的解决办法:
spec:
# 确保没有启用 hostNetwork
#hostNetwork: false
securityContext:
sysctls:
- name: net.ipv4.ip_local_port_range
value: "40000 65000"
如果是pod的,需要先删除再创建,因为创建了,就不允许更改内核之类的
kubectl delete pod test-sysctl # 删除旧 Pod
kubectl apply -f test.yaml # 创建新 Pod
如果通过 Deployment 管理 Pod(生产环境最佳实践)
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-sysctl-deploy
spec:
replicas: 1
selector:
matchLabels:
app: test-sysctl
template:
metadata:
labels:
app: test-sysctl
spec:
securityContext:
sysctls:
- name: net.ipv4.ip_local_port_range
value: "40000 65000"
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "sleep 3600"]
kubectl apply -f test.yaml # 自动触发 Pod 重建
上面的都是安全的参数的,如果是不安全的,需要额外加,比如说开特权用户的权限
securityContext:
privileged: true # 启用特权模式(不推荐,存在安全隐患)
测试
kubectl exec test-sysctl-pod -- sysctl net.ipv4.ip_local_port_range
# 预期输出:net.ipv4.ip_local_port_range = 40000 65000
2、 haproxy绑定的端口和游戏端口冲突
解决办法:修改haproxy
{{ range gets "/YunFan/roomsvr/*" }}{{ $data := json .Value }}
listen {{ base .Key }}
bind *:{{ $data.port | math.Add 10000 }} <!-- 关键修改:端口值 +10000 -->
server {{ base .Key }} {{ $data.ip }}:{{ $data.port }} maxconn 20480
{{ end }}