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 |