헬름 3 패키지 관리자를 사용하여 Kubernetes 클러스터에 소프트웨어 설치하는 방법

소개

Helm은 Kubernetes용 패키지 관리자로, 개발자와 운영자가 Kubernetes 클러스터에 애플리케이션을 더 쉽게 구성하고 배포할 수 있도록 합니다.

Helm 패키지는 차트(charts)라고 불리며, 사용자의 노력을 최소화하면서 주어진 앱을 배포하고 구성하는 리소스 정의의 템플릿을 포함합니다. 템플릿을 사용하면 실제 차트를 수정하지 않고도 차트와 해당 설정 및 동작을 변수 정의를 통해 관리할 수 있습니다. 사용자 정의 리소스 정의 및 이미 배포된 정의의 수정은 Helm이 자동으로 관리합니다. 가능한 사용자 정의가 적용된 배포된 차트를 릴리스(release)라고 합니다.

이 튜토리얼에서는 Helm 3를 설정하고 차트 및 릴리스를 설치, 업그레이드, 롤백 및 관리하는 방법을 배우게 됩니다. 또한 자체 차트를 만들고 패키지화하고, 바로 설치할 수 있는 차트를 호스팅하는 차트 저장소를 설정하는 방법도 배우게 됩니다.

전제 조건

  • Role-Based Access Control (RBAC)이 활성화된 Kubernetes 클러스터. 릴리스에 대한 자세한 정보는 Helm 릴리스 페이지를 확인하십시오.

  • 로컬 머신에 설치된 kubectl 명령줄 도구가 클러스터에 연결되도록 구성되어 있습니다. 공식 문서에서 kubectl 설치에 대해 더 알아보세요.

    다음 명령을 사용하여 연결을 테스트할 수 있습니다:

    1. kubectl cluster-info

    오류가 없으면 클러스터에 연결된 것입니다. kubectl을 사용하여 여러 클러스터에 액세스하는 경우 다음을 실행하여 올바른 클러스터 컨텍스트를 확인하세요:

    1. kubectl config get-contexts

    출력에서 사용 가능한 구성이 나열됩니다:

    출력
    CURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin

    여기서 별표 (*)는 do-fra1-helm3-example 클러스터에 연결되어 있음을 나타냅니다. 클러스터를 전환하려면 다음을 실행하세요:

    1. kubectl config use-context 컨텍스트 이름

올바른 클러스터에 연결된 경우 Helm을 설치하려면 단계 1로 계속 진행하세요.

단계 1 — Helm 3 설치

이 섹션에서는 공식으로 제공되는 셸 스크립트를 사용하여 Helm 3를 설치합니다.

먼저 다음 명령을 사용하여 설치 스크립트를 저장할 /tmp으로 이동합니다:

  1. cd /tmp

다음 명령을 사용하여 스크립트를 다운로드합니다:

  1. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

get_helm.sh를 텍스트 편집기에서 확인하여 안전한지 확인할 수 있습니다.

다음 권한을 설정하여 실행 가능하게 만듭니다:

  1. chmod u+x get_helm.sh

마침내 Helm 3를 설치하려면 다음을 실행하십시오:

  1. ./get_helm.sh

다음과 유사한 출력을 받게됩니다:

Output
Downloading 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 버튼을 눌러 필요한 명령어를 얻을 수 있습니다.

첫 번째 명령어를 복사하려면 명령어 옆의 파란색 버튼을 클릭하세요. 그런 다음 해당 명령어를 실행하세요:

  1. helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

Helm에 저장소를 추가하려면 helm repo add를 실행합니다. 이 명령은 저장소의 이름과 위치를 인자로 받습니다.

다음과 같은 출력이 표시됩니다:

Output
"ingress-nginx" has been added to your repositories

새 저장소를 추가하면 해당 저장소가 포함하는 내용을 Helm에 알려줘야 합니다. 이를 위해 다음 명령을 실행합니다:

  1. helm repo update

다음과 같은 출력이 표시되어 업데이트가 성공적으로 수행되었음을 확인할 수 있습니다:

Output
Hang 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 파일에 저장됩니다. 차트를 로컬 머신에 다운로드하지 않은 경우 다음 명령을 실행하여 확인할 수 있습니다:

  1. helm show values chart_name

ingress-nginx에 대한 사용 가능한 변수를 표시하려면 chart_name을(를) 다음으로 대체하십시오:

  1. helm show values ingress-nginx/ingress-nginx

출력은 ingress-nginxvalues.yaml 내용을 길게 표시합니다.

차트를 설치하려면 helm install을 사용할 수 있습니다:

  1. helm install release_name repository/chart_name

A release is a deployed instance of the chart, and here you’re calling it ingress-nginx.

이 명령은 기본 변수 값으로 차트를 클러스터에 설치합니다. 일부를 수정하려면 새 변수 값을 --set을 사용하여 전달할 수 있습니다:

  1. helm install ingress-nginx/ingress-nginx --set variable_name=variable_value

필요한 만큼 변수를 반복하여 --set을 사용할 수 있습니다. 지금 사용자 정의하지 않을 것이므로 다음을 실행하여 설치합니다:

  1. helm install ingress-nginx ingress-nginx/ingress-nginx

출력은 다음과 유사할 것입니다:

Output
NAME: 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를 사용하십시오:

  1. helm list

현재 ingress-nginx가 유일하게 배포된 차트임을 알 수 있습니다:

Output
NAME 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

클러스터 내의 서비스를 찾으려면 다음을 실행하십시오:

  1. kubectl get services

출력은 다음과 유사할 것입니다:

