k8s容器云内emqx启动失败

错误报告

调试模式运行看最后打出来的错误显示是out_of_memory,但是我设置的内存是4GB,应该不会内存不足,不知道是不是哪里配置有问题。
{“Kernel pid terminated”,application_controller,“{application_start_failure,kernel,{{shutdown,{failed_to_start_child,kernel_safe_sup,{on_load_function_failed,quicer_nif,{{badmatch,{error,open_failed,out_of_memo
ry}},[{quicer_nif,init,0,[{file,"quicer_nif.erl"},{line,61}]},{init,‘-run_on_load_handlers/2-fun-0-’,1,[]}]}}}},{kernel,start,[normal,[]]}}}”}
Kernel pid terminated (application_controller) ({application_start_failure,kernel,{{shutdown,{failed_to_start_child,kernel_safe_sup,{on_load_function_failed,quicer_nif,{{badmatch,{error,open_failed,out_of_memor
y}},[{quicer_nif,init,0,[{file,“quicer_nif.erl”},{line,61}]},{init,‘-run_on_load_handlers/2-fun-0-’,1,[]}]}}}},{kernel,start,[normal,[]]}}})
下面是我怀疑有可能有问题的配置项:
node {
name = “emqxsrv@127.0.0.1
cookie = “emqxsecretcookie”
data_dir = “data”
process_limit = 2097152
max_ports = 1048576
}

log {
file_handlers.default {
level = warning
file = “log/emqx.log”
enable = true
}
}

cluster {
discovery_strategy = k8s
k8s {
apiserver = “https://172.21.0.16:6443
service_name = emqx
address_type = ip
suffix = “svc.cluster.local”
namespace = message
}
}

环境

  • EMQX 版本:5.0.16
  • 操作系统版本:centos7.9

重现此问题的步骤

  1. xxx
  2. xxx
  3. xxx

预期行为

实际行为


功能请求

描述你需要的功能

为什么你需要这个功能


其他

你好,我把这个日志转给相关的技术同事了,但可能需要稍晚些才能答复你。

好的,多谢

@t1ger 麻烦帮忙再看看这个问题吧

你好,你有对进程做任何限制吗?比如线程数、CPU 核数、内存使用率。另外,你的平台是 arm 还是?

会做CPU核数和内存的限制,我们的平台是intel_x86,我还发现一个现象,使用emqx foreground命令启动,就没有上面的错误了,没有搞明白到底什么原因

绑定了 CPU 核,或者限制了 CPU 核数,就会导致 QUIC 抛出 out_of_memory 的错误。

这个错误的确会给调试带来一定的误导,但它来自于我们使用的 msquic 库,暂时还未更新。

至于使用 emqx foreground 命令启动就不再报错,可能是因为你当前用户不受 CPU 限制的影响。

你好,是否可以提供具体的限制?
K8s是私有部署吗?
很有可能在给线程绑定cpu core的时候出错,平台是否有类似限制?

确实限制的CPU的核数,我们的容器云部署服务时,必须指定CPU核数上限

也是在容器里运行的吗?

是的

那不应该。那估计是真的k8s host 内存不够了。
请问用的是哪个image, 如何部署的 helm还是operator 有没有配置文件可以分享?

process_limit = 2097152
max_ports = 1048576

这2个太高了 会多占用1G更多的内存,请降下来试试。

基于centos7的基础镜像自己构建的镜像,下面是我用的dockerfile,部署在k8s容器云中,由于我们的k8s版本过低,没法使用你们官方提供的operator,现在是把emqx部署成一个有状态服务,集群发现方式想用dns方式,帮忙看看我的关键配置信息是否有误。
FROM centos:7
WORKDIR /root
COPY emqx-5.0.16-el7-amd64.tar.gz emqx.conf /tmp/
RUN set -x
&& yum install -y net-tools bind-utils
&& chmod u+s /usr/bin/ping /usr/bin/netstat
&& chmod g+s /usr/bin/ping /usr/bin/netstat
&& mkdir -p /opt/emqx && tar -zxvf /tmp/emqx-5.0.16-el7-amd64.tar.gz -C /opt/emqx
&& mkdir -p /var/log/emqx
&& groupadd -g 800 emqx && adduser -d /opt/emqx -u 888 -g emqx -s /bin/bash emqx; chown -R emqx:emqx /opt/emqx/; chown -R emqx:emqx /var/lib/; chown -R emqx:emqx /var/log/emqx; passwd -d emqx
&& rm -rf /opt/emqx/etc/emqx.conf && cp /tmp/emqx.conf /opt/emqx/etc/
&& rm -rf /tmp/*

USER 888

EXPOSE 1883 8083 8084 8883 11883 18083 4370 5369
LABEL health.type=“tcp”
health.url=“1883”
health.live_type=“tcp”
health.live_url=“1883”
resource.cpu=“4”
resource.memory=“4096”
config.files=“/opt/emqx/etc/emqx.conf”
logs.info=“jxg-java:/opt/emqx/log/”
WORKDIR /opt/emqx/
CMD [“/opt/emqx/bin/emqx”,“foreground”]

下面是关键配置项的配置信息:
node {
cookie = “emqxsecretcookie”
data_dir = “data”
process_limit = 2097152
max_ports = 1048576
}

log {
file_handlers.default {
level = info
file = “log/emqx.log”
enable = true
}
}

cluster {
discovery_strategy = dns
dns {
name = “message-emqx-svc.basics-tenant-message.svc.cluster.local”
record_type = srv
}
}

麻烦问一下,我想把emqx部署成一个有状态服务emqxsvc,集群发现方式配置成下面的dns方式的时候,node.name应该怎么配置才能保证有状态服务的每一个实例使用不同的名字呢?

cluster {
discovery_strategy = dns
dns {
name = “emqxsvc.basics-tenant-message.svc.cluster.local”
record_type = srv
}
}

可以具体参考我们官方的helm chart 模版

之前用的是 emqx start?

问题解决了吗?是资源的问题吗?

我们的容器仅部署在此节点上出现这个问题,资源足够。其他没有配置巨页的节点都是正常的。对cpu配置或k8s节点有要求吗?

其他节点配置类似: