[kubernetes] 애플리케이션 동적 배포(kustomize, helm)

vinca·2023년 12월 19일
0

☸️ kubernetes

목록 보기
34/35

Introduction

애플리케이션을 한번에 배포할 수 있는 방법인 kustomizehelm에 대해서 알아보자.

kustomizehelm은 둘 다 복잡성이 높은(여러 파드 및 서비스가 포함된) 애플리케이션을 한번에 배포할 수 있도록 하는 도구(패키지 매니저)이다.

두 도구 모두 Kubernetes 매니페스트 파일의 생성 및 관리를 자동화할 수 있고, 파라미터화를 통해서 자신만의 템플릿(kustomize는 오버레이가 적용된 Manifest, Helm은 values를 통해 적용된 헬름 차트)을 만들 수 있다.

이러한 용어가 익숙치 않다면, 용어 정리를 잠깐 하고 넘어가자.

용어 정리

kustomize

  • 오버레이(Overlay) : 기본 Kubernetes 매니페스트에 대한 수정 사항을 담고 있는 레이어.
    이를 통해 kustomize에서 특정 환경이나 요구 사항에 맞게 원본 매니페스트를 '오버라이드'할 수 있도록 해준다.

helm

  • helm 차트 : helm 패키지 매니저를 사용하여 관리되는 Kubernetes 리소스 템플릿이자 설정 집합.

  • Values 파일 : helm 차트를 변경하는 파일.
    helmvalues.yaml 파일을 사용하여 차트의 디폴트 값을 특정 환경이나 요구사항에 맞게 변경한다.

공통 사항

  • 매니페스트 파일(Manifest file) : Kubernetes의 Deployment, Service 등의 리소스 정의가 포함된 yaml 파일

  • 파라미터화 : 배포 전 기본 리소스 정의를 수정 하는 것
    즉, 파라미터화를 통해 사용자는 템플릿(오버레이 된 Manifest file 또는 Helm 차트)을 배포하기 전에 변경할 수 있다.


kustomize

로드밸런서의 기능을 제공하는 MetalLB의 버전을 업그레이드 한다고 생각해보자.

MetalLB는 실제로 단순히 하나의 Manifest 파일로 구성된 것이 아니라, MetalLB, MetalLB의 네임스페이스, 구성정보, 멤버 리스트 등 다양한 종류의 Manifest파일이 함께 배포된다.

따라서 MetalLB 업데이트 하기 위해서는 다양한 종류의 Manifest파일을 모두 업데이트해야 하는데, 이를 kustomize를 이용하면 묶어서 한번에 배포할 수 있다.

kustomize 배포 과정

1. kustomize create를 통해서 kustomization.yaml 파일을 만든다.
2. kustomize edit 명령을 통해서 필요한 내용을들을 동적으로 추가해 준다.
3. 이후 변경된 kustomization.yaml 파일을 kustomize build 하게되면 실제로 배포할 수 있는 최종 파일(allinone)이 생성된다.
(build 명령어는 실제로는 단순 출력만 하므로 파이프라인 | 으로 4번 과 조합하여 사용한다.)
4. 생성된 최종 파일을 kubectl apply -f 명령을 통해 배포한다.

실습

kustomize 설치

#!/usr/bin/env bash

curl -L \
https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv4.2.0/kustomize_v4.2.0_linux_amd64.tar.gz -o /tmp/kustomize.tar.gz
tar -xzf /tmp/kustomize.tar.gz -C  /usr/local/bin
echo "kustomize installed successfully"

kustomization 파일 생성

앞서 4개의 파일은 미리 있다고 가정하고 실습을 진행한다.

없다면 여기를 눌러서 다운 받을 수 있다.

이러한 파일이 있는 곳에서 --autodetect 플래그를 붙여서 실행하면 알아서 kustomization 파일을 생성할 때 추가해준다.

kustomize create --autodetect

kustomization 파일에 이미지 정보 추가

kustomize edit set image quay.io/metallb/speaker:v0.10.2
kustomize edit set image quay.io/metallb/controller:v0.10.2

kustomize 빌드

# 단순히 build 내용만 출력
kustomize build
# 앞쪽에서 build하는 내용을 바로 적용하여 배포
kustomize build | kubectl apply -f -

build를 통해 현재 위치의 kustomization을 읽어서 우리가 배포하고자 하는 최종 파일로 변경해서 배포한다.

  • 최종 파일의 일부

