Helm 차트 만들기 및 설치

완료됨

Helm 차트를 사용하면 모든 Kubernetes 클러스터에 애플리케이션을 간단하게 배포할 수 있습니다. Helm을 사용하여 애플리케이션의 배포 정보를 Helm 차트 템플릿으로 만든 다음, 애플리케이션을 배포하는 데 사용할 수 있습니다.

개발 팀이 AKS 클러스터에 회사의 애완 동물 저장소 웹 사이트를 이미 배포했다고 가정해 보겠습니다. 이 팀은 웹 사이트를 배포하기 위해 다음과 같은 3개 파일을 만듭니다.

  • 클러스터에서 애플리케이션을 설치하고 실행하는 방법을 설명하는 배포 매니페스트
  • 클러스터에 웹 사이트를 노출하는 방법을 설명하는 서비스 매니페스트
  • 클러스터 외부의 트래픽이 웹앱으로 라우팅되는 방법을 설명하는 수신 매니페스트입니다.

이 팀은 소프트웨어 개발 수명 주기에서 이러한 파일을 세 가지 환경에 배포합니다. 3개 파일은 각 환경과 관련된 변수 및 값으로 업데이트됩니다. 각 파일이 하드 코딩되므로, 이러한 파일을 유지 관리할 때 오류가 발생하기 쉽습니다.

Helm에서 어떻게 차트를 처리하나요?

Helm 클라이언트는 차트의 폴더에 들어 있는 모든 사용 가능한 파일을 구문 분석하는 Go 언어 기반 템플릿 엔진을 구현합니다. 템플릿 엔진은 차트의 templates/ 폴더에 들어 있는 템플릿을 Chart.yamlvalues.yaml 파일의 값과 결합하여 Kubernetes 매니페스트 파일을 만듭니다.

A diagram shows a process parsing a Helm template file and values file to create and deploy an application to a Kubernetes cluster using manifest files.

매니페스트 파일을 사용할 수 있게 되면 클라이언트는 생성된 매니페스트 파일에 정의된 애플리케이션을 설치, 업그레이드 및 삭제할 수 있습니다.

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의 이름이 포함됩니다.