Helm 차트 만들기 및 설치
Helm 차트를 사용하면 모든 Kubernetes 클러스터에 애플리케이션을 간단하게 배포할 수 있습니다. Helm을 사용하여 애플리케이션의 배포 정보를 Helm 차트 템플릿으로 만든 다음, 애플리케이션을 배포하는 데 사용할 수 있습니다.
개발 팀이 AKS 클러스터에 회사의 애완 동물 저장소 웹 사이트를 이미 배포했다고 가정해 보겠습니다. 이 팀은 웹 사이트를 배포하기 위해 다음과 같은 3개 파일을 만듭니다.
- 클러스터에서 애플리케이션을 설치하고 실행하는 방법을 설명하는 배포 매니페스트
- 클러스터에 웹 사이트를 노출하는 방법을 설명하는 서비스 매니페스트 및
- 클러스터 외부의 트래픽이 웹앱으로 라우팅되는 방법을 설명하는 수신 매니페스트입니다.
이 팀은 소프트웨어 개발 수명 주기에서 이러한 파일을 세 가지 환경에 배포합니다. 3개 파일은 각 환경과 관련된 변수 및 값으로 업데이트됩니다. 각 파일이 하드 코딩되므로, 이러한 파일을 유지 관리할 때 오류가 발생하기 쉽습니다.
Helm에서 어떻게 차트를 처리하나요?
Helm 클라이언트는 차트의 폴더에 들어 있는 모든 사용 가능한 파일을 구문 분석하는 Go 언어 기반 템플릿 엔진을 구현합니다. 템플릿 엔진은 차트의 templates/
폴더에 들어 있는 템플릿을 Chart.yaml
및 values.yaml
파일의 값과 결합하여 Kubernetes 매니페스트 파일을 만듭니다.
매니페스트 파일을 사용할 수 있게 되면 클라이언트는 생성된 매니페스트 파일에 정의된 애플리케이션을 설치, 업그레이드 및 삭제할 수 있습니다.
Chart.yaml
파일을 정의하는 방법
Chart.yaml
파일은 Helm 차트 정의에 필요한 파일 중 하나이며 차트에 대한 정보를 제공합니다. 파일의 내용은 세 개의 필수 필드와 다양한 선택적 필드로 구성됩니다.
세 가지 필수 필드는 다음과 같습니다.
apiVersion
: 사용할 차트 API 버전입니다. Helm 3을v2
사용하는 차트의 버전으로 설정합니다.name
: 차트의 이름입니다.version
: 의미 체계 버전 관리 2.0.0을 사용하고 버전 번호 표기법을 따르는 차트의MAJOR.MINOR.PATCH
버전 번호입니다.
다음 예제에서는 기본 Chart.yaml
파일의 내용을 보여 줍니다.
apiVersion: v2
name: webapp
description: A Helm chart for Kubernetes
# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore, cannot be deployed.
type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
version: 0.1.0
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application.
appVersion: 1.0.0
예제 파일에서 필드를 사용합니다 type
. 애플리케이션 또는 라이브러리를 설치하는 차트를 만들 수 있습니다. 기본 차트 종류는 application
이며 library
로 설정하여 차트에서 라이브러리를 설치하도록 지정할 수 있습니다.
차트 배포 프로세스를 조정하는 데 많은 선택적 필드를 사용할 수 있습니다. 예를 들어 이 필드를 사용하여 dependencies
데이터베이스에 의존하는 웹앱과 같이 차트에 대한 추가 요구 사항을 지정할 수 있습니다.
참고 항목
모든 선택적 필드의 자세한 범위는 이 모듈의 범위를 벗어납니다. 대신 이 모듈의 요약 섹션에 Helm 설명서의 링크가 제공되어 있습니다.
차트 템플릿을 정의하는 방법
Helm 차트 템플릿은 다양한 배포 유형 매니페스트 파일을 설명하는 파일입니다. 차트 템플릿은 Go 템플릿 언어로 작성되며 Kubernetes 개체 매니페스트 파일 만들기를 자동화하는 템플릿 함수를 제공합니다.
템플릿 파일은 차트의 폴더에 templates/
저장됩니다. 템플릿 엔진은 이러한 파일을 처리하여 최종 개체 매니페스트를 만듭니다.
예를 들어 개발 팀이 다음 배포 매니페스트 파일을 사용하여 솔루션의 애완 동물 저장소 전면 구성 요소를 배포한다고 가정해 보겠습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: store-front
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: store-front
template:
metadata:
labels:
app: store-front
spec:
nodeSelector:
"kubernetes.io/os": linux
containers:
- name: store-front
image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
ports:
- containerPort: 8080
name: store-front
env:
- name: VUE_APP_ORDER_SERVICE_URL
value: "http://order-service:3000/"
- name: VUE_APP_PRODUCT_SERVICE_URL
value: "http://product-service:3002/"
resources:
requests:
cpu: 1m
memory: 200Mi
limits:
cpu: 1000m
memory: 512Mi
startupProbe:
httpGet:
path: /health
port: 8080
failureThreshold: 3
initialDelaySeconds: 5
periodSeconds: 5
readinessProbe:
httpGet:
path: /health
port: 8080
failureThreshold: 3
initialDelaySeconds: 3
periodSeconds: 3
livenessProbe:
httpGet:
path: /health
port: 8080
failureThreshold: 5
initialDelaySeconds: 3
periodSeconds: 3
---
apiVersion: v1
kind: Service
metadata:
name: store-front
spec:
type: {{ .Values.storeFront.serviceType }}
ports:
- port: 80
targetPort: 8080
selector:
app: store-front
컨테이너 이미지의 위치가 구문을 사용하여 {{.Values.<property>}}
하드 코딩되는 방법을 확인합니다. 이 구문을 사용하여 각 사용자 지정 값의 자리 표시자를 만들 수 있습니다.
수동으로 Helm 차트를 만드는 프로세스는 지루한 작업입니다. helm create
명령을 사용하면 간단하게 새 Helm 차트를 만들 수 있습니다. 그런 다음, 자동 생성된 파일을 애플리케이션의 요구 사항에 맞게 사용자 지정합니다.
values.yaml
파일을 정의하는 방법
차트 값을 사용하여 Helm 차트의 구성을 사용자 지정합니다. 차트 값은 미리 정의될 수도 있고 차트를 배포할 때 사용자가 입력할 수 있습니다.
미리 정의된 값은 Helm 차트의 컨텍스트에서 미리 정의되며 사용자가 변경할 수 없는 대/소문자를 구분하는 값입니다. 예를 들어 Release.Name
을 사용하여 릴리스 이름 또는 Release.IsInstall
을 참조하여 현재 작업이 설치 작업인지 확인할 수 있습니다.
미리 정의된 값을 사용하여 .의 Chart.yaml
내용에서 데이터를 추출할 수도 있습니다. 예를 들어 차트의 버전을 확인하려면 Chart.Version
을 참조합니다. 잘 알려진 필드만 참조할 수 있다는 점에 주의하세요. 미리 정의된 값은 여러분이 만드는 템플릿에서 사용되는 상수라고 생각하면 됩니다.
템플릿 파일에 값 이름을 포함하는 구문에는 값 이름을 이중 중괄호(예 {{.Release.Name}}
: 이중 중괄호)로 묶는 작업이 포함됩니다. 값 이름 앞에 마침표를 사용합니다. 이러한 방식으로 마침표를 사용하면 마침표가 조회 연산자로 작동하여 변수의 현재 범위를 나타냅니다.
예를 들어 다음 YAML 코드 조각에는 값 파일에 정의된 사전이 포함되어 있습니다.
object:
key: value
템플릿의 값에 액세스하려면 다음 구문을 사용하면 됩니다.
{{ .Values.object.key }}
제공된 값을 사용하여 차트 템플릿의 임의 값을 처리할 수 있습니다. values.yaml
파일은 이러한 값을 정의합니다.
이 예제에서 개발 팀은 다음과 같은 구성 가능한 값을 허용합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: store-front
spec:
replicas: {{ .Values.replicaCount }}
...
containers:
- name: store-front
image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
ports:
...
---
apiVersion: v1
kind: Service
metadata:
name: store-front
spec:
type: {{ .Values.storeFront.serviceType }}
...
values.yaml
파일의 예는 다음과 같습니다.
...
replicaCount: 1
...
storeFront:
image:
repository: "ghcr.io/azure-samples/aks-store-demo/store-front"
tag: "latest"
serviceType: LoadBalancer
...
템플릿 엔진에서 값을 적용한 후 최종 결과는 다음 예제와 비슷합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: store-front
spec:
replicas: 1
...
containers:
- name: store-front
image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
ports:
---
apiVersion: v1
kind: Service
metadata:
name: store-front
spec:
type: LoadBalancer
...
Helm 리포지토리를 사용하는 방법
Helm 리포지토리는 Helm 차트에 정보를 저장하는 전용 HTTP 서버입니다. helm repo add
명령을 사용하여 리포지토리의 차트를 설치하도록 Helm 클라이언트로 Helm 리포지토리를 구성합니다.
예를 들어 다음 명령을 실행하여 로컬 Helm 클라이언트에 Azure Marketplace Helm 리포지토리를 추가할 수 있습니다.
helm repo add azure-marketplace https://marketplace.azurecr.io/helm/v1/repo
리포지토리에서 사용할 수 있는 차트에 대한 정보는 클라이언트 호스트에 캐시됩니다. 명령을 사용하여 helm repo update
리포지토리의 최신 정보를 가져오려면 캐시를 주기적으로 업데이트해야 합니다.
이 helm search repo
명령을 사용하면 로컬에 추가된 모든 Helm 리포지토리에서 차트를 검색할 수 있습니다. helm search repo
명령을 단독으로 실행하여 추가된 각 리포지토리에 대해 알려진 모든 Helm 차트의 목록을 반환할 수 있습니다. 결과는 다음 예제 출력과 같이 차트에서 배포한 차트의 이름, 버전 및 앱 버전을 나열합니다.
NAME CHART VERSION APP VERSION DESCRIPTION
azure-marketplace/airflow 11.0.8 2.1.4 Apache Airflow is a platform to programmaticall...
azure-marketplace/apache 8.8.3 2.4.50 Chart for Apache HTTP Server
azure-marketplace/aspnet-core 1.3.18 3.1.19 ASP.NET Core is an open-source framework create...
azure-marketplace/bitnami-common 0.0.7 0.0.7 Chart with custom tempaltes used in Bitnami cha...
azure-marketplace/cassandra 8.0.5 4.0.1 Apache Cassandra is a free and open-source dist...
helm search repo
명령에 검색어를 추가하여 특정 차트를 검색할 수 있습니다. 예를 들어 ASP.NET 기반 차트를 검색하는 경우 다음 명령을 사용할 수 있습니다.
helm search repo aspnet
이 예제에서는 다음 예제 출력과 같이 로컬 클라이언트에 등록된 두 개의 리포지토리가 있고 각 리포지토리의 결과를 반환합니다.
NAME CHART VERSION APP VERSION DESCRIPTION
azure-marketplace/aspnet-core 1.3.18 3.1.19 ASP.NET Core is an open-source framework create...
bitnami/aspnet-core 1.3.18 3.1.19 ASP.NET Core is an open-source framework create...
Helm 차트를 테스트하는 방법
Helm은 템플릿 엔진이 차트에서 만드는 매니페스트 파일을 생성하는 옵션을 제공합니다. 이 기능을 사용하면 두 개의 추가 매개 변수 --dry-run
를 결합하여 릴리스 전에 차트를 테스트할 수 있습니다 debug
. 매개 변수는 --dry-run
설치가 시뮬레이트되고 매개 변수는 --debug
자세한 출력을 사용하도록 설정합니다.
helm install --debug --dry-run my-release ./chart-name
이 명령은 사용된 값과 생성된 모든 파일에 대한 정보를 나열합니다. 생성된 모든 출력을 보려면 스크롤해야 할 수도 있습니다.
Helm 차트를 설치하는 방법
차트를 설치하려면 helm install
명령을 사용합니다. 다음 위치 중 하나에서 Helm 차트를 설치할 수 있습니다.
- 차트 폴더
- 패키지된
.tgz
tar 보관 차트 - Helm 리포지토리
그러나 필수 매개 변수는 차트 위치에 따라 달라집니다. 모든 경우에 install
이 명령에는 설치하려는 차트의 이름과 설치에서 만드는 릴리스의 이름이 필요합니다.
로컬 차트는 파일의 압축을 푼 차트 폴더 또는 압축된 .tgz
tar 보관 차트를 사용하여 설치할 수 있습니다. 차트를 설치하기 위해 명령은 차트 helm
의 위치에 대한 로컬 파일 시스템을 참조합니다. 다음은 패키지되지 않은 차트의 릴리스를 배포하는 설치 명령의 예입니다.
helm install my-release ./chart-name
앞의 예에서 my-release
매개 변수는 릴리스 이름이고, ./chart-name
매개 변수는 압축을 푼 차트 패키지의 이름입니다.
압축된 차트는 압축된 차트 파일 이름을 참조하여 설치됩니다. 다음 예제에서는 현재 tar 보관 파일로 압축된 동일한 애플리케이션의 구문을 보여줍니다.
helm install my-release ./chart-name.tgz
Helm 리포지토리의 차트를 설치하는 경우 차트의 이름으로 차트 참조를 사용합니다. 차트 참조에는 다음 예제와 같이 리포지토리 이름과 차트 이름이라는 두 개의 매개 변수가 포함됩니다.
helm install my-release repository-name/chart-name
이 예제 repository-name/chart-name
에서 매개 변수에는 리포지토리 repository-name
의 참조와 차트 chart-name
의 이름이 포함됩니다.