helm template 의 변수 치환 개념helm 차트 디렉토리/파일 구성 설명에서 "--set <key>=<value>" 또는 value.yaml 파일로 치환될 변수를 지정해 줄 수 있다고 하였다. 그러나 "--set" 방식으로 모든 파라미터를 넘기기에는 그 갯수가 너무 많고, value.yaml 에만 지정하여 사용하면 환경별로 다른 변수들을 관리하기 힘들다는 단점이 있다. 따라서 환경별로 다른 변수들만 지정해놓은 value-<환경명>.yaml 같은 파일을 만들고, 이를 helm 배포 커맨드에서 지정하여 사용하는 방법을 소개한다.

 

1. helm 패키지 디렉토리 구성

my-chart/
├── .helmignore 
├── Chart.yaml
├── values.yaml
├── values-dev.yaml  // 추가
├── values-qa.yaml   // 추가
├── values-prod.yaml // 추가
├── charts/
└── templates/
    ├── NOTES.txt
    ├── _helpers.tpl
    ├── deployment.yaml
    ├── hpa.yaml
    ├── ingress.yaml
    ├── service.yaml
    ├── serviceaccount.yaml
    └── tests/

 

위와 같이 패키지 루트에 values.yaml 의 형제로 values-<환경명>.yaml 파일을 생성해준다. 해당 파일에는 환경별로 다르게 지정해주고 싶은 변수들을 아래 예시처럼 선언해준다.(예시: values-dev.yaml)

replicaCount: 1
resources:
  limits:
    cpu: 200m
    memory: 200Mi
  requests:
    cpu: 100m
    memory: 100Mi

 

2. 배포 커맨드

helm upgrade <배포명> <helm 패키지 경로> -f <환경별 values.yaml 경로> --install

위와 같은 형식으로 "-f" 옵션을 통해 배포할 환경의 values-<환경명>.yaml 경로를 지정해주면 실제 기본 values.yaml 내용 위에 해당 내용이 오버레이된다. 즉, 기본으로 values.yaml 내용을 사용하되, values-<환경명>.yaml 파일에 지정된 변수가 override 된다. 만약 위의 예시에서처럼 values-dev.yaml 파일에 replicaCount: 1 이 지정되어있고, 기본 values.yaml 에는 replicaCount: 2 가 지정되어있다면, 최종적으로 replicaCount 는 1이 된다.

 

참고로, helm install 은 헬름 패키지를 클러스터에 처음 배포할 때에만 사용할 수 있는 명령어이고(이미 동일한 이름의 릴리즈가 있으면 에러 발생), helm upgrade 는 이미 클러스터에 배포되어있는 헬름 패키지 릴리즈의 내용이나 버전을 수정배포할 때 쓰인다. 하지만, upgrade 명령어를 사용하면서 --install 옵션을 추가하면 릴리즈가 없을때는 install 과 동일하게 동작하게 되어서 보통 helm install 을 따로 쓰기보다는 helm upgrade --install 형식으로 쓰인다.

 

3. --set 파라미터와 -f 파일 지정을 함께 썼을 때

위에서 말했듯 helm install 또는 helm upgrade 실행시에 "--set <key>=<value>" 형식으로 파라미터를 지정할 수 있다. 그렇다면 동일한 변수를 --set 으로도 지정하고, -f 로도 지정하면 어떻게 될까?

결론은 --set 파라미터가 최종적으로 override 하게 된다. 따라서 --set 과 함께 사용할때는 의도대로 변수가 오버라이드되는지 유의하여야 한다.

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

1. Release 객체란

helm 패키지를 사용하다보면 사용자 정의 변수를 지정할 수 있는 _helpers.tpl 내에 {{ .Release.Name }} 같이 ".Release" 로 접근하는 변수를 접하게 된다. ".Chart" 나 ".Values" 는 각각 Chart.yaml, values.yaml 파일에 선언된 변수를 가져온다는 것을 알겠는데, ".Release" 는 어디서 가져오는 것일까?

Release 객체는 특정 파일에 정의된 변수가 아니라, Helm 이 실행될 때 자체적으로 생성하여 제공하는 빌트인 객체이다.

 

