티스토리 뷰

728x90
반응형

지금까지 Helm 사용법 및 Helm Customizing 방법에 대해 알아보았다.

자세한 내용은 아래를 참조한다.

 

Helm3 기본 명령어 확인 및 Kubernetes deploy

Helm3 Chart 커스터마이징

 

Helm의 사용법에 대해 알아보았으니, 이제 이를 활용한 Best Practice를 알아보고, 효과적으로 적용해 보도록 하자.

본 포스팅은 Helm 공식 사이트인 아래 URL을 참고하였다.

https://helm.sh/

 

Helm

Helm - The Kubernetes Package Manager.

helm.sh

 공통 규칙 

1. Chart Name

- Chart 이름은 소문자 + 숫자의 조합으로 구성되며, 두개 이상의 단어는 대시(-)로 구분한다.

- Chart 이름은 대문자, 밑줄(_), 점(.)을 사용할 수 없다.

- Chart는 디렉토리로 구성되어야 한다.

2. Chart Version

- SemVer2를 권고한다.

3. Yaml Formmating

- Yaml의 들여쓰기는 탭을 사용하지 않으며, 공백 두개를 기준으로 사용한다.

 Values.yaml 정의 

1. Value Name

Values.yaml 파일에 정의하는 value는 lowCamelCase를 사용한다.

ex) 도커 이미지를 value로 생성할 경우

- dockerImages (O)

- DockerImages (X)

- docker-images (X)

UpperCamelCase의 경우 Helm이 제공하는 내장 변수와 구분하기 위해 권고하지 않는다.

2. Yaml 형태

- Nested

server:
  name: nginx
  port: 80

- Flat

serverName: nginx
serverPort: 80

- deployment.yaml

{{ if .Values.server }}
  {{ default "none" .Values.server.name }}
{{ end }}

위와 같이 CamelCase를 사용해야 하는 경우 하나의 Flat으로 관리하기 보다는 Nested 형태로 관리하는 것을 대체로 선호한다.

다만 Flat으로 사용하면, Check로직을 생략하여 간편하게 작성할 수 있고 가독성이 높다는 장점이 있다.

3. value의 활용

value는 크게 3가지 형태로 사용된다.

- values.yaml 파일

- helm install -f or helm upgrade -f로 사용되는 파일

- helm install or helm upgrade 시 set or set-string 옵션

values.yaml 파일은 helm install 또는 helm upgrade 시 기본으로 참조하는 파일이다. values.yaml 파일에 정의된 value를 Override하여 재정의하고자 할 경우 -f 옵션으로 전체 value를 새로운 파일로 로드하거나, --set 옵션을 통해 하나의 value에 대해 재정의할 수 있다.

이때 재정의를 가정하고 커스터마이징의 유연성을 확보하기 위해 아래와 같은 고려사항을 적용해야 한다.

case 1) 중복 element 사용 방식

servers:
  - name: foo
    port: 80
  - name: bar
    port: 81

case 2) Map 형태의 독립 element 사용 방식

servers:
  foo:
    port: 80
  bar:
    port: 81

위 두가지 예시를 기반으로 value 파일의 커스터마이징 방안을 고려해 보자면, 다음과 같다.

foo가 사용 중인 port를 확인하기 위해서는 다음과 같이 접근할 수 있다.

case 1) --set servers[0].port = 80

case 2) --ser servers.foo.port = 80

case 1으로 접근할 경우의 두가지 요소에서 문제점이 나타난다.

먼저 servers[0]이 foo임을 알 수 있는 방법이 없다. 이는 가독성이 떨어지며, 이후 변경된 정보가 무엇인지 다시한번 values.yaml 파일을 확인한 후 적용해야 한다.

두번째는 servers 내부의 값의 순서가 변경 될 경우 발생하는 side-effect이다. 이로 인해 발생 참조하는 모든 --set 옵션을 함께 변경해야 한다.

이와 같은 문제는 두번째 Map 형태를 적용할 경우 모두 해소된다.

severs.foo.port로 직관적인 값을 지정할 수 있으며, 순서가 변경되어도 영향을 주지 않기 때문이다.

4. 주석

마지막으로 value 파일을 정의할 때, 주석을 달아주는 것이 좋다. 각 value의 의미를 정확하게 파악하기 위해 value 별로 각각 주석을 지정하는 것이 좋으며, 주석이 시작은 value의 name으로 시작하는 것이 명확하다.예를 들자면 servers.foo.port를 설명하기 위해서는 servers.foo.port is ~~ 형태를 권고한다.

 templates 정의 

1. file 정의

templates 디렉토리는 다음과 같이 구성된다.

- templates 디렉토리에 정의되는 yaml 파일은 camel 형태가 아닌 대시(-) 형태로 파일 이름을 정의한다.

ex) my-helm-template-deployment.yaml

- 가독성을 높이기위해 Kubernetes Object 별로 구분하여 정의하는 것이 좋다.

ex) deployment.yaml 하나에 ---로 구분된 다중 object 사용을 권고하지 않으며, deployment.yaml, ingress.yaml, service.yaml, hpa.yaml .... 구분된 yaml 파일을 사용하는 것이 좋다.

- 각 yaml 파일은 default name을 사용하는 것보다, 직관적으로 접근할 수 있도록 해당 service name을 앞에 붙여주는 것이 좋다.

ex) hello-deployment.yaml, hello-svc.yaml, hello-ingress.yaml 등과 같은 형태를 권고한다.

2. templates/*.yaml 파일

- 탭을 사용하지 않으며, 스페이스 2개로 들여쓰기한다.

- 템플릿의 지시문은 중괄호 앞 뒤에 공백을 두어야 한다.

3. 주석

yaml 파일 내 주석은 크게 2가지 형태로 기록할 수 있다.

- Helm Template의 주석 구문

{{- /*
This is a comment.
*/ -}}
type: frobnitz

- yaml 파일 주석 구문

# This is a comment
type: frobnitz

Template의 기능을 설명하기 위해서는 Template 주석으로 표시하여야 가독성 높게 주석을 파악할 수 있다.

다만, Template 내의 주석을 디버깅 중에 확인하기 위해서는 yaml 주석을 사용해야 한다.

yaml 주석을 사용할 경우 helm install --debug 옵션 사용 시 표출되지만, Helm Template의 주석 구문은 표시되지 않는다.

 Chart.yaml 정의 

버전

버전의 경우 명확한 버전을 명시하기 보다는 범위를 표현하는 것이 좋다.

version: ~1.2.3

위와 같이 표현 시 helm version은 1.3.0 > version >= 1.2.3 범위 내를 나타낸다.

 Yaml 파일 정의 

1. 이미지 이름

이미지의 이름과 태그를 별도로 지정할 수 있도록 관리하는 것이 좋다. 자주 변경되는 태그 명을 구분하여 관리한다.

image: "{{ .Values.redisImage }}:{{ .Values.redisTag }}"

2. 이미지 배포 정책 (pullPolicy)

deployment.yaml : imagePullPolicy: {{ .Values.image.pullPolicy }}
valuse.yaml pullPolicy: IfNotPresent

위와 같이 관리 할 수 있으며, Image Pull Policy를 변경하고자 할 경우 values.yaml을 수정한다.

728x90
반응형