You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RabbitMQ K8s对等发现报错‘Can't make context’排查求助

问题:Kubernetes 1.24环境中RabbitMQ Pod启动报"Can't make context"错误

问题背景

在某Kubernetes 1.24环境中,RabbitMQ Pod启动时返回Can't make context错误,但相同版本的另一K8s环境中该Pod可正常运行,无法定位两者差异。从Pod内部按照Kubernetes官方文档的方式连接API服务器无异常。测试过的RabbitMQ版本包括3.10.x + Erlang 1.12、3.11.x + Erlang 1.14、3.12.0 + Erlang 1.14.5(因仅特定环境报错,暂不确定与版本相关)。

报错日志详情

{"time":"2023-06-19 09:40:43.126541+00:00","level":"debug","msg":"rabbit_peer_discovery:lock returned {error,\n                                     \"{failed_connect,\n    [{to_address,{\"kubernetes.default.svc.cluster.local\",443}},\n     {inet,\n         [inet],\n         {eoptions,\n             {{{error,{\"evp.c\",136},\"Can't make context\"},\n               [{crypto,generate_key,3,\n                    [{file,\"crypto.erl\"},\n                     {line,1676},\n                     {error_info,#{erl_function_arg_num => undefined}}]},\n                {ssl_cipher,generate_client_shares,2,\n                    [{file,\"ssl_cipher.erl\"},{line,1267}]},\n                {ssl_gen_statem,initial_hello,3,\n                    [{file,\"ssl_gen_statem.erl\"},{line,470}]},\n                {gen_statem,loop_state_callback,11,\n                    [{file,\"gen_statem.erl\"},{line,1426}]},\n                {tls_connection,init,1,\n                    [{file,\"tls_connection.erl\"},{line,160}]},\n                {proc_lib,init_p_do_apply,3,\n                    [{file,\"proc_lib.erl\"},{line,240}]}]},\n              {gen_statem,call,[<0.442.0>,{start,2250},infinity]}}}}]}","domain":"rabbitmq","pid":"<0.230.0>"}
{"time":"2023-06-19 09:41:13.130264+00:00","level":"notice","msg":"Application mnesia exited with reason: stopped","domain":"otp"}

当前rabbitmq.conf配置

cluster_formation.peer_discovery_backend  = rabbit_peer_discovery_k8s
cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
ssl_options.verify=verify_peer
cluster_formation.k8s.address_type = hostname
cluster_formation.node_cleanup.interval = 30
cluster_formation.node_cleanup.only_log_warning = true
cluster_partition_handling = autoheal
queue_master_locator=min-masters
loopback_users = none

排查思路

  • 检查两个K8s环境的CA证书配置差异:RabbitMQ通过SSL连接K8s API时依赖集群CA证书,确认目标环境中Pod挂载的/var/run/secrets/kubernetes.io/serviceaccount/ca.crt是否有效,是否与正常环境的CA证书一致;也可临时设置ssl_options.verify=verify_none测试是否为证书验证问题(仅用于排查,生产环境禁用)。
  • 对比Pod的网络策略/防火墙规则:虽然手动连接API无异常,但RabbitMQ的K8s发现插件的SSL上下文配置可能与手动测试不同,确认目标环境是否有针对Pod outbound 443端口的特殊拦截规则,或kubernetes.default.svc.cluster.local的端点是否存在异常。
  • 检查容器内Erlang/OpenSSL版本差异:Can't make context错误来自OpenSSL的evp.c模块,对比两个环境中RabbitMQ容器内的OpenSSL版本,排查是否存在与K8s API服务器的TLS协议/加密套件兼容性问题;可尝试在目标环境的RabbitMQ配置中指定兼容的TLS版本,比如添加ssl_options.versions.1 = tlsv1.2、ssl_options.versions.2 = tlsv1.3。
  • 对比K8s API服务器的TLS配置差异:检查两个环境中kube-apiserver的TLS加密套件、证书签名算法是否不同,目标环境是否禁用了RabbitMQ容器内OpenSSL支持的某些算法。
  • 检查Pod的ServiceAccount权限与挂载情况:确认目标环境中RabbitMQ使用的ServiceAccount权限与正常环境一致,以及serviceaccount-token Secret是否正确挂载,包括token、ca.crt文件的权限和内容完整性。
  • 检查容器的文件系统权限:确认RabbitMQ容器内是否有足够权限访问SSL相关临时文件或系统目录,比如/tmp目录的权限是否正常,Erlang生成SSL上下文时可能需要写入临时文件。

内容的提问来源于stack exchange,提问作者JungWoo Ryoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:03:32