티스토리 뷰

728x90
반응형

docker container는 host kernel을 공유하지만, 때로는 구분된 limit 정보를 구성해야할 경우가 발생한다.

예를 들어, nofile(open files)나 nproc(max user processes)의 경우 application의 요구사항에 따라 또는 솔루션의 요구사항에 따라 변경하여 적용할 필요가 있다.

아래는 docker container를 사용할 경우 ulimit을 일괄 변경하는 방법에 대해 알아보도록 하자.

systemctl show docker

먼저, docker의 variable 정보를 확인한다.

[root@ip-192-168-114-198 ~]# systemctl show docker
Type=notify
Restart=always
NotifyAccess=main
RestartUSec=2s
...
...
...
LimitCPU=18446744073709551615
LimitFSIZE=18446744073709551615
LimitDATA=18446744073709551615
LimitSTACK=18446744073709551615
LimitCORE=18446744073709551615
LimitRSS=18446744073709551615
LimitNOFILE=2048
LimitAS=18446744073709551615
LimitNPROC=2048
LimitMEMLOCK=65536
LimitLOCKS=18446744073709551615
LimitSIGPENDING=3790
...
...
...

docker run --ulimit

먼저 docker run --ulimit 옵션으로 각 도커 컨테이너 별 ulimit을 수정할 수 있다. 각 서비스 별로 서로 다른 ulimit 정보를 구성해야 할 경우 해당 옵션을 활용한다.

[root@ip-192-168-114-198 ~]# docker run --name ps --rm centos_ps:latest

core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3790
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@ip-192-168-114-198 ~]# docker run --name ps --ulimit nofile=2048:2048 --rm centos_ps:latest
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3790
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@ip-192-168-114-198 ~]# 

위와 같이 docker run --name ps --rm centos_ps:latest의 경우 open files가 1024였으나, docker run --name ps --ulimit nofile=2048:2048 --rm centos_ps:latest 적용 후 open files가 2048로 반영된 것을 확인할 수 있다.

이와 같은 경우 docker default 설정보다 우선시 되어 반영된다.

docker default options

docker의 default 설정은 /etc/sysconfig/docker에서 구성할 수 있다.

[root@ip-192-168-114-198 ~]# cat /etc/sysconfig/docker
# The max number of open files for the daemon itself, and all
# running containers.  The default value of 1048576 mirrors the value
# used by the systemd service unit.
DAEMON_MAXFILES=1048576

# Additional startup options for the Docker daemon, for example:
# OPTIONS="--ip-forward=true --iptables=true"
# By default we limit the number of open files per container
OPTIONS="--default-ulimit nofile=1024:4096"

# How many seconds the sysvinit script waits for the pidfile to appear
# when starting the daemon.
DAEMON_PIDFILE_TIMEOUT=10
[root@ip-192-168-114-198 ~]#

OPTIONS=" --default-ulimit nofile=1024:4096" 옵션을 반영할 경우 기본으로 Docker Container가 기동될때 별도의 옵션을 적용하지 않을 경우 1024:4096이 반영된다.

[root@ip-192-168-114-198 ~]# docker run --name ps --rm centos_ps:latest

core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3790
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@ip-192-168-114-198 ~]# 

daemon.json

/etc/docker/daemon.json의 경우 docker default options와 비슷하게 구성할 수 있으나, 보다 상세한 설정을 반영할 수 있다. daemon.json을 적용하기 위해서는 docker default options를 주석처리해야 반영이 가능하다.

{
        "default-ulimits": {
                "nofile": {
                        "Name": "nofile",
                        "Hard": 64000,
                        "Soft": 64000
                }
        }
}

적용이 완료되면 systemctl restart docker 재시작한다.

[root@ip-192-168-114-198 ~]# docker run --name ps --rm centos_ps:latest
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3790
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 64000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@ip-192-168-114-198 ~]#

결론

Kubernetes의 경우에도 마찬가지로 동작한다. docker를 기반으로 동작하기 때문에 Kubernetes의 서비스를 관리하는 방법으로 위와 같은 설정을 적용할 수 있다.

서비스 별로 서로 다른 ulimit 값을 지정하고 싶은 경우에는 docker run --ulimit 옵션을 재정의하고, 모든 docker image에 일괄로 적용하고 싶을 경우 모든 kubernetes worker node의 daemon.json에 적용하는 방법을 권고한다.

728x90
반응형