ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스/도커 - Helm(헬름)
    STUDY/Docker 2023. 6. 12. 00:07

     

    Helm(헬름)이란?

    쿠버네티스에서 패키지를 손쉽게 배포할 수 있도록 패키지를 관리하는 쿠버네티스 전용 패키지 매니저이다. 패키지 매니저는 외부에 있는 저장소에서 패키지 정보를 받아와 패키지를 안정적으로 관리하는 도구로, 설치에 필요한 의존성 파일들을 관리하고 간편하게 설치할 수 있도록 도와주는 것이다.

     

    패키지 매니저의 기능

    • 패키지 검색 : 설정한 저장소에서 패키지를 검색하는 기능을 제공한다.
    • 패키지 관리 : 저장소에서 패키지 정보를 확인하고, 사용자 시스템에 패키지 설치, 삭제, 업그레이드, 되돌리기 등을 할 수 있다.
    • 패키지 의존성 관리 : 패키지를 설치할 때 의존하는 소프트웨어를 같이 설치하고, 삭제할 때 같이 삭제할 수 있다.
    • 패키지 보안 관리 : 디지털 인증서와 패키지에 고유하게 발행되는 체크섬(Checksum)이라는 값으로 해당 패키지의 소프트웨어나 의존성이 변조됐는지 검사할 수 있다.

     

    헬름을 사용하면 요구 조건별로 리소스를 편집하거나 변수를 넘겨서 처리하는 패키지를 만들 수 있다. 다양한 요구 조건을 처리할 수 있는 패키지를 차트(chart)라고 하는데, 헬름 저장소(기본 저장소, 아티팩트허브[artifacthub.io])를 통해 공유할 수 있다.

     

    또한, 배포한 애플리케이션을 업그레이드하거나 되돌릴 수 있는 기능과 삭제할 수 있는 기능을 제공한다.

     

    이처럼 헬름을 이용하면 하나의 패키지로 다양한 사용자가 원하는 각자의 환경을 구성할 수 있으며, 이를 자유롭게 배포, 관리, 삭제할 수 있다.

     

     

    헬름의 전반적인 흐름

     

    생산자 영역

    • 사용자가 헬름 명령으로 작업 공간을 생성하면 templates 디렉터리로 애플리케이션 배포에 필요한 여러 yaml 파일과 구성 파일을 작성할 수 있다.
    • templates 디렉터리에서 조건별 분기, 값 전달 등을 처리할 수 있도록 values.yaml에 설정된 키를 사용한다. 
    • 필요한 패키지의 여러 분기 처리나 배포에 대한 구성이 완료되면, 생산자는 차트의 이름, 목적, 배포되는 애플리케이션 버전과 같은 패키지 정보를  Charts.yaml에 작성한다.
    • 차트 구성이 완료되면 생산자가 생산자 저장소에 업로드하고, 업로드한 생산자 저장소를 아티팩트허브에 등록할 수 있다.

     

    아티팩트허브 영역

    • 아티팩트허브 검색을 통해 사용자가 찾고자 하는 애플리케이션 패키지를 검색하면 해당 패키지가 저장된 주소를 확인하고, 확인한 주소는 각 애플리케이션을 개발하는 주체가 관리한다.

     

    사용자 영역

    • 사용자는 설치하려는 애플리케이션의 차트 저장소 주소를 아티팩트허브에서 얻으면 헬름을 통해서 주소를 등록한다.
    • 그리고 이를 최신으로 업데이트한 이후에 차트를 내려받고 설치한다. 이렇게 헬름을 통해 쿠버네티스에서 설치된 애플리케이션 패키지를 릴리스(Release)라고 한다.
    • 헬름을 통해 배포된 릴리스를 다시 차트를 사용해 업그레이드할 수 있고 원래대로 되돌리거나, 제거할 수 있다.

     

    헬름을 사용하는 이유

    yaml은 정적 파일이기 때문에 리소스별로  yaml 파일을 만들어야 하는데, 만약 많은 리소스를 관리하게 되는 경우가 발생하면 yaml 파일에 대한 유지보수가 힘들어진다. 이때 사용하는 것이 하나의 Template을 통해 yaml 파일을 동적으로 생성하게 해주는 Helm이다,

     

    기존 yaml 파일 배포 방식

     

    Helm을 사용한 yaml 파일 배포방식

     

     

    헬름 구조

    기존 Helm v2에서는 clinet가 gRPC를 사용하여 Tiller에게 명령을 전달하고, Tiller가 해당 명령을 수신하여 API 서버와 상호 작용하여 처리했다면, Helm v3에서는 Tiller가 제거되고 client가 직접 API 서버와 통신하는 것으로 변경됐다. 

     

     

    헬름 특징

    • 복잡성 관리 

    차트는 매우 복잡한 애플리케이션도 표현하고, 반복적인 애플리케이션 설치를 제공하며, 단일 권한으로 서비스할 수 있다.

     

    • 쉬운 업데이트

    즉시(in-place) 업그레이드와 커스텀 훅을 통해 업데이트하는 수고를 줄여줄 수 있다.

     

    • 간단한 공유

    차트는 버전 관리, 공유, 퍼블릭이나 프라이빗 서버 호스팅이 편리하다.

     

    • 롤백

    helm rollback을 사용하여 릴리스를 예전 버전으로 간편하게 되돌릴 수 있다.

     

     

    주요 개념

    • 차트는 헬름 패키지로, 쿠버네티스 클러스터 내에서 애플리케이션, 도구, 서비스를 구동하는데 필요한 모든 리소스 정의가 포함되어 있다.
    • helm repository는 차트를 모아두고 공유하는 저장소이다.
    • 릴리스(Release)는 쿠버네티스 클러스터에서 구동되는 차트의 인스턴스이다. 일반적으로 하나의 차트는 동일한 클러스터내에서 여러번 설치될 수 있다.

     

    즉, 헬름은 쿠버네티스 내부에 charts를 사용하여 릴리즈 인스턴스를 생성한다. 새로운 차트를 찾기 위해서는 helm chart repository를 검색할 수 있다.

     

     

    Helm Chart 구조

    wordpress/
      Chart.yaml          # 차트에 대한 정보를 가진 YAML 파일
      LICENSE             # 옵션: 차트의 라이센스 정보를 가진 텍스트 파일
      README.md           # 옵션: README 파일
      values.yaml         # 차트에 대한 기본 환경설정 값들
      values.schema.json  # 옵션: values.yaml 파일의 구조를 제약하는 JSON 파일
      charts/             # 이 차트에 종속된 차트들을 포함하는 디렉터리
      crds/               # 커스텀 자원에 대한 정의
      templates/          # values와 결합될 때, 유효한 쿠버네티스 manifest 파일들이 생성될 템플릿들의 디렉터리
      templates/NOTES.txt # 옵션: 간단한 사용법을 포함하는 텍스트 파일

     


    실습1 - templates/, Chart.yaml

     

    1. templates/ 생성

    templates/ 디렉토리는 템플릿 파일을 위한 것으로, 헬름이 차트를 평가할 때, templates/ 디렉토리의 모든 파일을 템플릿 렌더링 엔진으로 전달한다. 그리고 나서 처리 결과를 모아 쿠버네티스로 보낸다.

     

     

    templates/ 디렉토리 하위에 yaml 파일(deployment, service 등)을 생성한다.

     

    # deployment.yaml
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-test
      labels:
        app: nginx-test
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx-test
      template:
        metadata:
          labels:
            app: nginx-test
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
    
    
    --------------------------------
    
    # service.yaml
    
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-test
    spec:
      selector:
        app: nginx-test
      ports:
      - port: 80
        targetPort: 80
      type: NodePort

     

    2. Chart.yaml 생성

    chart.yaml 파일은 차트에 대한 설명을 포함한다. 템플릿 안에서 접근할 수 있다. (https://helm.sh/ko/docs/topics/charts/)

    # 필수 필드
    
    apiVersion: 차트 API 버전 (필수)
    name: 차트명 (필수)
    version: SemVer 2 버전 (필수)
    apiVersion: v2
    name: test-chart
    description: A Helm chart for Kubernetes
    type: application
    version: 0.1.0
    appVersion: "1.16.0"

     

    3. values.yaml 생성(이번 실습에서는 touch로 파일만 생성해줌)

    values.yaml 파일은 차트의 기본값을 포함한다. 이 값들은 helm install 또는 helm upgrade 하는 중에 사용자가 재정의할 수 있다.

     

     

     

    4. Helm 차트 설치

    $ helm install <release 이름> <차트 위치>

     

    5. Helm release 삭제

    $ helm delete <release 이름>

     


    실습2 - values.yaml

     

    1. deployment.yaml 파일 수정

    # nginx 이미지를 동적으로 설정할 수 있도록 수정
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-test
      labels:
        app: nginx-test
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx-test
      template:
        metadata:
          labels:
            app: nginx-test
        spec:
          containers:
          - name: nginx
            image: {{ .Values.image }}
            ports:
            - containerPort: 80

     

    2. values.yaml 작성

    image: nginx:stable


    지금까지 실습에는 문제가 존재한다. 바로 yaml 파일의 metadata name이 고정되어 있는건데, 고정된 값으로 설정되어 있으면 release를 1개만 생성할 수 있다. 이미 release가 존재하는 상태에서 추가로 생성하려고 하면 오류가 발생한다.

     

    이를 해결하기 위해서 Release template 문법을 사용할 수 있다.


    실습3 - Release template 문법

     

    1. Release Object 사용

    # deployment.yaml
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: {{ .Release.Name }}
      labels:
        app: {{ .Release.Name }}
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx-test
      template:
        metadata:
          labels:
            app: nginx-test
        spec:
          containers:
          - name: nginx
            image: {{ .Values.image }}
            ports:
            - containerPort: 80
    # service.yaml
    
    apiVersion: v1
    kind: Service
    metadata:
      name: {{ .Release.Name }}
    spec:
      selector:
        app: {{ .Release.Name }}
      ports:
      - port: 80
        targetPort: 80
      type: NodePort

     

    Release.Name을 사용하도록 설정했기 때문에, deployment, service, pods의 name이 Release.Name과 동일하거나 해당 이름으로 시작하는 것을 확인할 수 있다,

     

     

    또한, 이전에 실습했던 예제와 다르게 여러 개의 Release를 생성할 수 있는 것도 확인할 수 있다.

     


    실습4 - Namespace

     

    1. Namespace 설정

    특정 Namespace에 템플릿을 배포할 수 있다. 단, namespace는 생성되어 있어야 하고, Release.namespace를 설정해야 한다.

    # 이미 존재하는 네임스페이스를 사용하는 경우
    $ helm install --namespace <namespace> <release 이름>
    
    # 네임스페이스가 없을 경우
    $ helm install --create-namespace --namespace <namespace> <release 이름>
    # deployment.yaml
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: {{ .Release.Name }}
      namespace: {{ .Release.Namespace }}
      labels:
        app: {{ .Release.Name }}
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx-test
      template:
        metadata:
          labels:
            app: nginx-test
        spec:
          containers:
          - name: nginx
            image: {{ .Values.image }}
            ports:
            - containerPort: 80

     

     

     

    네임스페이스를 지정해서 release를 생성한 경우 조회할 때도 네임스페이스를 지정해줘야 한다.(네임스페이스 지정 없이 조회할 경우 default 네임스페이스로 조회되는 것과 동일)

    $ helm list -n <namespace>
    
    # 모든 네임스페이스에 있는 helm list 를 조회할 경우
    $ helm list -A

    실습5 - values.yaml override

     

    1. values.yaml override

    helm 차트의 기존 values.yaml 파일의 일부 값을 변경하고 싶은 경우 사용하는 방법

     

    • --set 인자 사용
    $ helm install --set image=nginx:latest <release 이름> <차트 위치>

     

    • 새로운 파일에 교체할 필드와 값을 설정
    $ helm install -f <파일 경로> <release 이름> <차트 위치>
    # override_values.yaml
    
    image: nginx:latest


    실습6 - release upgrade/rollback

     

    1. helm release upgrade

    기존에 배포된 helm release 내용을 변경(ex: 템플릿, values.yaml)

     

    • values.yaml 파일을 --set 인자를 통해 override 한 경우
    $ helm upgrade --set image=nginx:1.24.0 -n test test1 .

     

    • template을 변경한 경우
    # deployment.yaml 파일에 env 추가
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: {{ .Release.Name }}
      namespace: {{ .Release.Namespace }}
      labels:
        app: {{ .Release.Name }}
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx-test
      template:
        metadata:
          labels:
            app: nginx-test
        spec:
          containers:
          - name: nginx
            image: {{ .Values.image }}
            ports:
            - containerPort: 80
            env:
            -  name: hello
               value: world

     

    기존 설정

     

    helm 업그레이드 후

     

     

    주의사항

    Helm upgrade 하면 정책에 따라 pod가 재기동된다,(ex: rollingupdate...)

     

    2. Helm releade 롤백

    $ helm rollback <release 이름> [REVISION] [flages]

     

    REVISION 1로 롤백했을 때, REVISION이 1로 변경되는 것이 아니라 기존 REVISION에서 +1 된 값으로 변경된다. 롤백을 확인하려면 helm history 명령어를 사용해야 한다.

    $ helm history -n test test1

     


     

     

    참고

    https://www.youtube.com/watch?v=ajcyC_6velc

    https://www.youtube.com/watch?v=m7iZtjeIHJw

     

     

Designed by Tistory.