A one-line Kubernetes fix that saved 600 hours a year (새 탭에서 열림)

쿠버네티스 환경에서 테라폼(Terraform) 운영 도구인 아틀란티스(Atlantis)의 재시작 시간을 30분에서 수 초 내외로 단축하여, 연간 600시간의 엔지니어링 대기 시간을 줄인 사례를 소개합니다. 문제의 원인은 수백만 개의 파일을 포함한 퍼시스턴트 볼륨(PV)을 마운트할 때 쿠버네티스가 기본적으로 수행하는 파일 권한 변경 작업이었습니다. 이를 해결하기 위해 securityContext에 단 한 줄의 설정을 추가함으로써 불필요한 재귀적 권한 검사를 방지하고 시스템 효율성을 극대화했습니다.

원인 불명의 느린 재시작 문제

아틀란티스는 테라폼 프로젝트의 상태를 유지하기 위해 퍼시스턴트 볼륨(PV)을 사용하는 싱글톤 스테이트풀셋(StatefulSet)으로 운영됩니다. 자격 증명 갱신이나 프로젝트 온보딩 시 재시작이 필수적인데, 이때마다 다음과 같은 심각한 지연이 발생했습니다.

  • 지속적인 지연: 매 재시작 시 30분 동안 포드가 Init:0/1 상태에 머물며 인프라 변경 작업이 완전히 중단됨.
  • 운영 부담: 매달 약 100회의 재시작이 발생하여 월 50시간, 연간 600시간의 엔지니어링 시간이 낭비되고 온콜 엔지니어에게 불필요한 알람이 전송됨.
  • 한계 도달: 파일 시스템의 아이노드(Inode) 고갈로 볼륨 크기를 키워야 하는 상황에서, 재시작 지연 문제는 더욱 두드러짐.

Kubelet 로그를 통한 기술적 병목 파악

일반적인 kubectl events로는 포드가 이미지를 풀링하기 전 단계에서 왜 멈춰 있는지 알 수 없었습니다. 팀은 노드 레벨의 kubelet 로그를 분석하여 구체적인 원인을 찾아냈습니다.

  • 로그 추적: 로그상에서 볼륨 마운트 성공 메시지 이후 context deadline exceeded 오류가 반복적으로 발생하며 포드 생성이 지연됨을 확인.
  • fsGroup 권한 설정: 쿠버네티스는 볼륨을 마운트할 때 포드의 fsGroup 설정과 일치시키기 위해 볼륨 내의 모든 파일과 디렉토리에 대해 재귀적으로 chownchmod를 실행함.
  • 파일 개수의 영향: 아틀란티스 볼륨에 쌓인 수백만 개의 파일에 대해 매번 이 작업을 수행하면서 30분이라는 막대한 시간이 소요됨.

단 한 줄의 설정 변경으로 문제 해결

쿠버네티스 1.20 버전(GA 기준)부터 도입된 fsGroupChangePolicy 설정을 통해 이 문제를 간단히 해결할 수 있었습니다.

  • 기본값(Always): 포드가 시작될 때마다 항상 모든 파일의 권한을 재귀적으로 변경함.
  • 해결책(OnRootMismatch): 볼륨 루트 디렉토리의 권한이 fsGroup과 일치하지 않을 때만 재귀적 변경을 수행함. 이미 권한이 올바르게 설정되어 있다면 이 과정을 건너뜀.
  • 적용 코드:
    securityContext:
      fsGroup: 1000
      fsGroupChangePolicy: "OnRootMismatch"
    

실용적인 권장 사항

수백만 개의 작은 파일이 포함된 대규모 볼륨을 사용하는 애플리케이션(예: Prometheus, Atlantis, Jenkins 등)을 쿠버네티스에서 운영 중이라면, fsGroupChangePolicy: "OnRootMismatch" 설정을 기본적으로 적용하는 것이 좋습니다. 이를 통해 볼륨 마운트 시 발생하는 불필요한 디스크 I/O를 제거하고, 포드 시작 시간을 획기적으로 개선하여 인프라 운영의 가용성을 높일 수 있습니다.