26Z24d

QK·2026년 8월 24일

ConfigMap 마운트 시 심볼릭 링크(..data/..) 구조와 리눅스 파일 시스템 권한, etcd 페이로드 한계로 인해 Headlamp 백엔드 로더가 플러그인을 온전히 읽지 못해 에러가 지속되는 현상입니다.

엔터프라이즈 환경에서 Headlamp 플러그인을 가장 안정적이고 영구적으로 마운트하는 2가지 정석적인 방법입니다.


방법 1. Init Container + emptyDir 복사 방식 (가장 강력 추천)

ConfigMap의 심볼릭 링크를 사용하지 않고, 기동 시 실제 일반 파일(Plain File)로 /headlamp/plugins/ 경로에 완벽하게 복사해 넣는 패턴입니다.

1. 플러그인 ConfigMap 생성 (기존과 동일)

kubectl create configmap headlamp-lakehouse-plugin \
  --from-file=main.js=./dist/main.js \
  --from-literal=package.json='{
    "name": "lakehouse-monitor",
    "version": "0.1.0",
    "main": "main.js",
    "description": "Lakehouse Monitoring Plugin",
    "headlamp": {
      "name": "lakehouse-monitor",
      "version": "0.1.0",
      "description": "Lakehouse Monitoring Plugin"
    }
  }' \
  -n headlamp \
  --dry-run=client -o yaml | kubectl apply -f -

2. Helm values.yaml 설정

Init Container가 ConfigMap 원본을 읽어 emptyDir 볼륨에 실제 디렉토리와 파일 구조로 생성합니다.

# values.yaml
config:
  pluginsDir: /headlamp/plugins

initContainers:
  - name: init-lakehouse-plugin
    image: busybox:latest # 또는 사내 폐쇄망 busybox/alpine 이미지
    command:
      - sh
      - -c
      - |
        mkdir -p /target/lakehouse-monitor
        cp /src/main.js /target/lakehouse-monitor/main.js
        cp /src/package.json /target/lakehouse-monitor/package.json
        chmod -R 755 /target/lakehouse-monitor
    volumeMounts:
      - name: plugin-src
        mountPath: /src
      - name: plugin-storage
        mountPath: /target

# Headlamp 메인 컨테이너에 emptyDir 마운트
volumeMounts:
  - name: plugin-storage
    mountPath: /headlamp/plugins

# 볼륨 정의
volumes:
  - name: plugin-src
    configMap:
      name: headlamp-lakehouse-plugin
  - name: plugin-storage
    emptyDir: {}

3. 배포 및 검증

helm upgrade --install headlamp headlamp/headlamp -n headlamp -f values.yaml
  • 장점: 심볼릭 링크(..data)가 아닌 순수 파일로 복사되므로 Headlamp의 백엔드 파일 스캐너가 100% 정상 인식합니다.

방법 2. Headlamp 공식 컨테이너 이미지 자체에 번들링 (폐쇄망 최고 안정성)

ConfigMap 크기 제한이나 볼륨 마운트 의존성을 아예 제거하고, 사내 레지스트리에 플러그인이 내장된 커스텀 Headlamp 이미지를 빌드해 올리는 방식입니다.

1. Dockerfile 작성

FROM ghcr.io/headlamp-k8s/headlamp:latest # 또는 사내 베이스 이미지

# 플러그인 디렉토리에 직접 복사
RUN mkdir -p /headlamp/plugins/lakehouse-monitor
COPY dist/main.js /headlamp/plugins/lakehouse-monitor/main.js
COPY package.json /headlamp/plugins/lakehouse-monitor/package.json

USER headlamp

2. 빌드 및 사내 프라이빗 레지스트리 푸시

docker build -t registry.internal.example.com/headlamp:with-lakehouse-plugin .
docker push registry.internal.example.com/headlamp:with-lakehouse-plugin

3. Helm values.yaml에 커스텀 이미지 지정

# values.yaml (볼륨 마운트 설정 불필요)
image:
  repository: registry.internal.example.com/headlamp
  tag: with-lakehouse-plugin
  pullPolicy: IfNotPresent

config:
  pluginsDir: /headlamp/plugins

추천

  • ConfigMap 기반으로 즉시 적용하려면 방법 1 (Init Container 복사 방식)을 적용하세요.
  • 볼륨 마운트로 인한 모든 파일시스템/권한 버그를 원천 차단하려면 방법 2 (컨테이너 이미지 빌드 방식)가 프로덕션 환경에서 가장 깔끔합니다.
profile
engineer

0개의 댓글