Skip to content

3단계. 헬름 차트 배포

bitnami nginx 헬름 차트를 사용하여 커스텀 이미지를 Runway 플랫폼에 배포합니다.

bitnami 차트는 공식 bitnami 이미지를 기준으로 설계되어 있어, 커스텀 이미지로 교체할 경우 기본 values.yaml을 그대로 사용하면 여러 오류가 발생합니다. 이 단계에서는 반드시 수정해야 하는 항목을 중심으로 설명합니다.


사전 준비

  • 배포할 이미지가 Runway 플랫폼에서 접근 가능한 레지스트리에 푸시되어 있어야 합니다.
  • 사용할 헬름 차트와 버전을 확인합니다.

values.yaml 필수 수정 항목

항목 기본값 변경값 이유
global.security.allowInsecureImages false true 비공식 이미지 허용
namespaceOverride "" 프로젝트 네임스페이스 Runway 플랫폼 프로젝트 지정
service.type LoadBalancer ClusterIP Gateway API 사용
httpRoute.enabled false true 외부 접근 라우팅
resourcesPreset "nano" "none" 쿼터 초과 방지
enableDefaultInitContainers true false bitnami 전용 스크립트 제거
readOnlyRootFilesystem true false nginx 파일시스템 쓰기 허용
runAsUser / runAsGroup 1001 0 nginx root 실행 필요
runAsNonRoot true false nginx root 실행 필요
capabilities.add 없음 CHOWN, SETUID, SETGID chown 권한 필요

항목별 설명

1. 이미지 설정

image:
  registry: <IMAGE_REGISTRY>      # 예: gitea.{베이스 도메인}
  repository: <IMAGE_REPOSITORY>  # 예: my-project/my-app
  tag: <IMAGE_TAG>                 # 예: 1.0.0

2. 비공식 이미지 허용

bitnami 차트는 기본적으로 공식 bitnami 이미지가 아닌 경우 배포를 차단합니다.

global:
  security:
    allowInsecureImages: true

이 설정 없이 배포하면 에러코드 400이 발생합니다.

3. 네임스페이스

Runway 플랫폼에서는 프로젝트마다 고유한 네임스페이스가 할당됩니다.

namespaceOverride: "<PROJECT_NAMESPACE>"

프로젝트 네임스페이스는 설정 > 일반 > ID에서 확인할 수 있습니다.

4. 서비스 타입 및 HTTPRoute

Runway 플랫폼은 Gateway API 기반으로 외부 트래픽을 처리합니다.

service:
  type: ClusterIP

httpRoute:
  enabled: true
  parentRefs:
    - name: <GATEWAY_NAME>            # 예: platform-core-gateway
      namespace: <GATEWAY_NAMESPACE>  # 예: istio-system
  hostnames:
    - <APP_HOSTNAME>                  # 애플리케이션 열기 링크에 입력한 URL
  matches:
    - path:
        type: PathPrefix
        value: /

Gateway 이름과 네임스페이스는 클러스터 관리자에게 확인하거나 kubectl get gateway -A로 조회할 수 있습니다.

5. 리소스 설정

bitnami 차트의 기본 resourcesPreset: "nano"는 CPU 150m을 요청합니다. 워크스페이스 CPU 쿼터가 부족한 경우 Pod 생성이 차단됩니다.

resourcesPreset: "none"
resources:
  requests:
    cpu: 50m
    memory: 64Mi
  limits:
    cpu: 100m
    memory: 128Mi

6. bitnami initContainer 비활성화

bitnami 전용 스크립트를 실행하는 initContainer를 비활성화합니다. 커스텀 이미지에는 해당 스크립트가 없습니다.

enableDefaultInitContainers: false

이 설정 없이 배포하면 Init:CrashLoopBackOff 오류가 발생합니다.

7. 컨테이너 보안 컨텍스트

일반 nginx 이미지는 시작 시 파일시스템 쓰기와 root 권한이 필요합니다.

containerSecurityContext:
  runAsUser: 0
  runAsGroup: 0
  runAsNonRoot: false
  readOnlyRootFilesystem: false
  capabilities:
    add: ["CHOWN", "SETUID", "SETGID"]
    drop: ["ALL"]

최소 values.yaml 예시

위 항목을 반영한 최소 values.yaml 예시입니다.

global:
  security:
    allowInsecureImages: true

namespaceOverride: "<PROJECT_NAMESPACE>"

image:
  registry: <IMAGE_REGISTRY>
  repository: <IMAGE_REPOSITORY>
  tag: <IMAGE_TAG>

enableDefaultInitContainers: false

containerSecurityContext:
  runAsUser: 0
  runAsGroup: 0
  runAsNonRoot: false
  readOnlyRootFilesystem: false
  capabilities:
    add: ["CHOWN", "SETUID", "SETGID"]
    drop: ["ALL"]

resourcesPreset: "none"
resources:
  requests:
    cpu: 50m
    memory: 64Mi
  limits:
    cpu: 100m
    memory: 128Mi

service:
  type: ClusterIP

httpRoute:
  enabled: true
  parentRefs:
    - name: <GATEWAY_NAME>
      namespace: <GATEWAY_NAMESPACE>
  hostnames:
    - <APP_HOSTNAME>
  matches:
    - path:
        type: PathPrefix
        value: /