KUBERNETES

11. 헬름을 이용하여 퍼블릭 애플리케이션 설치

제니퍼 쿠버네티스 – 로그 모니터링

이번 장은 쿠버네티스 환경에서 애플리케이션을 손쉽게 설치할 수 있는 헬름을 알아보겠습니다. 

헬름(Helm)은 쿠버네티스 환경의 애플리케이션 패키지 관리 도구로, 애플리케이션을 손쉽게 설치, 배포, 업그레이드, 롤백할 수 있는 오픈 소스입니다. 핼름은 “Chart”라는 패키지로 애플리케이션을 구성하고, 템플릿화된 리소스들과 함께 배포 가능한 단위로 애플리케이션을 정의합니다. 리눅스 환경의  ‘yum’, ‘apt’ 등의 패키지 관리 도구와 동일하게 애플리케이션 실행에 필요한 여러 요소를 패키지 형태로 관리합니다. 일괄 설치가 가능하여 소프트웨어 패키지의 설치 및 관리를 간편하게 해주는 강력한 도구입니다. 필자는 쿠버네티스 환경의 전체 애플리케이션을 헬름으로 관리합니다.

앞에서 설치한 ArgoCD, AWS LB Controller, External DNS Controller 등과 앞으로 설치할 Kafka 등 모든 애플리케이션은 헬름으로 설치하고 관리합니다.

주요 내용

  • 헬름 구성의 주요 3요소 – 헬름 차트, 템플릿, Values File – 알아보기
  • 헬름을 이용한 애플리케이션 설치 단계 정리 

실습 과제

  • 헬름을 이용하여 Redis 애플리케이션 설치
  • ArgoCD 이용 헬름 애플리케이션 설치

깃헙 링크

1. 헬름 주요 구성 요소 3가지 : Chart, Templates 디렉토리, Values File

헬름은 Chart, Templates 디렉토리, Value File 3가지 주요 구성 요소로 이루어졌습니다. 각각을 알아봅니다.

먼저 차트는 헬름의 기본 패키지로 쿠버네티스 애플리케이션을 설치, 업그레이드, 제거하기 위한 모든 리소스들을 포함합니다. 일반적으로 차트란 도표, 그래프를 의미하는데 헬름에서는 상세 기록(예: 음악 차트), 묶음을 의미합니다.

쿠버네티스에서 애플리케이션을 설치할 때 흔히 Redis 헬름 차트, Kafka 헬름 차트를 이용한다는 말을 사용하는데 이 때 해당 애플리케이션 설치에 필요한 모든 요소가 모두 포함된 리소스를 헬름 차트라고 합니다. 차트는 일련의 디렉토리로 구성되며, Chart.yaml 파일을 포함합니다. Chart.yaml은 차트의 메타데이터 정보를 포함하고 있습니다. 일반적으로 차트 디렉토리는 templates 디렉토리와 values.yaml 파일이 포함되어 있습니다.

아래는 이번 장의 실습에서 사용할 Redis 헬름 차트 디렉토리 구성입니다. ‘Chart.yaml’, ‘values.yaml’ 파일, ‘templates’ 디렉토리를 확인할 수 있습니다. 차트에 Redis 애플리케이션 설치에 필요한 모든 구성 요소를 포함하고 있습니다.

$ (⎈ |switch-singapore-test:default) tree -L 2 redis-17.8.5
redis-17.8.5
├── Chart.lock
├── Chart.yaml
├── README.md
├── charts
│   └── common
├── ci
│   └── my-values.yaml
├── img
│   ├── redis-cluster-topology.png
│   └── redis-topology.png
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
(생략)
├── values.schema.json
└── values.yaml

9 directories, 25 files

Chart.yaml 파일 정보입니다.

Chart.yaml

annotations:
  category: Database
  licenses: Apache-2.0
apiVersion: v2
appVersion: 7.0.9
dependencies:
- name: common
  repository: https://charts.bitnami.com/bitnami
  tags:
  - bitnami-common
  version: 2.x.x
