애플리케이션을 한번에 배포할 수 있는 방법인 kustomize
와 helm
에 대해서 알아보자.
kustomize
와 helm
은 둘 다 복잡성이 높은(여러 파드 및 서비스가 포함된) 애플리케이션을 한번에 배포할 수 있도록 하는 도구(패키지 매니저)이다.
두 도구 모두 Kubernetes 매니페스트 파일의 생성 및 관리를 자동화할 수 있고, 파라미터화를 통해서 자신만의 템플릿(kustomize는 오버레이가 적용된 Manifest, Helm은 values를 통해 적용된 헬름 차트)을 만들 수 있다.
이러한 용어가 익숙치 않다면, 용어 정리를 잠깐 하고 넘어가자.
kustomize
에서 특정 환경이나 요구 사항에 맞게 원본 매니페스트를 '오버라이드'할 수 있도록 해준다.helm 차트 : helm 패키지 매니저를 사용하여 관리되는 Kubernetes 리소스 템플릿이자 설정 집합.
Values 파일 : helm 차트를 변경하는 파일.
helm
은 values.yaml
파일을 사용하여 차트의 디폴트 값을 특정 환경이나 요구사항에 맞게 변경한다.
매니페스트 파일(Manifest file) : Kubernetes의 Deployment, Service 등의 리소스 정의가 포함된 yaml
파일
파라미터화 : 배포 전 기본 리소스 정의를 수정 하는 것
즉, 파라미터화를 통해 사용자는 템플릿(오버레이 된 Manifest file 또는 Helm 차트)을 배포하기 전에 변경할 수 있다.
로드밸런서의 기능을 제공하는 MetalLB의 버전을 업그레이드 한다고 생각해보자.
MetalLB는 실제로 단순히 하나의 Manifest 파일로 구성된 것이 아니라, MetalLB
, MetalLB의 네임스페이스
, 구성정보
, 멤버 리스트
등 다양한 종류의 Manifest파일이 함께 배포된다.
따라서 MetalLB 업데이트 하기 위해서는 다양한 종류의 Manifest파일을 모두 업데이트해야 하는데, 이를 kustomize를 이용하면 묶어서 한번에 배포할 수 있다.
1. kustomize create를 통해서 kustomization.yaml
파일을 만든다.
2. kustomize edit 명령을 통해서 필요한 내용을들을 동적으로 추가해 준다.
3. 이후 변경된 kustomization.yaml
파일을 kustomize build 하게되면 실제로 배포할 수 있는 최종 파일(allinone)이 생성된다.
(build 명령어는 실제로는 단순 출력만 하므로 파이프라인 |
으로 4번
과 조합하여 사용한다.)
4. 생성된 최종 파일을 kubectl apply -f 명령을 통해 배포한다.
#!/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"
앞서 4개의 파일은 미리 있다고 가정하고 실습을 진행한다.
없다면 여기를 눌러서 다운 받을 수 있다.
이러한 파일이 있는 곳에서 --autodetect
플래그를 붙여서 실행하면 알아서 kustomization 파일을 생성할 때 추가해준다.
kustomize create --autodetect
kustomize edit set image quay.io/metallb/speaker:v0.10.2
kustomize edit set image quay.io/metallb/controller:v0.10.2
# 단순히 build 내용만 출력
kustomize build
# 앞쪽에서 build하는 내용을 바로 적용하여 배포
kustomize build | kubectl apply -f -
build를 통해 현재 위치의 kustomization을 읽어서 우리가 배포하고자 하는 최종 파일로 변경해서 배포한다.
배포 후 버전을 확인해 보면 다음과 같이 업데이트 된 것을 확인할 수 있다.
k describe -n metallb-system pod | grep -i image:
helm을 사용하면 훨씬 더 간편하게 배포할 수 있다.
생산자가 잘 만들어 놓은 차트를 우리는 감사하게 낼름(헬름..낼름?) 받아먹고(helm repo add) 내 쿠버네티스 클러스터에 설치(helm install)하는 과정만 하면된다.
이를 만들어준 개발자 및 시스템 엔지니어에게 감사히 사용 하도록 하자.🤗
nfs 프로비저너
와 metalb
를 helm으로 설치하는 실습을 해볼텐데, 이를 보다 쉽게 하기위해 한 레포지토리로 두개의 헬름 차트를 하드코프해서 사용했다.
실제 레포지토리에서 받아오는 과정을 거치고 있다.
여기를 참고
helm repo add vinca_helm https://k8s-edu.github.io/helm-charts
helm repo list
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
잘 설치된 것을 확인할 수 있다.
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과 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 환경에 배포하고 있다.
이처럼 Helm
과 Kustomize
를 함께 사용함으로써, Helm
의 템플릿 기능과 Kustomize
의 세밀한 구성 조정을 통해 더 효율적으로 리소스를 배포하고 관리할 수 있다.
💡 cat
명령어와 <<
히어 도큐먼트(Here Document)
cat
은 기본적으로 파일의 내용을 출력하는 데 사용된다.
하지만, 여기에서 사용된 cat
명령어의 구문은 히어 도큐먼트 (<<
)라는 쉘 스크립트 기능을 사용하여 파일을 생성하는데 사용되었다.
히어 도큐먼트는 특정 시작점(EOF)과 종료점(EOF)을 두고 그 사이에 있는 텍스트를 명령어의 입력으로 사용할 수 있다.
Reference
그림으로 배우는 쿠버네티스
Why it is not about “Helm vs. Kustomize”
DownGit