프로그래밍/DevOps

[DevOps]Helm을 이용한 Kubernetes 애플리케이션 배포 📦

다다면체 2025. 2. 24. 10:30
728x90
반응형

안녕하세요. Kubernetes를 활용한 애플리케이션 배포에 관심을 가지시는 여러분을 환영합니다. 이번 시간에는 Kubernetes 애플리케이션 배포를 단순화하고 자동화하는 도구인 Helm을 자세히 알아보겠습니다. Helm은 복잡한 Kubernetes 배포 과정을 효율적으로 관리할 수 있도록 돕는 핵심적인 도구입니다.

🎯 학습 목표

이번 포스팅을 통해 독자 여러분은 다음과 같은 목표를 이해하고 실습할 수 있습니다.

  • Helm의 필요성장점을 이해하고 Kubernetes 배포에 Helm을 효과적으로 적용할 수 있습니다.
  • Helm CLI를 사용하여 Kubernetes 애플리케이션을 Chart (패키징)Release (배포) 하는 기본적인 절차를 익힙니다.
  • Helm Chart의 구조 (Chart.yaml, values.yaml, templates 디렉토리)를 상세히 이해하고 Helm 템플릿 문법 (Go templates) 을 활용하여 Chart를 커스터마이징하는 방법을 학습합니다.
  • Helm Chart Repository를 이용하여 Chart를 효율적으로 관리하고 공유하는 방법을 배우고, Public Chart Repository (Artifact Hub) 를 활용하여 Nginx Chart 배포 실습을 진행합니다.
  • Helm Chart 버전 관리업데이트 전략을 이해하고 Helm의 고급 기능 (Hooks, Library Chart, Plugin) 을 개략적으로 살펴봅니다.

반응형

1. Helm 소개: Kubernetes 배포 관리의 효율성을 높이는 도구 (Helm 소개)

Kubernetes는 컨테이너 오케스트레이션 플랫폼으로서 강력하지만, 애플리케이션 배포 시 다양한 YAML 설정 파일을 수동으로 관리해야 하는 어려움이 있습니다. 이는 배포 과정의 복잡성을 증가시키고, 오류 발생 가능성을 높이며, 배포 및 롤백에 많은 시간을 소요하게 합니다.

 

Helm은 이러한 Kubernetes 배포의 복잡성을 해결하기 위해 개발된 도구입니다. Helm을 사용하면 Kubernetes 설정 파일들을 Chart라는 패키지로 묶어 관리하고, 애플리케이션 배포, 업데이트, 롤백 과정을 자동화할 수 있습니다.

Helm의 주요 장점은 다음과 같습니다.

  • 배포 단순화: Kubernetes Manifest 파일을 Chart로 패키징하여 배포 과정을 간소화합니다.
  • 재사용성: Chart를 재사용하여 여러 환경에 동일한 애플리케이션을 일관성 있게 배포할 수 있습니다.
  • 버전 관리: Chart 버전을 관리하여 애플리케이션 변경 이력을 추적하고 특정 버전으로 롤백이 용이합니다.
  • 업데이트 및 롤백 용이성: 애플리케이션 업데이트 및 롤백 과정을 자동화하여 운영 효율성을 높이고 안정적인 시스템 관리를 지원합니다.

Helm은 크게 다음과 같은 구성 요소로 이루어져 있습니다.

  • Helm Client (CLI): 사용자가 Helm 명령어를 실행하여 Chart를 관리하고 배포를 제어하는 인터페이스입니다.
  • Helm Library (v3): Helm v3부터는 Tiller 서버가 제거되었으며, Helm Library가 Kubernetes API 서버와 직접 통신하여 Release를 관리합니다. 보안 및 관리 효율성이 향상되었습니다.
  • Chart: Kubernetes 애플리케이션 배포에 필요한 Manifest 파일 및 설정 파일들을 패키징한 단위입니다.
  • Release: Chart를 Kubernetes 클러스터에 배포하여 실행되는 애플리케이션 인스턴스를 의미합니다. 하나의 Chart로부터 여러 개의 Release를 생성할 수 있습니다.
  • Repository: Chart를 저장하고 관리하는 저장소입니다. Public Repository와 Private Repository를 모두 활용할 수 있습니다.

2. Helm CLI 기본 사용법

Helm 명령어 실습

Helm CLI 설치 후, 기본적인 Helm 명령어를 실습해 보겠습니다. 터미널을 열고 다음 명령들을 순서대로 실행합니다.

  • helm create mychart: mychart라는 이름의 Chart를 생성합니다. Helm Chart 템플릿이 자동으로 생성됩니다.
