본문으로 건너뛰기

[Loki] fsGroupChangePolicy=OnRootMismatch로 Pod 시작 속도 향상

PR 링크: grafana/loki#13942 상태: Merged | 변경: +37 / -23

들어가며

Kubernetes에서 securityContext.fsGroup을 설정하면, Pod 시작 시 마운트된 볼륨의 모든 파일에 대해 재귀적으로 chown을 실행합니다. Loki처럼 대량의 로그 데이터를 볼륨에 저장하는 경우, 수십만 개의 파일에 대한 소유권 변경이 수 분이 걸릴 수 있습니다. fsGroupChangePolicy: OnRootMismatch를 설정하면, 루트 디렉토리의 소유권이 이미 올바른 경우 재귀적 chown을 건너뛰게 됩니다.

핵심 코드 분석

values.yaml에 fsGroupChangePolicy 추가

loki:
  podSecurityContext:
    fsGroup: 10001
    fsGroupChangePolicy: "OnRootMismatch"  # 신규 추가
    runAsGroup: 10001
    runAsNonRoot: true
    runAsUser: 10001

Kubernetes 버전 호환 처리

{{- define "loki.podSecurityContext" -}}
{{- if semverCompare ">=1.23-0" $.Capabilities.KubeVersion.GitVersion }}
{{- toYaml .Values.loki.podSecurityContext }}
{{- else }}
{{- toYaml (omit .Values.loki.podSecurityContext "fsGroupChangePolicy")  }}
{{- end }}
{{- end -}}

fsGroupChangePolicy는 Kubernetes 1.23부터 GA(General Availability)이므로, 이전 버전에서는 이 필드를 생략하여 호환성을 유지합니다.

모든 컴포넌트에 일괄 적용

기존에 각 StatefulSet과 Deployment에서 직접 .Values.loki.podSecurityContext를 참조하던 것을, 헬퍼 함수 loki.podSecurityContext를 통해 간접 참조하도록 변경했습니다.

# Before (각 컴포넌트)
securityContext:
  {{- toYaml .Values.loki.podSecurityContext | nindent 8 }}

# After
securityContext:
  {{- include "loki.podSecurityContext" . | nindent 8 }}

이 변경이 backend, bloom-builder, bloom-gateway, compactor, distributor, ingester 등 약 15개 템플릿에 적용되었습니다.

왜 이게 좋은가

  1. Pod 시작 시간 단축: 대량의 파일이 있는 볼륨에서 재귀적 chown을 건너뛰어, 시작 시간이 수 분에서 수 초로 줄어들 수 있습니다.
  2. 롤링 업데이트 가속: StatefulSet의 각 Pod가 빠르게 시작되므로, 전체 롤링 업데이트 시간도 비례하여 줄어듭니다.
  3. 하위 호환성: Kubernetes 1.23 미만에서는 자동으로 fsGroupChangePolicy를 제거하여, 오류 없이 동작합니다.
  4. Kubernetes 공식 권장 사항 적용: Kubernetes 문서에서도 대용량 볼륨에 OnRootMismatch를 권장합니다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글