본문 바로가기

Kubernetes(k8s)/Helm

Helm

1.        Helm

 

         1.1.        정의

다양한 리소스를 각각 관리하지 않고 하나의 패키지로 관리하는 도구이다.

리눅스 환경에서 yum, apt 등이 애플리케이션에 필요한 모든 라이브러리를 패키지 형태로 제공하는 것과 유사하다.

              헬름의 주요 개념 3가지로 헬름 차트, 헬름 리포지토리, 헬름 템플릿이 있다.

 

 

         1.2.        헬름 차트

일반적으로 ‘차트’라는 용어는 그래프를 의미하지만 헬름에서의 차트는

애플리케이션 설치에 사용되는 네트워크, 스토리지, 보안과 관련된 여러 k8s

리소스를 묶어놓은 패키지를 의미한다. 헬름 차트를 통해 애플리케이션을 설치할

때 개별리소스마다 하나씩 별도로 설치하지 않고 헬름차트 하나로 일괄 설치할 수

있다.

 

                        1.2.1.        헬름 차트 디렉토리 구조

파일 및 디렉토리 설명
Chart.yaml 차트에 대한 정보가 담긴 YAML파일.
LICENSE 차트의 라이센스 정보가 담긴 텍스트 파일
README.md 해당 차트에 대한 설명을 포함한 README파일
values.yaml 차트의 기본 템플릿 변수 파일
charts/ 차트에 종속된 차트들을 포함하는 디렉토리
crds/ 커스텀 자원 정의
templates/ values 파일과 같이 유효한 k8s 매니페스트 파일을 생성하는 템플릿 디렉토리
templates/NOTES.txt 차트 사용법을 설명하는 텍스트 파일

 

 

         1.3.        chart.yaml

apiVersion: # 차트 API 버전 (필수)
name: # 차트명 (필수)
version: SemVer 2 # 버전 (필수)
kubeVersion: # 호환되는 쿠버네티스 버전의 SemVer 범위 (선택)
description: # 이 프로젝트에 대한 간략한 설명 (선택)
type: # 차트 타입 (선택)
keywords: # 이 프로젝트에 대한 키워드 리스트 (선택)
home: # 프로젝트 홈페이지의 URL (선택)
sources: # 이 프로젝트의 소스코드 URL 리스트 (선택)
dependencies: # 차트 필요조건들의 리스트 (optional)
    name: # 차트명 (nginx)
    version: # 차트의 버전 ("1.2.3")
   
repository: # 저장소 URL ("https://example.com/charts") 또는 ("@repo-name")
    condition: # (선택) 차트들의 활성/비활성을 결정하는 boolean 값을 만드는 yaml 경로 (예시: subchart1.enabled)
    tags: # (선택)
      - 활성화 / 비활성을 함께하기 위해 차트들을 그룹화 할 수 있는 태그들
    enabled: # (선택) 차트가 로드될수 있는지 결정하는 boolean
    import-values: # (선택)
      - ImportValues 는 가져올 상위 키에 대한 소스 값의 맵핑을 보유한다. 각 항목은 문자열이거나 하위 / 상위 하위 목록 항목 쌓일 수 있다.
    alias: # (선택) 차트에 대한 별명으로 사용된다. 같은 차트를 여러번 추가해야할때 유용하다.
maintainers: # (선택)
  - name: # maintainer들의 이름 (각 maintainer마다 필수)
    email: # maintainer들의 email (각 maintainer마다 선택)
    url: # maintainer에 대한 URL (각 maintainer마다 선택)
icon: # 아이콘으로 사용될 SVG나 PNG 이미지 URL (선택)
appVersion: # 이 앱의 버전 (선택). SemVer인 필요는 없다.
deprecated: # 차트의 deprecated 여부 (선택, boolean)
annotations:
 
 example: # 키로 매핑된 주석들의 리스트 (선택).

 

 

         1.4.         기본 명령어

 

명령어 설명
helm repo add 헬름 repo를 추가한다.
helm pull 헬름 차트 파일을 내려 받는다.
helm ls 설치된 헬름 차트 목록을 확인한다.
helms install 차트 아카이브 설치
helm get search 차트에서 키워드 검색
helm upgrade 릴리스 업그레이드
helm delete 릴리스 삭제

 

 

         1.5.        설치 방법

 

1)    helm 설치

# git에서 helm 다운로드
[admin1@controlnode ~ (kubernetes-admin@cluster.local:default)]$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
 
# 다운받은 helm 실행 쉘(get_helm.sh) 확인
[admin1@controlnode ~ (kubernetes-admin@cluster.local:default)]$ ls
Desktop  Documents  Downloads  get_helm.sh  kube-ps1  kubespray  Music  Pictures  Public  snap  Templates  Videos

 
# 실행 권한 부여
[admin1@controlnode ~ (kubernetes-admin@cluster.local:default)]$

sudo chmod 700 get_helm.sh
 
# 스크립트 실행
[admin1@controlnode ~ (kubernetes-admin@cluster.local:default)]$
./get_helm.sh
Downloading https://get.helm.sh/helm-v3.12.3-linux-amd64.tar.gz
Verifying checksum...
Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm

 
# 다운된 helm 버전 확인
[admin1@controlnode ~ (kubernetes-admin@cluster.local:default)]$

helm version
version.BuildInfo{Version:"v3.12.3", GitCommit:"3a31588ad33fe3b89af5a2a54ee1d25bfe6eaa5e", GitTreeState:"clean", GoVersion:"go1.20.7"}

 

2)    helm repo 추가 및 nginx 설치

# bitnami repo를 추가한다.
[admin1@controlnode ~ (kubernetes-admin@cluster.local:default)]$
helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories


# 레포 리스트 확인
[admin1@controlnode ~ (kubernetes-admin@cluster.local:default)]$ helm repo ls
NAME       URL                              
bitnami      https://charts.bitnami.com/bitnami


# 추가된 bitnami의 helm 레포에서 nginx가 있는지 확인
[admin1@controlnode ~ (kubernetes-admin@cluster.local:default)]$ helm search repo nginx
NAME                            CHART VERSION     APP VERSION        DESCRIPTION                                      
bitnami/nginx                     15.1.3                1.25.2     NGINX Open Source is a web server that can be a...
bitnami/nginx-ingress-controller   9.7.7                  1.8.1      NGINX Ingress Controller is an Ingress controll...
bitnami/nginx-intel                2.1.15                0.4.9      DEPRECATED NGINX Open Source for Intel is a lig...

 
# 헬름 차트에서 nginx를 가져온다.
[admin1@controlnode ~ (kubernetes-admin@cluster.local:default)]$ helm pull bitnami/nginx
 
# tar로 받아온 nginx 확인
[admin1@controlnode ~ (kubernetes-admin@cluster.local:default)]$ ls
Desktop  Documents  Downloads  get_helm.sh  kube-ps1  kubespray  Music  nginx-15.1.3.tgz  Pictures  Public  snap  Templates  Videos


#  설치한 nginx tar 파일을 압축 해제
[admin1@controlnode ~ (kubernetes-admin@cluster.local:default)]$ tar xzvf nginx-15.1.3.tgz
 
# nginx 디렉토리의 명칭을 버전에 맞게 변경
[admin1@controlnode nginx-15.1.3 (kubernetes-admin@cluster.local:default)]$ mv nginx nginx-15.1.3


# 디렉토리 내부로 이동
[admin1@controlnode nginx-15.1.3 (kubernetes-admin@cluster.local:default)]$ cd nginx-15.1.3/


# 원본 values.yaml의 복사본을 생성
[admin1@controlnode nginx-15.1.3 (kubernetes-admin@cluster.local:default)]$ cp values.yaml myvalue.yaml

# 사용할 yaml파일(myvalues.yaml) 수정

[admin1@controlnode nginx-15.1.3 (kubernetes-admin@cluster.local:default)]$ vi myvalue.yaml


121 ## @param replicaCount Number of NGINX replicas to deploy
122 ##
123 replicaCount: 2 //레플리카 셋 설정을 변경
 
# Helm 명령어를 사용 myvalues.yml을 설치
[admin1@controlnode nginx-15.1.3 (kubernetes-admin@cluster.local:nginx)]$ helm install nginx -f myvalue.yaml .

NAME: nginx
LAST DEPLOYED: Wed Aug 16 12:32:58 2023
NAMESPACE: nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: nginx
CHART VERSION: 15.1.3
APP VERSION: 1.25.2

** Please be patient while the chart is being deployed **
NGINX can be accessed through the following DNS name from within your cluster:

    nginx.nginx.svc.cluster.local (port 80)

To access NGINX from outside the cluster, follow the steps below:

1. Get the NGINX URL by running these commands:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace nginx -w nginx'

    export SERVICE_PORT=$(kubectl get --namespace nginx -o jsonpath="{.spec.ports[0].port}" services nginx)
    export SERVICE_IP=$(kubectl get svc --namespace nginx nginx -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo "http://${SERVICE_IP}:${SERVICE_PORT}"

 
# 차트로 설치된 pod 확인
[admin1@controlnode nginx-15.1.3 (kubernetes-admin@cluster.local:nginx)]$
kubectl get all
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-5dbb46f665-dmtwc   1/1     Running   0          51s
pod/nginx-5dbb46f665-gznnh   1/1     Running   0          51s

NAME            TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/nginx   LoadBalancer   10.233.55.228   <pending>     80:32061/TCP   51s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   2/2     2            2           51s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-5dbb46f665   2         2         2       51s

 
# 생성된 helm 리스트 확인
[admin1@controlnode nginx-15.1.3 (kubernetes-admin@cluster.local:nginx)]$ helm ls
NAME    NAMESPACE      REVISION UPDATED                                       STATUS           CHART                APP VERSION
nginx    nginx    1         2023-08-16 12:32:58.09352691 +0900 KST     deployed nginx-15.1.3        1.25.2

 
# helm으로 생성된 nginx 상세 내용 확인
[admin1@controlnode nginx-15.1.3 (kubernetes-admin@cluster.local:nginx)]$
helm get manifest nginx