description: Redis(R) is an open source, advanced key-value store. It is often referred
  to as a data structure server since keys can contain strings, hashes, lists, sets
  and sorted sets.
home: https://github.com/bitnami/charts/tree/main/bitnami/redis
icon: https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png
keywords:
- redis
- keyvalue
- database
maintainers:
- name: Bitnami
  url: https://github.com/bitnami/charts
name: redis
sources:
- https://githu

Redis 헬름 차트의 메타 정보, 데이터에 대한 정보를 포함합니다. 주로 현재 헬름 차트의 Application 버전 정보, 헬름 차트의 버전 정보를 조회하는 용도로 사용합니다. 

위 예제는 현재 헬름 차트가 Redis 버전은 7.0.9, 헬름 차트 버전은 17.8.5를 나타냅니다. 그리고 Bitnami 사가 이 헬름 차트를 유지보수(maintainters)하는 걸 알 수 있습니다.

다음으로 Templates 디렉토리는 헬름 차트 안에 포함된 쿠버네티스 리소스들을 나열합니다. 템플릿 파일은 .yaml 확장자이며, 템플릿 엔진는 Go 템플릿을 사용합니다. 헬름 차트를 이용하여 배포하면 values 파일의 설정이 템플릿 디렉토리의 리소스들에 반영하여 실제 배포됩니다. 어떤 리소스들이 배포되는지 해당 리소스의 템플릿 변수는 어떻게 설정되었는지 확인하는 용도로 템플릿 디렉토리 내의 파일들을 사용합니다.

위에서 사용한 레디스 헬름 차트의 templates 디렉토리의 상세 정보는 아래와 같습니다.

$ (⎈ |switch-singapore-test:default) tree -L 1 templates
templates
├── NOTES.txt
├── _helpers.tpl
├── configmap.yaml
├── extra-list.yaml
├── headless-svc.yaml
├── health-configmap.yaml
├── master
├── metrics-svc.yaml
├── networkpolicy.yaml
├── pdb.yaml
├── prometheusrule.yaml
├── replicas
├── role.yaml
├── rolebinding.yaml
├── scripts-configmap.yaml
├── secret.yaml
├── sentinel
├── serviceaccount.yaml
├── servicemonitor.yaml
└── tls-secret.yaml

헬름 차트로 배포되는 쿠버네티스의 다양한 리소스가 tempaltes 디렉토리에 보관되었습니다. ConfigMap, Service(SVC), Secret등을 확인할 수 있습니다. 실제 템플릿 디렉토리의 파일을 확인하면 헬름 values 파일의 변수로 동적으로 값이 채워질 부분을 표시하는 템플릿 구문이 있습니다. 리소스의 이름, 레플리카 수, 포트 번호 등과 같은 다양한 파라미터를 헬름 values 파일을 이용하여 커스터마이징할 수 있습니다.

$ (⎈ |switch-singapore-test:default) cat templates/configmap.yaml
(생략)
  sentinel.conf: |-
    dir "/tmp"
    port {{ .Values.sentinel.containerPorts.sentinel }}
(생략)

.Values.sentinel.containerPorts.sentinel

value 파일에 입력한 port 정보가 해당 변수에 입력됩니다. 템플릿 파일로 구현되어 상황에 따라 다양한 변수를 입력할 수 있습니다. Go 템플릿을 사용하여 if, range 등의 함수도 지원합니다.

마지막으로 헬름 values 파일은 헬름 차트에서 사용하는 매개변수를 정의합니다. 헬름 차트는 기본 설정으로 values.yaml을 제공합니다. 필자는 원본 values.yaml을 복사하여 필자의 환경에 맞게 특정 파라미터를 수정하여 새로운 파일(예: ci/my-values.yaml)로 이름을 변경하여 저장합니다.

