我已经看到了很多关于使用运行 ES 的 unpriv 容器进行 docker 设置等的内容。基本上,我不想建立一个简单的“产品集群”。总共有两个节点,一个物理节点(用于数据),一个用于 Injest/Master(LXD 容器)。
我遇到的问题是使用
bootstrap.memory_lock: true
作为配置选项来锁定我的 container master/injest 节点上的内存(避免交换)。
[2018-02-07T23:28:51,623][WARN ][o.e.b.JNANatives ] Unable to lock JVM Memory: error=12, reason=Cannot allocate memory
[2018-02-07T23:28:51,624][WARN ][o.e.b.JNANatives ] This can result in part of the JVM being swapped out.
[2018-02-07T23:28:51,625][WARN ][o.e.b.JNANatives ] Increase RLIMIT_MEMLOCK, soft limit: 65536, hard limit: 65536
[2018-02-07T23:28:51,625][WARN ][o.e.b.JNANatives ] These can be adjusted by modifying /etc/security/limits.conf, for example:
# allow user 'elasticsearch' mlockall
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
...
[1]: memory locking requested for elasticsearch process but memory is not locked
现在,鉴于 ES 用户无法调整主机上的 ulimit,这是有道理的。鉴于我对此有足够的了解,这是危险的,鉴于主机上没有 ES 用户,有没有办法/如何确保我的 unpriv 容器可以锁定它所需的内存?
我将调用此解决方案 - 在父级上设置交换,并将该设置保留为容器中的默认值。不是我在问题中所说的“正确的方式”,但足够好/接近。
一个实际的解决方案是授予容器权限:
lxc config set container-name limits.kernel.memlock unlimited