헬름 + 쿠버네티스 가이드북은 Bharath Thippireddy의 Helm Kubernetes Packaging Manager for Developers and DevOps을 보고 작성되었습니다.
가이드북의 전체 목차 및 인덱싱은 헬름 + 쿠버네티스 가이드북 문서를 참고해주세요.
개요
지난 시간들을 거쳐서 저희는 아래 순서로 학습을 진행했습니다.
이 내용들을 기반으로 여러 의존성(Dependency) 간의 종속성이 복잡하게 얽혀있는 헬름 차트(Helm Chart)를 만들고 관리하기 위한 지식을 습득합니다.
종속성(dependency)
헬름 Charts.yaml 파일 안에 depdency를 추가하고 아래 명령어를 실행하는 것으로 종속성(dependency) 항목을 업데이트 할 수 있습니다.
helm dependency update <CHART_NAME>
예제 Charts.yaml 파일 및 프리뷰는 다음과 같습니다.
코드
dependencies: - name: mysql version: "10.2.2" repository: "http://charts.bitnami.com/bitnami"
해당 차트를 설치하여 릴리즈를 생성해보겠습니다.
helm install myfirstapp 1-firstdependency
이후 아래 pods, deployments, services를 확인해보세요.
kubectl get pods
kubectl get deployments
kubectl get services
버전 범위(version range)
헬름 종속성을 설치할 때, 버전을 범위로 명시하는 방법에 대해서 언급합니다.
사용 가능한 연산자는 다음과 같고 예제 코드에서 확인해보세요.
연산자 | 정의 | 예시 |
---|---|---|
= | 같은 버전 | = 10.0.22 |
!= | 해당 버전이 아닌 버전 | != 10.0.22 |
> | 더 큰 버전 | > 10.0.22 |
< | 더 작은 버전 | < 10.0.22 |
>= | 더 크거나 같은 버전 | >= 10.0.22 |
<= | 더 작거나 같은 버전 | <= 10.0.22 |
and | 그리고 | >= 8.0.0 and <= 10.0.0 |
| | 또는 | >= 10.0.0 | >= 8.0.0 |
^ | 명시된 버전의 다음 메이저 버전 아래까지 사용 가능 | ^1.3.4
^2.x
^0
^0.2.4
^1.3.x
|
~ | 명시된 버전의 다음 마이너 버전 아래까지 사용 가능 | ~ 1.3.4
~ 2
~ 2.3
|
종속성 저장소(dependency repository)
지금까지 예제에서는 아래와 같이 url형태로 된 저장소 주소를 사용했습니다.
하지만 @<로컬에 추가된 레포지토리 이름>을 통해서 약칭으로 사용할 수도 있습니다.
@bitnami
이 이름은 helm repo list를 통해서 확인 가능한 레포지토리 이름입니다.
~>helm repo list
NAME URL
bitnami https://charts.bitnami.com/bitnami
장점 보다 명확한 단점이 있기 때문에 권장하지 않습니다.
장점 : 간결한 헬름 차트 이름
단점 : 헬름 저장소가 등록되지 않으면 에러를 발생시킴
조건부 종속성(conditional dependency)
특정한 목적에 따라서 종속성을 조건부에 따라서 실행하고 싶다면, 아래와 샘플을 참고하세요.
~/values.yaml 선언
~/Chart.yaml 선언
코드
dependencies: - name: mysql version: "~10" repository: "http://charts.bitnami.com/bitnami" condition: mysql.enabled
조건부 종속성(conditional dependency) - 2
특정한 목적에 따라서 종속성을 조건부에 따라서 실행하고 싶다면, 아래와 샘플을 참고하세요.
tags 옵션을 활용하는 방식입니다.
~/values.yaml 선언
~/Chart.yaml 선언
코드
dependencies: - name: mysql version: "~10" repository: "http://charts.bitnami.com/bitnami" tags: - enabled - name: apache version: ">= 8" repository: "http://charts.bitnami.com/bitnami" tags: - enabled
종속성 변수 전달(Pass Values into Dependency)
아래와 같이 종속성 차트 내부에서 사용하는 변수를 직접 전달할 수 있습니다.
예를 들어 bitnami/mysql 이라는 차트가 Service:NodePort로 노출되는 포트를 30788로 고정하고 싶다고 생각하면 아래와 같이 할 수 있을 것입니다.
~/values.yaml
코드
tags: enabled: true mysql: auth: rootPassword: test1234 primary: service: type: NodePort nodePort: 30788
~/Chart.yaml
코드
dependencies: - name: mysql version: "~10" repository: "http://charts.bitnami.com/bitnami" tags: - enabled - name: apache version: ">= 8" repository: "http://charts.bitnami.com/bitnami" tags: - enabled
위 파일을 실행한 후 아래 명령어로 Service Node Port를 확인하세요.
kubectl get services
# 혹은
kubectl get svc
Export 사용해서 자식 변수 조회하기(Read Values from Child Charts, using export)
부모 차트에서 자식 차트의 변수 가져오는 법
Any Root Files
export: service: port: 8080
Chart.yaml
appVersion: "1.16.0" dependencies: - name: mysql version: "8.8.6' repositoriy: "https://charts.bitnami.com/bitnami" tags: - enabled import-values: - service
Use
{{ .Values.service.port }}
Export 없이 자식 변수 조회하기(Read Values from Child Charts, without export)
Any Root Files
export: service: port: 8080
Chart.yaml
appVersion: "1.16.0" dependencies: - name: mysql version: "8.8.6' repositoriy: "https://charts.bitnami.com/bitnami" tags: - enabled import-values: - child: primary.service parent: mysqlService
Use
{{ .Values.mysqlService.port }}
헬름 훅스(Helm Hooks)
헬름 릴리즈 과정에서 특별한 행동을 하고 싶다면 헬름 훅스(Helm Hooks)를 사용할 수 있습니다.
예를 들어 다음과 같은 작업들이 있을 수 있겠네요.
데이터베이스에 데이터를 저장하기
데이터베이스를 백업하기
아래 hookPod.yaml 예제 파일을 살펴봅시다.
kind : 어떤 종류의 리소스도 hooks를 만들 수 있다.
annotation: 이 훅파일이 언제 실행될지 연동
helm.sh/hook: <HOOKS_NAME>,<HOOKS_NAME>, …
helm.sh/hook-delete-policy: <HOOK-DELETE-POLICY>,<HOOK-DELETE-POLICY>, … → 언제 훅스 리소스가 삭제될 것 인지…
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "firstchart.fullname" . }}-pre-install"
annotations:
"helm.sh/hook": pre-install
"helm.sh/hook-weight": "1"
"helm.sh/hook-delete-policy": hook-succeed
spec:
containers:
- name: pre-install
image: busybox
imagePullPolicy: IfNotPresent
command: ["sh", "-c", "echo Pod is Running"]
restartPolicy: OnFailure
아래와 같은 훅스와 훅 삭제 정책이 존재합니다.
Hook Name | Description |
---|---|
pre-install | 차트가 설치되기 전에 실행 |
post-install | 차트가 설치된 후에 실행 |
pre-delete | 차트가 삭제되기 전 실행 |
post-delete | 차트가 삭제된 후에 실행 |
pre-upgrade | 차트가 업그레이드 되기 전에 실행 |
post-upgrade | 차트가 업그레이드 된 후에 실행 |
pre-rollback | 차트가 롤백되기 전에 실행 |
post-rollback | 차트가 롤백된 후에 실행 |
test | 차트가 테스트 실행을 정의 |
Hook Delete Policy Name | Description |
---|---|
before-hook-creation | 후크 리소스 생성 되기 전에 실행 |
hook-succeeded | 후크 리소스 성공한 후에 실행 |
hook-failed | 후크 리소스 실패한 후에 실행 |
헬름 테스트(Helm Test)
헬름 테스트와 헬름 훅스를 동시에 사용하여 어떤 작업을 진행할 수 있습니다.
테스트를 하고 싶은 친구는 반드시 릴리즈 되어 있어야 합니다.
Command
helm test <RELEASE_NAME>
Service
apiVersion: v1 kind: Service metadata: name: {{ include "firstchart.fullname" . }} labels: {{ - include "firstchart.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http selector: {{ - include "firstchart.selectorLabels" . | nindent 4 }}
Test Hooks
apiVersion: v1 kind: Service metadata: name: "{{ includ "firstchart.fullname" . }}-test-connection" label: {{ - include "firstchart.labels" . | nindent 4 }} annotations: "helm.sh/hook": test spec: containers: - name: wget image: busybox command: ['wget'] args: [ '{{include "firstchart.fullname" . }}:{ .Values.service.port }}' ] restartPolicy: Never
실습
values.yaml
tomcat: service: type: NodePort nodePort: 30007
Chart.yaml
dependencies: - name: tomcat version: "11" repository: "http://charts.bitnami.com/bitnami" tags: - enabled
values.yaml
tomcat: service: type: NodePort nodePorts: http: 30007
Ran this commands
helm dependency update tomcatchart/ helm install tomcatapp tomcatchart/ helm ls