소개
Helm은 Kubernetes용 패키지 관리자로, 개발자와 운영자가 Kubernetes 클러스터에 애플리케이션을 더 쉽게 구성하고 배포할 수 있도록 합니다.
Helm 패키지는 차트(charts)라고 불리며, 사용자의 노력을 최소화하면서 주어진 앱을 배포하고 구성하는 리소스 정의의 템플릿을 포함합니다. 템플릿을 사용하면 실제 차트를 수정하지 않고도 차트와 해당 설정 및 동작을 변수 정의를 통해 관리할 수 있습니다. 사용자 정의 리소스 정의 및 이미 배포된 정의의 수정은 Helm이 자동으로 관리합니다. 가능한 사용자 정의가 적용된 배포된 차트를 릴리스(release)라고 합니다.
이 튜토리얼에서는 Helm 3를 설정하고 차트 및 릴리스를 설치, 업그레이드, 롤백 및 관리하는 방법을 배우게 됩니다. 또한 자체 차트를 만들고 패키지화하고, 바로 설치할 수 있는 차트를 호스팅하는 차트 저장소를 설정하는 방법도 배우게 됩니다.
전제 조건
-
Role-Based Access Control (RBAC)이 활성화된 Kubernetes 클러스터. 릴리스에 대한 자세한 정보는 Helm 릴리스 페이지를 확인하십시오.
-
로컬 머신에 설치된
kubectl
명령줄 도구가 클러스터에 연결되도록 구성되어 있습니다. 공식 문서에서kubectl
설치에 대해 더 알아보세요.다음 명령을 사용하여 연결을 테스트할 수 있습니다:
오류가 없으면 클러스터에 연결된 것입니다.
kubectl
을 사용하여 여러 클러스터에 액세스하는 경우 다음을 실행하여 올바른 클러스터 컨텍스트를 확인하세요:출력에서 사용 가능한 구성이 나열됩니다:
출력CURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin여기서 별표 (
*
)는do-fra1-helm3-example
클러스터에 연결되어 있음을 나타냅니다. 클러스터를 전환하려면 다음을 실행하세요:
올바른 클러스터에 연결된 경우 Helm을 설치하려면 단계 1로 계속 진행하세요.
단계 1 — Helm 3 설치
이 섹션에서는 공식으로 제공되는 셸 스크립트를 사용하여 Helm 3를 설치합니다.
먼저 다음 명령을 사용하여 설치 스크립트를 저장할 /tmp
으로 이동합니다:
다음 명령을 사용하여 스크립트를 다운로드합니다:
get_helm.sh
를 텍스트 편집기에서 확인하여 안전한지 확인할 수 있습니다.
다음 권한을 설정하여 실행 가능하게 만듭니다:
마침내 Helm 3를 설치하려면 다음을 실행하십시오:
다음과 유사한 출력을 받게됩니다:
OutputDownloading https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm
현재 기기에 Helm 3가 설치되었습니다. 이제 차트 저장소에 대해 학습하고 사용하는 방법에 대해 알아보겠습니다.
단계 2 — 차트 저장소 설정
Helm 차트는 누구나 호스팅할 수 있는 차트 저장소에 저장됩니다. 기본적으로 Helm 3에는 미리 구성된 저장소가 포함되어 있지 않습니다. 이전 버전의 Helm에는 중앙 집합적으로 관리되는 차트 저장소가 포함되어 있었지만 Helm 3의 설계는 의도적으로 차트 개발자가 자체 저장소를 관리할 수 있도록 진화했습니다. 이는 더 많은 자유와 빠른 릴리스를 가능하게 합니다. 따라서 사용하려는 각 차트마다 호스팅 저장소를 Helm 설치에 추가해야합니다.
적절한 저장소를 찾는 데 도움이 필요하면 ArtifactHub.io를 사용할 수 있습니다. 이는 CNCF에서 관리하는 오픈 소스 웹 사이트로 Helm 차트와 그 저장소를 카탈로그화합니다. 또한 다른 CNCF 프로젝트에서 사용하는 인기 있는 유용한 차트를 추적하기 때문에 이전 버전의 Helm이 사용하는 stable
저장소와는 다릅니다. Nginx 인그레스나 모니터링 도구와 같은 일반적인 프로젝트의 경우 좋은 출처입니다.
홈페이지에서 설치하려는 차트를 검색할 수 있습니다. nginx
를 검색하면 관련된 모든 인덱싱된 차트가 표시됩니다.
Kubernetes 팀이 관리하는 커뮤니티 에디션을 설치할 것입니다. 검색란에 ingress-nginx
를 입력하여 결과에서 찾으세요. 해당 페이지에 접속하세요.
각 차트에는 그 기능을 설명하는 설명이 있어야 하며, 설치하는 명령어와 함께 저장소를 설치하는 명령어도 포함되어야 합니다. 그렇지 않은 경우 페이지 오른쪽의 INSTALL 버튼을 눌러 필요한 명령어를 얻을 수 있습니다.
첫 번째 명령어를 복사하려면 명령어 옆의 파란색 버튼을 클릭하세요. 그런 다음 해당 명령어를 실행하세요:
Helm에 저장소를 추가하려면 helm repo add
를 실행합니다. 이 명령은 저장소의 이름과 위치를 인자로 받습니다.
다음과 같은 출력이 표시됩니다:
Output"ingress-nginx" has been added to your repositories
새 저장소를 추가하면 해당 저장소가 포함하는 내용을 Helm에 알려줘야 합니다. 이를 위해 다음 명령을 실행합니다:
다음과 같은 출력이 표시되어 업데이트가 성공적으로 수행되었음을 확인할 수 있습니다:
OutputHang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "ingress-nginx" chart repository
Update Complete. ⎈Happy Helming!⎈
이 단계에서 ArtifactHub에 대해 알아보고 Helm 설치에 새 저장소를 추가했습니다. 다음 단계에서는 Helm 차트를 설치할 것입니다.
단계 3 — Helm 차트 설치
이전 섹션에서 ingress-nginx
차트의 저장소를 추가했습니다. 이제 클러스터에 해당 차트를 설치할 것입니다.
각 차트에는 동작을 수정할 수 있는 구성 변수가 있습니다. 이러한 변수들은 차트의 일부인 values.yaml
파일에 저장됩니다. 차트를 로컬 머신에 다운로드하지 않은 경우 다음 명령을 실행하여 확인할 수 있습니다:
ingress-nginx
에 대한 사용 가능한 변수를 표시하려면 chart_name
을(를) 다음으로 대체하십시오:
출력은 ingress-nginx
의 values.yaml
내용을 길게 표시합니다.
차트를 설치하려면 helm install
을 사용할 수 있습니다:
A release is a deployed instance of the chart, and here you’re calling it ingress-nginx
.
이 명령은 기본 변수 값으로 차트를 클러스터에 설치합니다. 일부를 수정하려면 새 변수 값을 --set
을 사용하여 전달할 수 있습니다:
필요한 만큼 변수를 반복하여 --set
을 사용할 수 있습니다. 지금 사용자 정의하지 않을 것이므로 다음을 실행하여 설치합니다:
출력은 다음과 유사할 것입니다:
OutputNAME: ingress-nginx
LAST DEPLOYED: Wed Feb 24 10:12:37 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace default get services -o wide -w ingress-nginx-controller'
...
NAME
이 지정한 릴리스 이름에 해당하는 것에 유의하십시오. Helm은 릴리스 상태와 배포된 네임스페이스와 같은 일반 정보도 나열합니다. NOTES
섹션은 차트마다 다르며 일반적으로 빠른 시작 안내 또는 차트의 리소스를 사용할 때 일반적인 문제점에 대해 경고합니다. 여기서는 로드 밸런서가 생성되고 완료까지 시간이 걸릴 수 있다는 것을 알려줍니다.
배포된 차트를 확인하려면 helm list
를 사용하십시오:
현재 ingress-nginx
가 유일하게 배포된 차트임을 알 수 있습니다:
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx default 1 2021-02-24 10:12:37.281049711 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0
클러스터 내의 서비스를 찾으려면 다음을 실행하십시오:
출력은 다음과 유사할 것입니다:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.245.211.81 46.101.68.67 80:30704/TCP,443:30700/TCP 7m19s
ingress-nginx-controller-admission ClusterIP 10.245.50.17 <none> 443/TCP 7m19s
kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 83m
이제 클러스터에 릴리스를 배포했으므로 배포된 상태에서 구성을 수정할 것입니다.
단계 4 — 릴리스 업그레이드
릴리스가 배포되면 구성을 변경해야 할 때마다 전체를 철거하고 다시 배포할 필요는 없습니다. 새 차트 버전으로 릴리스를 업그레이드하거나 새로운 설정을 지정하기 위해 helm upgrade
명령을 사용할 수 있습니다.
ingress-nginx
차트는 배포된 컨트롤러 파드 수를 제어하는 controller.replicaCount
변수를 노출합니다. 기본적으로 이 값은 하나로 설정되어 있으며, 다음을 통해 확인할 수 있습니다:
하나만 있다는 것을 확인하실 수 있을 것입니다:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m
예를 들어, 불필요한 중복성을 위해 더 많은 파드가 배포되기를 원한다면(예: 3개), 다음을 실행하여 릴리스를 upgrade
하고 변수를 3
으로 설정할 수 있습니다:
또한 --reuse-values
를 전달하여 Helm에 배포된 릴리스를 기반으로 변경 사항을 적용하고 이전 구성을 보존하도록 지시합니다.
출력에서 Helm은 릴리스가 업그레이드되었음을 나타내기 위해 리비전을 증가시킵니다:
OutputNAME: ingress-nginx
LAST DEPLOYED: Wed Feb 24 12:07:54 2021
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
...
다음을 실행하여 사용 가능한 파드를 나열할 수 있습니다:
하나 대신 세 개의 파드가 나열된 것을 확인하실 수 있습니다:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-4hk9g 1/1 Running 0 18s
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 22m
ingress-nginx-controller-7fc74cf778-wz595 1/1 Running 0 18s
다음으로 변경 사항을 롤백하고 릴리스를 완전히 삭제할 것입니다.
단계 5 — 롤백 및 릴리스 삭제
릴리스를 upgrade
하면 해당 리비전 번호가 증가합니다. 내부적으로 Helm은 릴리스의 모든 리비전을 저장하여 필요한 경우 이전 리비전으로 돌아갈 수 있게 합니다.
팟 수를 하나로 되돌리려면 helm upgrade
를 다시 실행하고 번호를 수동으로 설정할 수 있습니다. 왜냐하면 이것은 작은 변경이기 때문입니다. 그러나 많은 변수가 있는 큰 차트를 다룰 때는 수동으로 롤백하는 것이 불가능하며 자동화되어야 합니다.
릴리스를 롤백하려면 helm rollback
을 사용하세요:
이를 사용하여 변경한 사항을 롤백하여 리비전 1
로 돌아갈 수 있습니다:
다음 출력이 나타나면 작업이 성공적으로 수행되었음을 나타냅니다:
OutputRollback was a success! Happy Helming!
릴리스를 나열하여 현재 리비전을 확인할 수 있습니다:
이제 리비전이 1
이 아니라 3
임을 알 수 있습니다:
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx default 3 2021-02-24 12:43:21.523664768 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0
Helm은 롤백을 포함한 모든 변경 사항을 릴리스의 새로운 리비전으로 간주합니다. 배포된 팟 수를 확인하여 리비전 3
이 첫 번째와 같은지 확인할 수 있습니다:
이제 하나만 있는 것을 발견할 것입니다:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m
릴리스와 해당 모든 리비전을 삭제하려면 helm delete
를 사용할 수 있습니다:
필요 없어진 것으로, 다음 명령을 실행하여 ingress-nginx
를 삭제하세요:
출력은 다음과 같을 것입니다:
Outputrelease "ingress-nginx" uninstalled
리소스를 확인하여 테이블에 행이 없음을 확인할 수 있습니다:
이제 릴리스가 삭제되었으므로, 향후 배포에 해당 이름을 재사용할 수 있습니다.
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
단계 6 — (선택 사항) 사용자 정의 차트 만들기
이 선택 사항 단계에서는 사용자 정의 차트를 만드는 방법, 리소스 정의를 어디에 넣을지 및 추가 배포를 위해 패키징하는 방법을 배우게 됩니다.
example-chart
라는 새 차트를 만듭니다. 이를 만들려면 다음 명령을 실행하세요:
이 명령은 다음 파일 및 구조를 갖는 example-chart
라는 새 디렉터리를 만듭니다:
charts/
templates/
├─ tests/
│ ├─ test-connection.yaml
├─ deployment.yaml
├─ hpa.yaml
├─ ingress.yaml
├─ NOTES.txt
├─ service.yaml
├─ serviceaccount.yaml
├─ _helpers.tpl
Chart.yaml
values.yaml
대상 클러스터에 설치될 차트의 리소스 정의는 templates
디렉터리에 있습니다. Helm이 시작점으로 만든 기본 파일은 Nginx ingress 컨트롤러를 배포합니다. 파일 확장자가 YAML이지만 노출된 변수를 통해 수정 가능한 Go의 템플릿 구문을 사용하여 사용자 정의할 수 있습니다. 실행하여 service.yaml
의 내용을 표시하여 확인할 수 있습니다:
이 파일에는 중괄호로 둘러싸인 값을 생성하기 위한 템플릿 지시문이 있음을 알 수 있습니다.
참조된 변수는 사용자에게 노출되며 values.yaml
에 정의됩니다. 배포 후 Helm이 표시하는 NOTES
텍스트는 NOTES.txt
에 저장되며 템플릿화됩니다. 차트 메타데이터인 이름, 버전 및 배포되는 소프트웨어의 버전은 Chart.yaml
에 지정됩니다:
Helm이 배포할 내용을 확인하려면 차트 디렉토리를 가리키는 helm install
에 --dry-run
과 --debug
을 전달할 수 있습니다:
출력물은 깁니다. 클러스터에 적용될 최종 리소스 정의가 모두 포함됩니다. 차트를 작업하는 동안 새 버전을 Kubernetes로 푸시하려면 helm upgrade
를 사용할 수 있습니다.
완성된 차트를 공유할 시간이 되면 실행하여 배포용으로 패키지화할 수 있습니다:
출력물은 다음과 같습니다:
OutputSuccessfully packaged chart and saved it to: .../example-chart-0.1.0.tgz
패키지화된 차트는 추가된 저장소의 것과 마찬가지로 설치할 수 있습니다:
이 단계에서 사용자 정의 차트를 만들고 배포했습니다. 또한 그것을 패키지화했으며 구조에 대해 배웠습니다.
결론
이제 Helm을 사용하여 Kubernetes 클러스터에 배포된 소프트웨어를 설치하고 업그레이드하는 방법을 알게 되었습니다. 차트 저장소를 추가하고, 그 중요성과 ArtifactHub가 찾는 데 도움이 되는 이유를 배웠습니다. 또한 새로운 사용자 정의 차트를 만들고 릴리스 리비전과 필요한 경우 롤백하는 방법에 대해 배웠습니다.
사용자 정의 차트를 만드는 데 대한 자세한 정보는 공식 안내서를 방문하세요.