helm create mychart
  • helm install my-release ./mychart: mychart Chart를 my-release라는 이름으로 Kubernetes 클러스터에 배포합니다.
helm install my-release ./mychart
  • helm list: 현재 배포된 Release 목록을 확인합니다. 배포된 Release 정보를 확인할 수 있습니다.
helm list
  • helm status my-release: my-release Release의 상세 정보를 조회합니다. Release 상태 및 Chart 정보를 확인할 수 있습니다.
helm status my-release
  • helm history my-release: my-release Release의 배포 이력을 확인합니다. 업데이트 및 롤백 이력을 추적할 수 있습니다.
helm history my-release
  • helm upgrade my-release ./mychart: mychart Chart를 최신 버전으로 업데이트합니다. Chart 수정 후 업그레이드 시 변경 사항이 반영됩니다.
helm upgrade my-release ./mychart
  • helm rollback my-release 1: my-release Release를 첫 번째 버전으로 롤백합니다. 배포 문제 발생 시 이전 버전으로 복구할 수 있습니다.
helm rollback my-release 1
  • helm uninstall my-release: my-release Release를 삭제합니다. Kubernetes 클러스터에서 애플리케이션 인스턴스가 제거됩니다.
helm uninstall my-release

3. Helm Chart 구조 상세 설명 (Helm Chart 구조 상세 설명)

Helm Chart는 애플리케이션 배포에 필요한 설정과 Manifest 파일들을 포함하는 패키지입니다. Chart의 주요 구성 요소는 다음과 같습니다.

  • Chart.yaml: Chart 메타데이터를 정의하는 파일입니다. Chart 이름, 버전, 설명, API 버전 등의 기본 정보를 명시합니다.
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
  • values.yaml: Chart의 기본 설정 값을 정의하는 파일입니다. Release 시에 values.yaml 파일을 수정하거나 --set 옵션을 사용하여 Chart 설정을 변경할 수 있습니다.
replicaCount: 1

image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: "stable"

service:
  type: ClusterIP
  port: 80
  • templates 디렉토리: Kubernetes Manifest 템플릿 파일 (.yaml) 을 저장하는 디렉토리입니다. Go templates 문법을 사용하여 values.yaml 파일의 값을 참조하거나 조건문, 반복문 등을 활용하여 동적으로 Manifest 파일을 생성합니다.
    • deployment.yaml, service.yaml, ingress.yaml, configmap.yaml, secret.yaml 등의 Kubernetes 리소스 정의 파일 템플릿이 포함될 수 있습니다.
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-deployment
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
        ports:
        - containerPort: 80
  • charts 디렉토리: Subchart를 관리하는 디렉토리입니다. Chart 의존성 관리에 사용됩니다.

4. Helm 템플릿 문법 (Go templates) 활용 (Helm 템플릿 문법 활용)

Helm Chart의 핵심 기능 중 하나는 템플릿 기능입니다. Go templates 문법을 사용하여 Kubernetes Manifest 파일을 동적으로 생성하고 Chart의 유연성을 높일 수 있습니다.

  • Control Structures: if, else, range, with 등의 조건문 및 반복문을 사용하여 템플릿 로직을 제어합니다.
# templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: {{ .Values.service.port }}
      targetPort: 80
      {{- if .Values.service.nodePort }}
      nodePort: {{ .Values.service.nodePort }}
      {{- end }}
  type: {{ .Values.service.type }}
  • Functions: Values, Release, Files, lookup, include, quote, indent 등 Helm Built-in Functions을 활용하여 템플릿을 확장합니다.
    • Values: values.yaml 파일의 값을 참조합니다. 예: .Values.replicaCount, .Values.image.repository
    • Release: Release 관련 정보를 참조합니다. 예: .Release.Name, .Release.Namespace
    • Files: Chart 내 파일에 접근합니다. 예: {{ .Files.Get "myconfig.ini" }}
    • include: 다른 템플릿 파일을 포함합니다. 예: {{- include "mychart.labels" . }}
  • Pipelines: 템플릿 함수를 연결하여 데이터 처리 흐름을 구성합니다.
{{ .Values.replicaCount | quote }}
{{ .Values.service.port | indent 4 }}
  • values.yaml 값 참조 및 템플릿 변수: values.yaml 파일에 정의된 값을 템플릿 파일에서 {{ .Values.propertyName }} 형태로 참조하고, 템플릿 변수를 사용하여 값 재사용성을 높입니다.
