티스토리 뷰
지금까지 Helm 사용법 및 Helm Customizing 방법에 대해 알아보았다.
자세한 내용은 아래를 참조한다.
Helm3 기본 명령어 확인 및 Kubernetes deploy
Helm의 사용법에 대해 알아보았으니, 이제 이를 활용한 Best Practice를 알아보고, 효과적으로 적용해 보도록 하자.
본 포스팅은 Helm 공식 사이트인 아래 URL을 참고하였다.
공통 규칙
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을 수정한다.
'③ 클라우드 > ⓚ Kubernetes' 카테고리의 다른 글
Kubernetes CronJob 활용 (1) | 2020.09.27 |
---|---|
Kubernetes Init Container & PodInitializing 트러블슈팅 (2) | 2020.09.26 |
Helm3 Chart 커스터마이징 (0) | 2020.07.23 |
Helm3 기본 명령어 확인 및 Kubernetes deploy (1) | 2020.07.23 |
K8S 네트워크 "Policy Management" (0) | 2020.06.14 |
- Total
- Today
- Yesterday
- openstack tenant
- JEUS6
- Architecture
- openstack token issue
- API Gateway
- node.js
- jeus
- 마이크로서비스
- aws
- webtob
- apache
- aa
- SWA
- MSA
- wildfly
- JEUS7
- nodejs
- git
- JBoss
- k8s
- 오픈스택
- OpenStack
- Docker
- Da
- 쿠버네티스
- TA
- 마이크로서비스 아키텍처
- SA
- 아키텍처
- kubernetes
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |