Tech story/Cloud

What is DevOps? - Helm Chart

kt cloud 테크블로그 2024. 11. 13. 16:30

[kt cloud DevOps팀 이효원 님]

 

What is DevOps? - Helm Chart

 

1. 배포란 무엇인가?

배포는 개발된 애플리케이션이나 서비스가 운영 환경에서 사용자에게 제공될 수 있도록 준비하는 과정입니다.

개발 환경에서 정상적으로 동작하던 애플리케이션을 실제 운영 환경에서 사용할 수 있도록 이동하고,

이를 유지하며 모니터링하는 과정 전반을 포함합니다.

이를 통해 서비스가 적시에 사용 가능하고 예기치 않은 오류 없이 사용자에게 제공되도록 보장하는 것이 목표입니다.

 

배포는 DevOps의 중요한 단계 중 하나로, 지속적인 통합과 배포(CI/CD) 파이프라인에서 중요한 역할을 합니다.

배포 방식은 운영 환경의 안정성과 서비스의 연속성을 유지하기 위해 매우 중요합니다.

 

 

2. 주요 배포 방식 소개

배포 방식은 운영 환경과 요구사항에 따라 다양하게 선택될 수 있습니다. 아래는 일반적으로 많이 사용되는 세 가지 배포 방식과 Helm Chart를 이용한 Kubernetes 배포 방식을 설명합니다.

 

블루 - 그린 배포 (Blue-Green Deployment)

블루-그린 배포는 기존 버전(블루)과 새로운 버전(그린)을 동시에 운영 환경에 배포하는 방식입니다.

트래픽을 새로운 버전으로 전환하기 전에 두 환경에서 모두 서비스를 준비해두고,

전환이 완료되면 기존 버전을 삭제합니다.

 

 

 

블루-그린 배포의 장점은 다음과 같습니다:

  • 다운타임이 거의 없어 사용자의 서비스 경험을 보장
  • 문제가 발생했을 때 즉각적으로 기존 버전으로 롤백 가능

 

롤링 배포 (Rolling Deployment)

롤링 배포는 점진적으로 새로운 버전을 기존 환경에 배포하는 방식입니다.

예를 들어 Kubernetes에서 몇 개의 파드를 업데이트하고, 안정성을 확인한 후 나머지 파드를 순차적으로 업데이트합니다.

 

이 방식의 장점은 다음과 같습니다:

  • 전체 서비스의 다운타임을 줄이고 점진적으로 변화 도입 가능
  • 안정성을 유지하며 업데이트할 수 있어, 트래픽이 지속적으로 처리됨

 

카나리 배포 (Canary Deployment)

카나리 배포는 새로운 버전의 일부 트래픽만을 임의로 전환하여 위험을 최소화하는 방식입니다.

새로운 기능이나 변경사항을 소규모 사용자에게 먼저 제공하고,

안정성이 확인되면 점진적으로 모든 사용자에게 확장합니다.

 

이 방식의 장점은 다음과 같습니다.

  • 변경 사항의 안정성 확인이 가능하여 리스크를 낮춤
  • 사용자 피드백을 즉각적으로 수집하여 빠르게 수정 가능

 

Helm Chart를 이용한 Kubernetes 배포

Helm Chart는 Kubernetes 애플리케이션의 패키지 관리 도구로,

Kubernetes 애플리케이션을 쉽게 정의하고 배포할 수 있도록 합니다.

 

 

 

복잡한 YAML 파일을 단순화하여 배포를 자동화하고 버전 관리와 롤백 기능을 제공합니다.

이를 통해 Kubernetes 애플리케이션을 효율적으로 배포할 수 있습니다.

 

 

3. Helm Chart

Helm은 Kubernetes에서 애플리케이션을 쉽게 관리하고 배포할 수 있도록 돕는 패키지 관리자입니다.

Helm의 기본 단위인 Chart는 Kubernetes 애플리케이션의 구성과 배포에 필요한 모든 리소스를 포함하는 패키지를 뜻합니다.

각 Chart에는 Pod, Service, ConfigMap 등 애플리케이션의 여러 리소스를 정의한 YAML 템플릿이 포함되어 있어 설정 파일을 통해 다양한 환경에 맞게 애플리케이션을 배포할 수 있습니다.

 

 

Helm Chart는 다음과 같은 요소로 구성됩니다.

  • Chart.yaml
    : Chart의 메타데이터를 정의하는 파일입니다.
    이름, 버전, 설명 등을 포함합니다.
  • values.yaml: 사용자 정의 설정 파일로, 배포 시에 참조되는 기본 값을 정의합니다.
  • templates/
    : Kubernetes 리소스 정의 템플릿을 저장하는 Directory로,
    여기서 정의된 템플릿 파일은 values.yaml에서 제공된 값을 사용하여 구성됩니다.
  • charts/: 다른 Chart를 의존성으로 포함할 수 있도록 하는 Directory입니다.

Helm에서는 Chart를 관리하고 배포하는 다양한 명령어를 제공합니다.

이 중에서 자주 사용되는 명령어로는 helm create, helm package, helm push 등이 있습니다.

 

  1. helm create
    : helm create 명령어는 새로운 Helm Chart의 기본 구조를 자동으로 생성합니다.
  2. 이 명령어를 사용하면 Chart.yaml, values.yaml, 그리고 templates/ Directory 구조가 포함된 초기 Chart 파일들이 만들어집니다.
  3. helm package
    : helm package 명령어는 작성한 Helm Chart를 패키지로 전환하여 .tgz 파일로 생성합니다.
  4. 패키징된 Helm Chart는 로컬이나 원격 Repository에 업로드하여 쉽게 배포할 수 있습니다.
  5. helm push
    : helm push 명령어는 패키지화된 Chart를 Helm Repository에 업로드하는 명령어입니다.
    다른 개발자나 운영팀이 해당 Chart를 사용해 애플리케이션을 배포할 수 있도록 Chart를 공유할 수 있습니다.
  6. helm install: Chart를 Kubernetes 클러스터에 설치하는 명령어입니다.
  7. helm upgrade: 이미 설치된 Chart를 새로운 버전으로 업데이트합니다.
  8. helm rollback: 문제가 발생했을 때 특정 버전으로 롤백할 수 있습니다.

 

