Kubernetes

/var/log/containers에 symbolic link가 사라진 경우

eden.do 2022. 10. 11. 15:41

kubernetes에서 /var/log/containers에 pod들의 로그가 symbolic link로 연결되어 있습니다. 하지만, 간혹 symblic link가 사라지는 경우가 발생하는데 그 이유는 무엇일까요?

 

이유는 아래 링크에서 찾아볼 수 있었습니다. 

https://access.redhat.com/solutions/5188741

 

요약하자면, 도커에서는 --log-opt max-size, --log-opt max-file에 의해 log rotation이 됩니다. log rotation이란, 일정 단위로 로그파일을 재갱신하는 작업을 의미하는데, 무작정 로그를 쌓는것이 아니라 일정 주기로 백업하거나 또는 덮어쓰는 등의 처리를 하면서 log를 rotation 시킵니다. 이 rotation 주기는 데이터 별로 다른데 지워도 문제가 없을 수준으로 보통 정하게 됩니다. 

 

log 차는 속도가 빠르거나 log rotation이 자주 이루어지면 race condition이 발생할 수 있고 kubelet GC(garbage collection)이 돌면서 docker symlink가 손실될 수 있습니다. race condition이란 두 개 이상의 프로세스가 공통 자원을 병행적으로 읽거나 쓸 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행결과가 같지 않고 달라지는 상황을 의미합니다. 즉, 두 개의 스레드가 하나의 자원을 놓고 서로 사용하려고 경쟁하는 상황을 의미합니다. kubelet GC (garbage collection)은 소유자가 없는 오브젝트를 찾아서 삭제해주는 역할을 합니다. 그래서 race condition 상황에서 로그에 대한 소유자가 없어졌을 때 로그에 대한 링크를 지워버리는 것이지요.

 

 --log-opt max-size, --log-opt max-file를 확인하는 방법은 아래와 같습니다. 

cat /etc/systemd/system/docker.service.d/docker-options.conf

[Service]
Environment="DOCKER_OPTS=   --registry-mirror=xxxxxxxxxx --data-root=/var/lib/docker --log-opt max-size=50m --log-opt max-file=5 --bip=10.251.42.1/16 --iptables=True

최대 50메가 크기의 5개의 파일이 로그 로테이트 되는 것으로 설정되어 있습니다. 이 크기와 갯수 조절을 통해 log rotation이 되는 주기를 조절함으로써 symlink가 삭제되는 현상을 방지할 수 있습니다. 이 option을 변경한 후에는 docker 데몬을 재시작해야합니다. 

 

symlink 거는 방법

ln -s [원본 경로] [링크 이름]

https://ksr930.tistory.com/65

 

[출처]

https://minguss.github.io/devlog/2021/06/30/kubernetes-Garbage-collection.html