Kubernetes 는 여러 컨테이너를 관리할 수 있습니다. 그 이유는 kubernetes kubelet 과 컨테이너 데몬이 정해진 spec 에 따라 gRPC 통신을 하기 때문입니다. Kubernetes 는 여러 컨테이너를 적용할 수 있는데 rkt, docker, CRI-O 등이 있습니다. 이중에서 가장 많이 사용하는 Docker 에 대해서 설명하고자 합니다.
앞서 kubespray 사용에 대해서 설명이 있는데, 여기를 보면 Production Level 로 사용 가능한 CentOS, RedHat, Ubuntu에 맞게 docker 를 쉽게 설치할 수 있습니다. 여기서는 Docker 를 이미 설치한 후에 어떻게 Docker 를 잘 활용할 수 있는지에 대해서 설명합니다.
1. dockerd config option reload
대부분의 Linux 는 이제 systemd 를 활용하고 있습니다. 그렇기 때문에 docker 데몬 실행은 systemd 에 설치된 docker.service 를 보면 됩니다. 디렉토리는 둘 중에 하나를 찾아보면 됩니다.
/etc/systemd/system/multi-user.target.wants/docker.service
/etc/systemd/system/docker.service
제 환경은 CentOS 로 이렇게 정의가 되어 있습니다.
MountFlags=shared
EnvironmentFile=-/etc/sysconfig/docker
ExecStart=/usr/bin/dockerd $DOCKER_OPTS
ExecReload=/bin/kill -s HUP $MAINPID
dockerd 의 환경 파일로 /etc/sysconfig/docker 를 읽게 되어 있고 해당 파일은 아래 옵션으로 정의되어 있습니다.
DOCKER_OPTS="--storage-driver=overlay2 --insecure-registry docker-registry:5000 --insecure-registry oreo:5000"
이 경우 systemctl restart docker.service 를 하면 dockerd 가 restart 되는데 문제는 이미 실행되고 있는 docker 컨테이너가 영향을 받아 stop 으로 빠집니다. (kubernetes 의 deployment, daemonset, statefulset 혹은 docker 의 --restart=always 가 아닌 경우) 그러므로, docker 옵션만 reload 해야 기존의 실행되고 있는 컨테이너가 영향을 받지 않습니다.
docker option reload 는 SIGHUP 을 보내면 됩니다.
$ sudo kill -SIGHUP $(pidof dockerd)
하지만, 지금의 세팅으로는 다시 올라오지 않습니다.
dockerd 로그를 보면 다음과 같습니다. 로그는 다음 명령어로 볼 수 있습니다.
$ sudo journalctl --no-pager -u docker.service
kube-deploy dockerd[16391]: time="2018-10-27T18:36:17.767207453+09:00" level=info msg="Got signal to reload configuration, reloading from: /etc/docker/daemon.json"
kube-deploy dockerd[16391]: time="2018-10-27T18:36:17.767283042+09:00" level=error msg="open /etc/docker/daemon.json: no such file or directory"
디폴트로 dockerd 옵션은 /etc/docker/daemon.json 파일을 읽기 때문에 옵션 reload 가 안되는 문제가 있습니다.
이를 해결하기 위해서 다음과 같이 변경해 보겠습니다.
docker.service 에 정의된 EnvironmentFile 의 변수를 daemon.json 으로 옮기겠습니다.
/etc/systemd/system/multi-user.target.wants/docker.service
EnvironmentFile=-
$ sudo mkdir -p /etc/docker
$ sudo vi /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"insecure-registries": ["docker-registry:5000", "oreo:5000"]
}
docker.service 를 바꿨으니 어쩔 수 없이 한 번의 docker restart 는 해야 합니다.
$ sudo systemctl daemon-reload
$ systemctl restart docker.service
이제 현재의 dockerd option 이 어떤지 보겠습니다.
$ sudo docker system info
Storage Driver: overlay2
Insecure Registries:
docker-registry:5000
oreo:5000
127.0.0.0/8
Insecure Registries 의 oreo:5000 을 제거하고 싶다면 다음과 같이 daemon.json 에서 변경하면 됩니다.
{
"storage-driver": "overlay2",
"insecure-registries": ["docker-registry:5000"]
}
그리고 SIGHUP 을 보내서 option reload 를 하면 새로운 옵션이 적용됩니다.
$ sudo kill -SIGHUP $(pidof dockerd)
dockerd 옵션에 oreo:5000 이 Insecure Registries 에서 빠져 있는 것을 볼 수 있습니다.
$ sudo docker system info
Storage Driver: overlay2
Insecure Registries:
docker-registry:5000
127.0.0.0/8