4. 예제: Helm Chart 생성부터 배포까지

helm 명령어를 사용하여 Helm Chart를 생성하고 배포하는 간단한 예제를 설명 드리겠습니다.

 

helm create 명령어로 Helm Chart 생성하기

새로운 Helm Chart를 생성하기 위해 다음과 같이 helm create 명령어를 실행합니다.

 

helm create my-sample-app

 

이 명령어를 실행하면 my-sample-app이라는 Directory가 생성되고

Directory 내 Helm 기본 템플릿 구조를 활용한 Chart 파일들이 추가됩니다.

Directory 구조는 다음과 같습니다!

my-sample-app/
├── charts/
├── Chart.yaml
├── templates/
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── service.yaml
│   └── serviceaccount.yaml
└── values.yaml

 

Chart.yaml 파일

Chart.yaml 파일에는 Helm Chart의 메타 데이터를 정의합니다.

my-sample-app/Chart.yaml 기본 템플릿에서 용도에 맞게 이름, 설명, 버전, 애플리케이션 등 변수를 수정하여 반영할 수 있습니다.

apiVersion: v2
name: my-sample-app
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: 1.16.0

 

values.yaml 파일

values.yaml 파일은 Chart의 설정 파일입니다.

values.yaml 파일에서 설정한 값은 templates/ Directory 내 템플릿 파일에서 참조됩니다.

예를 들어, 다음과 같이 애플리케이션 이미지와 Replica 수를 설정할 수 있습니다.

replicaCount: 2

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

service:
  type: ClusterIP
  port: 80

해당 코드는 Replica 수를 2로 설정하고, nginx:1.16.0 컨테이너 이미지로 애플리케이션을 실행하는 예제입니다.

 

templates/deployment.yaml 파일

templates/deployment.yaml 파일은 Kubernetes의 Deployment 리소스를 정의하는 템플릿입니다.

기본 deployment.yaml 템플릿은 다음과 같이 정의되어 있습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "my-sample-app.fullname" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ include "my-sample-app.name" . }}
  template:
    metadata:
      labels:
        app: {{ include "my-sample-app.name" . }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: 80

 

위 템플릿 파일은 values.yaml에서 정의한 값을 참조하여 replicaCountimage.repository, image.tag를 설정하는 내용입니다.

 

Chart 작성이 완료되면 helm package 명령어를 사용하여 Chart를 패키지화(Packaging) 할 수 있습니다.

helm package my-sample-app

 

이 명령어를 실행하면 my-sample-app-0.1.0.tgz와 같은 이름의 패키지 파일이 생성됩니다.

이 파일은 Chart를 배포 가능한 형태로 압축한 것으로, 로컬이나 원격 Helm Repository에 업로드할 수 있습니다.

패키지화된 Chart를 배포하기 위해 Helm Repository에 Push 합니다.

Helm Repository는 Chart의 배포 및 관리를 위한 공간으로, 로컬이나 원격에 저장소를 설정할 수 있습니다.

먼저, helm push 명령어에 필요한 플러그인을 선택하여 설치합니다.

helm plugin install https://github.com/chartmuseum/helm-push.git

 

플러그인 설치 후, Chart Repository를 설정합니다.

Helm Chart의 경로와 Helm Chart의 이름을 매핑함으로써 이후 Helm Chart를 해당 Repository에 Push할 수 있도록 설정합니다.

helm repo add my-repo https://harbor-cicd.ktcloud.com

 

helm push 명령어를 사용하여 패키지 파일을 Repository에 Push 합니다.

helm push my-sample-app-0.1.0.tgz my-repo

 

my-sample-app-0.1.0.tgz 파일을 my-repo에 업로드 하는 예제입니다.

Helm Repository에 업로드를 완료하면 동료들이 Chart를 다운로드/설치하여 사용할 수 있습니다.

Chart를 Repository에 업로드하면 helm install 명령어로 Kubernetes 클러스터에 Chart를 설치할 수 있습니다.

helm install my-sample-app my-repo/my-sample-app --namespace my-namespace

위 명령어는 my-sample-app이라는 이름으로 Helm Chart를 설치합니다.

 

values.yaml 파일에 사용자 정의를 추가함으로써 상세 설정 값을 적용할 수도 있습니다.

helm install my-sample-app my-repo/my-sample-app --namespace my-namespace --set replicaCount=3

위와 같이 --set 옵션을 사용하여 replicaCount 값을 3으로 설정하면, Helm Chart가 정의한 기본 값 대신 3개의 Replica가 생성됩니다.

 

 

 

마무리

이 포스팅에서는 DevOps의 필수 개념인 “배포“와 이의 주요 방식 중 하나인 Helm Chart를 소개했습니다.

Helm을 사용할 경우 간편하게 Kubernetes 애플리케이션을 배포할 수 있을 뿐만 아니라,

복잡한 애플리케이션 환경을 Helm Chart로 관리함으로써 자산 운영 효율성을 높일 수 있다는 장점이 있습니다.

kt cloud의 다양한 서비스들도 Helm Chart를 사용하여 배포를 수행하고 있고

Github과 Harbor, ArgoCD를 연동함으로써 자동화된 Helm Chart 업데이트 및 이에 따른 애플리케이션 버전 업을 지원합니다 :)

 

 

참고/출처