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: /