values 파일은 기본값을 사용하거나 관리자가 원하는 값으로 덮어쓰는 용도로 사용됩니다. 사용자는 values 파일을 수정하여 애플리케이션을 각자의 환경에 맞게 구성할 수 있습니다. 필자는 기본 values 파일에서 변경되지 않는 부분은 삭제하고 변경된 부분만 남겨두는 방법으로 values 파일을 관리합니다. 

기본 설정에서 변경된 부분만 저장하여 변경 사항을 빠르게 확인할 수 있고 보기가 편리하여 유지 보수 작업에 큰 도움이 됩니다. 아래는 실제 사용하는 Redis 헬름 차트의 values 파일입니다.

ci/my-values.yaml

architecture: replication
auth:
  enabled: false
master:
  count: 1
replica:
  replicaCount: 2
sentinel:
  enabled: false
metrics:
  enabled: true
sysctl:
  enabled: true

기본 values 파일에서 필자가 원하는 Redis 1ea Master, 2ea Replicas 아키텍쳐로 구성하도록 기본 values 파일을  수정하였습니다.

처음 헬름 차트를 확인하면 너무 다양한 파일들이 있어 낯설지만 위 3가지 주요 구성 요소를 중심으로 파악하면 그리 어렵지 않습니다. 거의 모든 헬름 차트가 동일한 구성이라 곧 익숙해집니다.

2. 헬름 애플리케이션 설치 프로세스

이번 절은 헬름을 이용하여 애플리케이션을 설치하겠습니다. 헬름은 로컬 PC에 헬름 차트를 다운받지 않고 인터넷에 공개된 차트를 그대로 이용하여 설치할 수 있습니다. 예를 들어 Redis 차트는 아래와 같은 명령어로 바로 설치 가능합니다.

helm install my-release oci://registry-1.docker.io/bitnamicharts/redis

하지만 필자는 헬름 차트 버전과 value 파일을 관리하기 위하여 로컬에 헬름 차트를 내려받습니다. 로컬에 헬름 차트를 내려받아 필요한 부분만 변경합니다. 수정한 사항은 내부 깃 저장소에 저장하여 GitOps 기반으로 관리합니다.

그럼, Redis 차트 기준으로 헬름을 설치하는 순서는 알아보겠습니다. 헬름 차트를 보관하는 디렉토리를 만들고 해당 디렉토리로 이동합니다.

$ (⎈ |switch-singapore-test:default) mkdir redis && cd redis

helm pull 명령어를 사용하여 원하는 헬름 차트를 로컬에 다운받습니다. 명령어에 –version 옵션을 포함하면 원하는 version의 차트를 지정하여 내려받을 수 있습니다. 특별히 version 옵션을 지정하지 않으면 최신 버전의 차트를 내려받습니다. 필자는 여러 클러스터를 운영하는데 각 클러스터마다 동일한 버전의 차트를 사용하기 위하여 특정 버전을 지정하여 내려 받습니다. 그리고 독자분들도 필자의 실습과 동일한 버전을 사용하려면 같은 버전을 내려받으면 됩니다. 물론 대부분의 경우 최신 버전을 사용해도 설치에 별다른 문제가 없습니다.

$ (⎈ |switch-singapore-test:default) helm pull oci://registry-1.docker.io/bitnamicharts/redis --version 17.8.5
Pulled: registry-1.docker.io/bitnamicharts/redis:17.8.5
Digest: sha256:ba8f53e173fda949e0539604cea71ecf71d6dadf99916ffe5ff741376ce64dcf

압축 파일(tgz)을 확인할 수 있습니다.

$ (⎈ |switch-singapore-test:default) ls -lrt
total 184
-rw-r--r--  1 jerry  staff  90679 Jul 24 05:56 redis-17.8.5.tgz

압축 파일을 해제하고 기존 압축 파일은 삭제합니다. 압축 해제된 디렉토리는 버전 관리를 위하여 버전 정보를 디렉토리 이름에 추가합니다. 향후 디렉토리 이름만으로 버전 정보를 알 수 있어 편리합니다.

$ (⎈ |switch-singapore-test:default) tar xvfz redis-17.8.5.tgz 
$ (⎈ |switch-singapore-test:default) rm -rf redis-17.8.5.tgz 
$ (⎈ |switch-singapore-test:default) mv redis redis-17.8.5

헬름 차트가 포함된 Redis 디렉토리로 이동하고 values.yaml을 새롭게 만든 CI 디렉토리로 복사합니다.

$ (⎈ |switch-singapore-test:default) cd redis-17.8.5 
$ (⎈ |switch-singapore-test:default) mkdir ci
$ (⎈ |switch-singapore-test:default) cp values.yaml ci/
$ (⎈ |switch-singapore-test:default) ls ci 
values.yaml

디폴트 values.yaml 파일과 구분을 위하여 각 클러스터마다 구분할 수 있는 이름으로 values 파일 이름을 변경합니다. 필자는 singapore-test-values 파일로 변경하였습니다.

$ (⎈ |switch-singapore-test:default) cd ci                
$ (⎈ |switch-singapore-test:default) mv values.yaml singapore-test-values.yaml

향후 위와 같은 과정을 반복하여 헬름 차트를 관리합니다. 앞으로 애플리케이션 설치 시 동일한 프로세스를 계속 사용합니다. 이제 준비가 완료되어 헬름 value 파일만 변경하면 쿠버네티스 환경에 애플리케이션을 설치할 수 있습니다.

3. 헬름 차트를 이용한 Redis 설치

이번 절은 준비한 레디스 헬름 차트로 애플리케이션을 설치합니다.

VSCode 등을 이용하여 헬름 values 파일의 내용을 확인하면 다양한 변수를 확인할 수 있습니다. 각자 필요한 Redis 설치 요구 사항에 따라 변수를 수정합니다. 다양한 설치 요구 사항에 맞게 values 파일을 변경하는 것이 가장 중요한 작업입니다. 경험과 지식이 필요합니다. 다행히 다른 사용자도 공통된 요구 사항이라 검색하면 어렵지 않게 필요한 구성을 찾을 수 있습니다.

레디스와 관련된 Sentinel, Master, Replication, Configuration 등 다양한 설정 사항을 values 파일을 수정하여 구성할 수 있습니다. 기존에 사용 중인 ‘redis.conf’ 파일을 참조하여 변경하거나 Best Practice 기반으로 설정을 수정합니다.

필자는 위에서 공유한 1ea Master, 2ea Replica 설정으로 변경하였습니다.

https://github.com/junghoon2/k8s-class/blob/main/redis/redis-17.8.5/ci/my-values.yaml

architecture: replication
auth:
  enabled: false
master:
  count: 1
replica:
  replicaCount: 2
sentinel:
  enabled: false
metrics:
  enabled: true
sysctl:
  enabled: true

해당 values 파일을 기준으로 Redis 헬름 차트를 설치합니다. 설치에 사용하는 명령어는 ‘helm install’ 입니다. 명령어는 레디스 헬름 차트를 내려받은 디렉토리에서 실행합니다.

$ (⎈ |switch-singapore-test:default) pwd
/Users/jerry/private/redis/redis-17.8.5
$ (⎈ |switch-singapore-test:redis) helm install redis -f ci/my-values.yaml --create-namespace -n redis .
NAME: redis
LAST DEPLOYED: Mon Jul 24 09:06:09 2023
NAMESPACE: redis
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: redis
CHART VERSION: 17.8.5
APP VERSION: 7.0.9
(생략)

. helm install redis
헬름 차트의 이름을 지정합니다. 임의로 지정할 수 있지만 관리 상 redis를 사용하는 것을 권고합니다.

. –create-namespace -n redis
네임스페이스 이름을 지정합니다. 만약 redis 네임스페이스가 없으면 네임스페이스를 새롭게 생성합니다.

정상으로 설치되면 Redis 파드와 PVC를 확인할 수 있습니다.

$ (⎈ |switch-singapore-test:redis) k ns redis
Context "jerry-test" modified.
Active namespace is "redis".

$ (⎈ |switch-singapore-test:redis) k get pod,pvc                                                                    
NAME                   READY   STATUS    RESTARTS   AGE
pod/redis-master-0     2/2     Running   0          2m26s
pod/redis-replicas-0   2/2     Running   0          2m26s
pod/redis-replicas-1   2/2     Running   0          104s

NAME                                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/redis-data-redis-master-0     Bound    pvc-452dc0e3-5a72-4662-80d2-f4b6faf2b4fa   8Gi        RWO            ebs-sc         2m26s
persistentvolumeclaim/redis-data-redis-replicas-0   Bound    pvc-d11ecd0e-32e1-494f-9b6f-70363fead5ef   8Gi        RWO            ebs-sc         2m26s
persistentvolumeclaim/redis-data-redis-replicas-1   Bound    pvc-6395d2ee-caf3-4582-ba68-1bb04552ecce   8Gi        RWO            ebs-sc         104s

k get-all 유틸리티로 헬름 차트로 설치된 전체 리소스를 리스트를 확인합니다.

$ (⎈ |switch-singapore-test:redis) k get-all -n redis
NAME                                                 NAMESPACE  AGE
configmap/kube-root-ca.crt                           redis      7d21h  
configmap/redis-configuration                        redis      3m26s  
configmap/redis-health                               redis      3m26s  
configmap/redis-scripts                              redis      3m26s  
endpoints/redis-headless                             redis      3m26s  
endpoints/redis-master                               redis      3m26s  
endpoints/redis-metrics                              redis      3m26s  
endpoints/redis-replicas                             redis      3m26s  
persistentvolumeclaim/redis-data-redis-master-0      redis      3m26s  
persistentvolumeclaim/redis-data-redis-replicas-0    redis      3m26s  
persistentvolumeclaim/redis-data-redis-replicas-1    redis      2m44s  
pod/redis-master-0                                   redis      3m26s  
pod/redis-replicas-0                                 redis      3m26s  
pod/redis-replicas-1                                 redis      2m44s  
secret/sh.helm.release.v1.redis.v1                   redis      3m26s  
serviceaccount/default                               redis      7d21h  
serviceaccount/redis                                 redis      3m26s  
service/redis-headless                               redis      3m26s  
service/redis-master                                 redis      3m26s  
service/redis-metrics                                redis      3m26s  
service/redis-replicas                               redis      3m26s  
controllerrevision.apps/redis-master-f876867b        redis      3m26s  
controllerrevision.apps/redis-replicas-556c66d4df    redis      3m26s  
statefulset.apps/redis-master                        redis      3m26s  
statefulset.apps/redis-replicas                      redis      3m26s  
endpointslice.discovery.k8s.io/redis-headless-55q6q  redis      3m26s  
endpointslice.discovery.k8s.io/redis-master-cj25v    redis      3m26s  
endpointslice.discovery.k8s.io/redis-metrics-xzvj5   redis      3m26s  
endpointslice.discovery.k8s.io/redis-replicas-zsp9w  redis      3m26s 

ServiceAccount, ConfigMap, Secret 등 다양한 리소스가 설치된 것을 확인할 수 있습니다. 만약 위 리소스들을 일일이 하나씩 설치하면 많은 시간이 소요될 것입니다. 헬름 차트로 설치하면 위와 같이 하나의 명령어로 편리하게 관련 리소스를 전부 설치할 수 있습니다. 삭제도 물론 마찬가지입니다.

전체 리소스 리소스를 확인하는 ‘k get-all’ 유틸리티는 k krew로 설치 가능하며 주로 네임스페이스 기준으로 현재 설치되어 있는 전체 리소스를 보여줍니다. 기본으로 제공하는 ‘k get all’ 명령어는 전체 리소스를 나타내지 않으므로 ‘k get-all’을 사용하는 것을 추천합니다.