# values.yaml
appName: my-nginx

# templates/deployment.yaml
metadata:
  labels:
    app: {{ .Values.appName }}

5. Helm Chart Repository 활용 (Helm Chart Repository 활용)

Helm Chart Repository는 Chart를 저장하고 공유하는 저장소입니다. Chart Repository를 통해 Chart를 효율적으로 관리하고 재사용할 수 있습니다.

  • Helm Chart Repository 종류:
    • Public Repository (Artifact Hub): 공개 Chart Repository로, 다양한 오픈 소스 Chart를 제공합니다. Artifact Hub 에서 다양한 Chart를 검색하고 활용할 수 있습니다.
    • Private Repository: 조직 내부에서 Chart를 공유하고 관리하기 위한 비공개 Chart Repository입니다. 필요에 따라 구축하거나 클라우드 Container Registry를 활용할 수 있습니다.
  • Artifact Hub 탐색: Artifact Hub에서 "Nginx Ingress Controller Chart"를 검색하여 Chart 정보를 확인합니다. Chart 이름, 버전, 설명, 제공자 정보 등을 살펴볼 수 있습니다.
  • Public Chart Repository 추가: Helm CLI를 사용하여 Public Chart Repository를 추가하고 Chart 목록을 업데이트합니다.
helm repo add nginx-stable https://kubernetes.github.io/ingress-nginx
helm repo list
helm repo update
  • Nginx Chart 배포: nginx-stable/nginx-ingress Chart를 사용하여 Nginx Ingress Controller를 Kubernetes 클러스터에 배포하고 Ingress 동작을 확인합니다.
helm install nginx-ingress nginx-stable/nginx-ingress
kubectl get service nginx-ingress-nginx-controller
kubectl get ingress

6. Helm Chart 버전 관리 및 업데이트 전략 (Helm Chart 버전 관리 및 업데이트 전략)

Helm Chart 버전 관리는 애플리케이션 배포의 안정성과 관리 효율성을 높이는 데 중요합니다.

  • Semantic Versioning 기반 Chart 버전 관리 규칙: Chart 버전은 Semantic Versioning (Major.Minor.Patch) 규칙을 따르는 것이 일반적입니다. 버전 번호를 통해 Chart 변경 사항의 성격을 명확히 나타낼 수 있습니다.
  • Helm Upgrade 전략:
    • RollingUpdate: 기존 Pod를 점진적으로 새 Pod로 교체하며 업데이트하는 방식으로, 무중단 업데이트에 적합합니다.
    • Recreate: 기존 Pod를 모두 삭제하고 새 Pod를 생성하여 업데이트하는 방식입니다. 업데이트의 안정성을 높일 수 있지만, 서비스 중단이 발생할 수 있습니다.
  • 롤백 정책: Helm은 롤백 기능을 제공하여 배포 실패 시 이전 Chart 버전으로 빠르게 복구할 수 있도록 지원합니다. helm rollback 명령어를 사용합니다.

추가 학습

  • Helm Chart 개발 Best Practices 및 보안 고려 사항: 효율적이고 안전한 Chart 개발을 위한 Best Practices를 학습하고 Chart 보안 취약점에 대한 고려 사항을 숙지하는 것이 중요합니다.
  • Helm Plugin 개발 및 기능 확장: Helm Plugin 개발을 통해 Helm 기능을 확장하고 사용자 정의 워크플로우를 구축할 수 있습니다.
  • OCI Registry 기반 Helm Chart 관리 및 배포: OCI Registry를 이용한 Helm Chart 관리 및 배포 방식을 학습하여 최신 Chart 관리 트렌드를 따라갈 수 있습니다.
  • Kustomize 와 Helm 비교 분석 및 Configuration Management 도구 선택: Kustomize와 Helm의 차이점을 이해하고 프로젝트 요구사항에 맞는 Configuration Management 도구를 선택하는 능력을 키울 수 있습니다.

결론

Helm을 활용하여 Kubernetes 애플리케이션 배포를 패키징하고 자동화하는 기본적인 방법을 실습하였습니다. Helm은 Kubernetes 환경에서 애플리케이션 배포를 효율적으로 관리하고 자동화하는 데 필수적인 도구입니다. 이번 포스팅을 통해 Helm의 기본 사용법을 익히셨으므로, 실제 Kubernetes 환경에서 Helm을 적극적으로 활용해 보시기 바랍니다.

 

728x90
반응형