Kubernetes(쿠버네티스)는 현대적인 클라우드 인프라의 핵심 플랫폼으로, 대규모 컨테이너 오케스트레이션을 담당합니다. 그러나 수많은 Pod, 컨테이너에서 생성되는 로그 파일은 빠르게 누적되며 디스크 공간을 압박합니다.
특히 로그를 자동으로 삭제하지 않으면 노드의 /var/log
, /var/lib/docker
또는 /var/lib/containerd
경로가 가득 차고, 이는 곧 노드 장애, Pod 재시작 실패, 로그 손실 등의 문제로 이어집니다.
이 글에서는 Kubernetes 환경에서 로그 파일을 주기적으로 정리하고, 효율적으로 관리하는 방법을 상세하게 안내합니다. 로그 수집 도구가 없더라도 노드 수준에서 정기 삭제하는 방법, Log Rotation 정책, 그리고 best practice까지 포함했습니다.
1. Kubernetes 로그 파일의 저장 위치
기본적으로 쿠버네티스 로그는 노드의 OS에 저장됩니다.
- 컨테이너 로그
/var/log/pods/<namespace>_<pod-name>_<uid>/ /var/lib/docker/containers/<container-id>/<container-id>-json.log /var/log/containers/*.log
- kubelet, kube-proxy, kube-apiserver 로그
/var/log/kubelet.log /var/log/kube-proxy.log /var/log/kube-apiserver.log
로그 드라이버에 따라 저장 위치와 형식은 달라지며, 대부분의 환경에서는 json-file
또는 containerd
로그 형식을 사용합니다.
2. 로그 정리하지 않으면 발생하는 문제
- 🔴 디스크 과부하로 인한 노드 중단
- 🔴 Pod 생성 실패 (디스크 부족으로 인해 eviction 발생)
- 🔴 모니터링 누락 (중요 로그 유실)
- 🔴 CI/CD 파이프라인 실패
- 🔴 클러스터 전반의 안정성 저하
3. Kubernetes에서 로그 삭제 방법 3가지
✅ 1) 로그 자동 삭제 설정 (logrotate 활용)
노드의 로그 파일에 대해 logrotate
를 설정하면 자동으로 주기적 삭제 및 압축이 가능합니다.
logrotate 설정 예시:
/var/lib/docker/containers/*/*.log {
daily
rotate 7
compress
missingok
copytruncate
notifempty
}
daily
: 매일 회전rotate 7
: 7개 파일까지 보관compress
: gzip으로 압축copytruncate
: 실행 중인 프로세스 영향을 최소화
/etc/logrotate.d/k8s-containers
로 저장한 뒤 crond 등록을 확인합니다.
sudo systemctl status crond
containerd
사용 시 경로는/var/log/pods/
,/var/log/containers/
등을 지정
✅ 2) 컨테이너 로그 비우기 스크립트 + 크론잡
다음 스크립트를 사용하여 컨테이너 로그를 직접 비울 수 있습니다.
#!/bin/bash
echo "=== Kubernetes 컨테이너 로그 초기화 ==="
find /var/lib/docker/containers/ -type f -name "*.log" -exec truncate -s 0 {} \;
echo "=== 완료 ==="
크론잡 등록 예:
crontab -e
0 2 * * * /usr/local/bin/clear-k8s-logs.sh
truncate
명령은 inode 유지하면서 로그를 0으로 만들어 안전합니다.
✅ 3) 컨테이너 런타임 로그 사이즈 제한
Docker 또는 containerd 환경에서는 컨테이너 로그 크기 제한 설정도 가능합니다.
Docker:
# /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "5"
}
}
sudo systemctl restart docker
containerd:
# /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
[plugins."io.containerd.grpc.v1.cri".containerd.default_runtime.options]
log_size_max = 10485760 # 10MB
적용 후 재시작:
sudo systemctl restart containerd
4. 로그를 외부 저장소로 전송하는 방법 (Fluentd, Loki, EFK)
실무에서는 로그 파일을 삭제하기보다는 외부로 수집하여 보관하는 방식이 널리 쓰입니다.
- Fluentd / Fluent Bit → S3, Elasticsearch 등으로 로그 전송
- EFK Stack (Elasticsearch + Fluentd + Kibana) 구축
- Grafana Loki + Promtail로 경량 로그 수집
이러한 구조에서는 노드 디스크에 로그를 오래 보관할 필요가 없어지므로 삭제 주기를 짧게 설정하거나 비활성화할 수도 있습니다.
5. Node 디스크 사용량 모니터링 자동화
로그가 디스크를 압도하기 전에 미리 경고를 받을 수 있도록 스크립트를 cron에 등록할 수 있습니다.
df -h | grep "/var" | awk '{ print $5 }' | sed 's/%//' | while read usage; do
if [ $usage -gt 85 ]; then
echo "⚠️ Kubernetes 노드 디스크 사용률 $usage% 초과!" | mail -s "K8s 디스크 경고" devops@example.com
fi
done
6. Kubernetes에서 logrotate 자동화 DaemonSet 배포 (고급)
여러 노드에 일괄 logrotate 정책을 배포하고 싶다면 DaemonSet으로 배포할 수 있습니다.
예제: logrotate
DaemonSet 매니페스트
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: logrotate
namespace: kube-system
spec:
selector:
matchLabels:
name: logrotate
template:
metadata:
labels:
name: logrotate
spec:
containers:
- name: logrotate
image: busybox
command:
- /bin/sh
- -c
- >
while true; do
logrotate -f /etc/logrotate.conf;
sleep 86400;
done
volumeMounts:
- name: varlog
mountPath: /var/log
- name: logrotateconf
mountPath: /etc/logrotate.conf
subPath: logrotate.conf
volumes:
- name: varlog
hostPath:
path: /var/log
- name: logrotateconf
configMap:
name: logrotate-config
자주 묻는 질문 (FAQ)
Q1. 쿠버네티스 Pod 로그는 자동 삭제되지 않나요?
A. 기본적으로 자동 삭제되지 않습니다. 컨테이너 런타임이 로그를 생성하고 보관하며, 별도 설정이 없으면 무제한으로 로그가 누적됩니다.
Q2. 로그 파일을 직접 삭제해도 괜찮을까요?
A. rm
명령으로 직접 삭제하면 로그 핸들이 끊기거나 로그가 사라질 수 있습니다. truncate -s 0
또는 logrotate
의 copytruncate
옵션을 사용하는 것이 안전합니다.
Q3. Fluentd 등을 사용하면 로그 삭제가 필요 없나요?
A. 수집이 완료된 후에는 노드 디스크 용량 확보를 위해 삭제 또는 압축이 필요합니다. 수집만 하고 삭제하지 않으면 여전히 디스크가 가득 찰 수 있습니다.
Q4. 컨테이너 런타임 변경 시 설정도 바뀌나요?
A. 예. Docker에서 containerd로 변경하거나 CRI-O를 사용하는 경우 로그 파일 위치와 설정이 달라지므로 별도 정책 적용이 필요합니다.
Q5. 로그 압축 vs 삭제, 어떤 게 더 좋은가요?
A. 압축은 로그 보관을 원하는 경우에, 삭제는 빠르게 디스크 확보가 필요할 때 사용합니다. 보안, 규제, 감사 요구사항에 따라 정책을 다르게 설정해야 합니다.
실무 요약
항목 | 설정 방법 |
---|---|
로그 위치 | /var/lib/docker/containers , /var/log/pods , /var/log/containers |
삭제 도구 | logrotate , truncate , cron , DaemonSet |
자동화 방식 | 노드단 cron, DaemonSet 배포 |
외부 수집 | Fluentd, Loki, Elasticsearch |
디스크 경고 | df + mail 스크립트 활용 |
런타임별 설정 | Docker: daemon.json / containerd: config.toml |
마무리
쿠버네티스에서 로그 파일을 주기적으로 정리하는 것은 클러스터의 안정성과 가용성을 유지하기 위한 필수 작업입니다. 로그 수집 도구를 사용하더라도 노드의 디스크 관리가 소홀하면 시스템 장애로 이어질 수 있습니다.
- ✅
logrotate
또는truncate
를 통해 주기적 삭제 - ✅ 런타임 설정을 통해 로그 크기 제한
- ✅ 외부 로그 수집 도구와 병행 사용
- ✅ cron, DaemonSet 등으로 자동화 구현
운영 중인 쿠버네티스 클러스터에 위의 설정을 적용하여 안정적이고 예측 가능한 로그 환경을 구축해보세요.
🔍 관련 키워드: Kubernetes 로그 삭제, 쿠버네티스 로그 자동화, k8s log cleanup, logrotate DaemonSet, Fluentd 로그 수집, containerd 로그 정리, kubelet 로그 삭제
'전산' 카테고리의 다른 글
# AWS 백업 및 복구하기 (0) | 2025.04.09 |
---|---|
# AWS 방화벽 및 보안 그룹 설정하기 (0) | 2025.04.09 |
# Docker에서 로그파일을 주기적으로 삭제하는 방법 (0) | 2025.04.09 |
# 리눅스 서버에서 로그파일을 주기적으로 삭제하는 방법 (0) | 2025.04.09 |
# 윈도우 서버에서 로그파일을 주기적으로 삭제하는 방법 (0) | 2025.04.09 |