Output
NAME 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 변수를 노출합니다. 기본적으로 이 값은 하나로 설정되어 있으며, 다음을 통해 확인할 수 있습니다:

  1. kubectl get pods

하나만 있다는 것을 확인하실 수 있을 것입니다:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m

예를 들어, 불필요한 중복성을 위해 더 많은 파드가 배포되기를 원한다면(예: 3개), 다음을 실행하여 릴리스를 upgrade하고 변수를 3으로 설정할 수 있습니다:

  1. helm upgrade ingress-nginx ingress-nginx/ingress-nginx --set controller.replicaCount=3 --reuse-values

또한 --reuse-values를 전달하여 Helm에 배포된 릴리스를 기반으로 변경 사항을 적용하고 이전 구성을 보존하도록 지시합니다.

출력에서 Helm은 릴리스가 업그레이드되었음을 나타내기 위해 리비전을 증가시킵니다:

Output
NAME: ingress-nginx LAST DEPLOYED: Wed Feb 24 12:07:54 2021 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None NOTES: ...

다음을 실행하여 사용 가능한 파드를 나열할 수 있습니다:

  1. kubectl get pods

하나 대신 세 개의 파드가 나열된 것을 확인하실 수 있습니다:

Output
NAME 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. helm rollback release_name release_revision

이를 사용하여 변경한 사항을 롤백하여 리비전 1로 돌아갈 수 있습니다:

  1. helm rollback ingress-nginx 1

다음 출력이 나타나면 작업이 성공적으로 수행되었음을 나타냅니다:

Output
Rollback was a success! Happy Helming!

릴리스를 나열하여 현재 리비전을 확인할 수 있습니다:

  1. helm list

이제 리비전이 1이 아니라 3임을 알 수 있습니다:

Output
NAME 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이 첫 번째와 같은지 확인할 수 있습니다:

  1. kubectl get pods

이제 하나만 있는 것을 발견할 것입니다:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m

릴리스와 해당 모든 리비전을 삭제하려면 helm delete를 사용할 수 있습니다:

  1. helm delete release_name

필요 없어진 것으로, 다음 명령을 실행하여 ingress-nginx를 삭제하세요:

  1. helm delete ingress-nginx

출력은 다음과 같을 것입니다:

Output
release "ingress-nginx" uninstalled

리소스를 확인하여 테이블에 행이 없음을 확인할 수 있습니다:

  1. helm list

이제 릴리스가 삭제되었으므로, 향후 배포에 해당 이름을 재사용할 수 있습니다.

Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION

단계 6 — (선택 사항) 사용자 정의 차트 만들기

이 선택 사항 단계에서는 사용자 정의 차트를 만드는 방법, 리소스 정의를 어디에 넣을지 및 추가 배포를 위해 패키징하는 방법을 배우게 됩니다.

example-chart라는 새 차트를 만듭니다. 이를 만들려면 다음 명령을 실행하세요:

  1. helm create example-chart

이 명령은 다음 파일 및 구조를 갖는 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의 내용을 표시하여 확인할 수 있습니다:

  1. cat example-chart/templates/service.yaml

이 파일에는 중괄호로 둘러싸인 값을 생성하기 위한 템플릿 지시문이 있음을 알 수 있습니다.

Output
apiVersion
: v1 kind: Service metadata: name: {{ include "mychart.fullname" . }} labels: {{- include "mychart.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http selector: {{- include "mychart.selectorLabels" . | nindent 4 }}

참조된 변수는 사용자에게 노출되며 values.yaml에 정의됩니다. 배포 후 Helm이 표시하는 NOTES 텍스트는 NOTES.txt에 저장되며 템플릿화됩니다. 차트 메타데이터인 이름, 버전 및 배포되는 소프트웨어의 버전은 Chart.yaml에 지정됩니다:

example-chart/Chart.yaml
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes

...
type: application

...
version: 0.1.0

...
appVersion: "1.16.0"

Helm이 배포할 내용을 확인하려면 차트 디렉토리를 가리키는 helm install--dry-run--debug을 전달할 수 있습니다:

  1. helm install example-chart --dry-run --debug ./example-chart

출력물은 깁니다. 클러스터에 적용될 최종 리소스 정의가 모두 포함됩니다. 차트를 작업하는 동안 새 버전을 Kubernetes로 푸시하려면 helm upgrade를 사용할 수 있습니다.

완성된 차트를 공유할 시간이 되면 실행하여 배포용으로 패키지화할 수 있습니다:

  1. helm package ./example-chart

출력물은 다음과 같습니다:

Output
Successfully packaged chart and saved it to: .../example-chart-0.1.0.tgz

패키지화된 차트는 추가된 저장소의 것과 마찬가지로 설치할 수 있습니다:

  1. helm install example-chart example-chart-0.1.0.tgz

이 단계에서 사용자 정의 차트를 만들고 배포했습니다. 또한 그것을 패키지화했으며 구조에 대해 배웠습니다.

결론

이제 Helm을 사용하여 Kubernetes 클러스터에 배포된 소프트웨어를 설치하고 업그레이드하는 방법을 알게 되었습니다. 차트 저장소를 추가하고, 그 중요성과 ArtifactHub가 찾는 데 도움이 되는 이유를 배웠습니다. 또한 새로운 사용자 정의 차트를 만들고 릴리스 리비전과 필요한 경우 롤백하는 방법에 대해 배웠습니다.

사용자 정의 차트를 만드는 데 대한 자세한 정보는 공식 안내서를 방문하세요.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-software-on-kubernetes-clusters-with-the-helm-3-package-manager