2. Release 객체가 제공하는 주요 속성

다음과 같은 동적인 배포 정보에 접근 가능하다.

속성명 정보
Name 사용자가 helm install <릴리즈명> 명령어에서 지정한 <릴리즈명>
Namespace 패키지가 배포되는 k8s 의 네임스페이스명
Service 리소스 매니페스트를 렌더링하는 서비스 이름(기본값 Helm)
IsUpgrade 현재 릴리즈가 install(최초 배포) 이 아닌 upgrade(버전 업데이트) 인지 여부(true/false)
IsInstall 현재 릴리즈가 install (최초 배포) 인지 여부 (true/false)

 

3. _helpers.tpl 에서의 활용 예시

주로 동일한 리소스의 이름이 중복되지 않도록 릴리즈 이름을 조합할 때 많이 사용한다.

{{/* 릴리즈 이름과 차트 이름을 조합하여 고유한 리소스 이름을 생성하는 _helpers.tpl 예시 */}}
{{- define "my-chart.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" }}
{{- end }}
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

아래 명령으로 헬름 패키지를 생성한다.

helm create <헬름 패키지명>

현재 경로에 <헬름 패키지명> 으로 디렉토리가 생성되며, 그 하위로 아래와같은 구조의 파일 트리가 생성된다. 아래는 helm create my-chart 를 실행한 결과이다.

my-chart/
├── .helmignore 
├── Chart.yaml
├── values.yaml
├── charts/
└── templates/
    ├── NOTES.txt
    ├── _helpers.tpl
    ├── deployment.yaml
    ├── hpa.yaml
    ├── ingress.yaml
    ├── service.yaml
    ├── serviceaccount.yaml
    └── tests/

각각의 파일/디렉토리의 용도는 아래와 같다.

파일/디렉토리명 용도 예시
.helmignore 렌더링(헬름이 배포 가능한 매니페스트를 만드는 과정)시 제외할 파일/디렉토리 지정 배포하지 않을 참고용 샘플 yaml 파일
Chart.yaml 차트 기본정보 선언 패키지의 이름, 버전, 설명 및 API 버전 등 메타데이터를 정의
values.yaml 배포될 yaml 파일에 들어갈 변수 기본값 선언. 환경별 배포 설정시 사용. templates/service.yaml 의 {profile} 부분에 들어갈 값
charts/ main app 과 함께 배포되어야 하는 sub app 폴더. 즉, main app 이 의존하고 있는 다른 app 들의 패키지를 지정. my-chart 앱 배포시 함께 배포되어야 하는 앱을 지정
templates/ . main app 폴더  
NOTES.txt 배포 후 표시될 안내문구  
_helpers.tpl 사용자 정의 전역변수 선언(helper 함수 형태)  
리소스 매니페스트 파일들 main app 리소스 매니페스트 템플릿들. values.yaml 에서 주입받은 값으로 최종 매니페스트가 렌더링됨.  
tests/ main app 배포 후 통신상태 확인을 위한 pod 템플릿 디렉토리  

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

helm kubernetes 패키지 매니저는 변수 치환 방식으로 helm 매니페스트 템플릿을 동적으로 클러스터에 배포할 수 있다.

kind: Service
metadata:
  name: sample-api
spec:
  selector:
    profile: {profile}
  ports:
    - port: {port}
      targetPort: 8080
      nodePort: {nodePort}

 

위와 같은 매니페스트 파일이 sample-api/templates/service.yaml 경로에 존재한다고 하자.(sample-api 디렉토리는 헬름 차트 디렉토리로 구성되어있다.) 이제 아래 커맨드를 실행해보자.

helm install sample-api ./sample-api --set port="80" --set profile="dev" --set nodePort="33333"

helm install 은 k8s 클러스터에 헬름 패키지를 처음 배포할 때 쓰는 명령어이고, 위와 같은 명령어로 배포하면 "sample-api" 라는 임의의 인스턴스명으로 ./sample-api 헬름 패키지가 배포된다. --set 으로 파라미터를 <key>=<value> 형식으로 지정하면 template 파일 내에서 해당 {변수}가 치환된다.

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,