배포 후 버전을 확인해 보면 다음과 같이 업데이트 된 것을 확인할 수 있다.

k describe -n metallb-system pod | grep -i image:


helm

helm을 사용하면 훨씬 더 간편하게 배포할 수 있다.

생산자가 잘 만들어 놓은 차트를 우리는 감사하게 낼름(헬름..낼름?) 받아먹고(helm repo add) 내 쿠버네티스 클러스터에 설치(helm install)하는 과정만 하면된다.

이를 만들어준 개발자 및 시스템 엔지니어에게 감사히 사용 하도록 하자.🤗

실습

nfs 프로비저너metalb를 helm으로 설치하는 실습을 해볼텐데, 이를 보다 쉽게 하기위해 한 레포지토리로 두개의 헬름 차트를 하드코프해서 사용했다.

실제 레포지토리에서 받아오는 과정을 거치고 있다.

helm 설치

여기를 참고

helm repo 받아오기

helm repo add vinca_helm https://k8s-edu.github.io/helm-charts
helm repo list

helm을 통해서 설치

1. metallb 설치

helm install metallb vinca_helm/metallb \
     --create-namespace \
     --namespace=metallb-system \
     --set controller.image.tag=v0.10.2 \
     --set speaker.image.tag=v0.10.2 \
     -f ~/_Lecture_k8s_learning.kit/ch9/9.6/installer-by-helm/l2-config-by-helm.yaml

잘 설치된 것을 확인할 수 있다.

2. nfs-provisioner 설치

helm install nfs-provisioner vinca_helm/nfs-subdir-external-provisioner \
    --set nfs.server=192.168.1.10 \
    --set nfs.path=/nfs_shared/dynamic-vol \
    --set storageClass.name=managed-nfs-storage

nfs-provisioner 및 storageClass가 설치된 것을 확인할 수 있다.

이를 이용해서 이제 PVC를 통해서 PV가 동적으로 생성되고 또 파드에 잘 마운트할 수 있는 지 확인해 보자.
(Deployment 및 PVC 코드 생략)


Helm vs. Kustomize

"그래서 helm과 kustomize 중 어떤 것이 더 좋은데?"

상황에 따라 다르겠지만, 둘은 상호보완적으로 사용할 수 있다.

Helm은 Kubernetes에서 애플리케이션 패키징을 위한 도구이며, Kustomize는 YAML 설정의 세부적인 설정을 조절하고, 런타임을 구성할 수 있는 도구이다.

이 둘을 "함께" 사용하면 Helm 차트로부터 생성된 기본 설정을 취하고, Kustomize를 사용하여 추가적인 사용자 정의 구성을 적용할 수 있다.

예시를 보자.

예시

# 디렉토리 생성
$ mkdir ./base 
# Helm을 사용하여 nginx-ingress 차트의 매니페스트를 렌더링
$ helm template --values ./values.yaml stable/nginx-ingress \
> ./base/manifests.yaml

# kustomization 파일을 Helm으로부터 렌더링된 매니페스트를 기반으로 생성
$ cat <<EOF > ./base/kustomization.yaml   
resources:   
— manifests.yaml    
EOF  

# 오버레이를 적용하여 프로덕션 환경에 배포
$ kubectl apply -k ./overlays/prod/

현재 Helm을 사용해 nginx-ingress의 기본 설정을 생성하고, Kustomize를 이용해 이 설정을 필요에 따라 수정하여 Kubernetes 환경에 배포하고 있다.

이처럼 HelmKustomize를 함께 사용함으로써, Helm템플릿 기능과 Kustomize세밀한 구성 조정을 통해 더 효율적으로 리소스를 배포하고 관리할 수 있다.

cat <<EOF는 뭔가요?

💡 cat 명령어와 << 히어 도큐먼트(Here Document)

cat은 기본적으로 파일의 내용을 출력하는 데 사용된다.
하지만, 여기에서 사용된 cat 명령어의 구문은 히어 도큐먼트 (<<)라는 쉘 스크립트 기능을 사용하여 파일을 생성하는데 사용되었다.
히어 도큐먼트는 특정 시작점(EOF)과 종료점(EOF)을 두고 그 사이에 있는 텍스트를 명령어의 입력으로 사용할 수 있다.


Reference
그림으로 배우는 쿠버네티스
Why it is not about “Helm vs. Kustomize”
DownGit

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps

0개의 댓글