헬름 차트는 이와 같이 ‘helm install’로 명령어로 설치할 수 있습니다. 하지만 실무에서는 명령어를 이용하여 설치하는 것 보다는 ArgoCD를 이용하여 설치합니다. 왜 그럴까요?

명령어로 설치한 애플리케이션은 현재 상태(Ops)가 깃에 저장된 소스 코드(Git)와 일치하는지 확인할 수 없습니다. 또한 임의로 변경한 경우 설치 옵션을 어떻게 사용했는지 기록을 남기기 어렵습니다. 즉, GitOps 기반으로 운영하기 쉽지 않습니다. ArgoCD를 이용하여 다시 배포하는 것을 권고합니다.

$ (⎈ |switch-singapore-test:redis) helm delete redis
release "redis" uninstalled

ArgoCD Application 파일을 생성합니다.

redis-application.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: redis
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: redis
    server: {{ .Values.spec.destination.server }}
  project: default
  source:
    path: redis/redis-17.8.5
    helm:
      valueFiles:
      - ci/singapore-test-values.yaml
    repoURL: {{ .Values.spec.source.repoURL }}
    targetRevision: {{ .Values.spec.source.targetRevision }}
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
    - RespectIgnoreDifferences=true

. spec.syncPolicy.automated
환경에 따라 automated 옵션은 사용하지 않아도 됩니다. 필자도 개발/스테이지 환경에서는 편의를 위하여 automated 옵션을 사용하고 운영 환경은 automated 옵션을 사용하지 않습니다.

해당 redis-application.yaml 파일을 적용합니다.

$ (⎈ |switch-singapore-test:argocd) k apply -f redis-application.yaml 

ArgoCD UI에서 확인하면 정상으로 Redis가 배포되었습니다.

이처럼 Helm으로 설치 검증이 끝난 애플리케이션은 번거롭지만 삭제를 하고 ArgoCD로 다시 배포하는 것을 권고합니다. GitOps 정책을 지키기 위해서는 의식적인 노력이 필요합니다.

이상으로 이번 장에서 쿠버네티스 환경에서 헬름을 이용하여 애플리케이션을 설치하는 방법을 알아보았습니다. 다음 장에서는 In-House 커스텀 애플리케이션을 헬름으로 설치하는 방법을 알아보겠습니다.

도전 과제
. 헬름을 이용하여 Kafka를 설치합니다.

해당 기술 블로그에 질문이 있으시면 언제든지 문의해 주세요. 직접 답변해 드립니다.
k8sqna@jennifersoft.com

1.최근에는 CRD를 사용하는 Operator를 사용하여 애플리케이션을 설치할 수도 있습니다.
오퍼레이터허브(https://operatorhub.io/) 사이트에서 오퍼레이터로 설치할 수 있는 다양한 애플리케이션 목록을 확인할 수 있습니다.
2.k krew install get-all’ 명령어로 설치할 수 있습니다.

Next

Contact Us

안녕하세요? 제니퍼소프트입니다.
기술 문의의 경우 질문자의 회사/이름/연락처를 본문에 기술해 주셔야만 원할한 지원이 가능합니다.
보내주신 문의 사항을 검토하여 빠른 시일 내에 답변해 드리겠습니다.

  • Chris
  • Irene

메일을 보냈습니다.

메일 전송이 완료되었습니다.
빠른 시일 내에 답변드리겠습니다.
감사합니다.
제니퍼소프트 웹사이트는 쿠키를 사용합니다. 쿠키에 대한 자세한 정보 및 삭제 방법은 제니퍼소프트의 개인정보처리방침을 참고하시기 바라며 본 사이트를 계속해서 이용하는 것은 제니퍼소프트의 쿠키 사용에 동의함을 의미합니다.