고급 헬름 기법

이 섹션에서는 헬름 사용에 관한 다양한 고급 기능과 기법을 설명한다. 이 섹션의 정보는 차트 및 릴리스의 고급 사용자 정의 및 조작을 수행하려는 헬름의 "숙련 사용자"를 위한 것이다. 이러한 각 고급 기능에는 고유한 장단점 및 주의사항이 있으므로, 각 기능은 헬름에 대해 충분한 지식을 가지고 신중하게 사용해야한다. 바꿔 말해서, Peter Parker 원칙을 유념하자.

포스트 렌더링

포스트 렌더링은 차트 설치 프로그램이 헬름으로 설치하기 전에 렌더링된 매니페스트를 수동으로 조작, 구성 및 유효성 검사를 할 수 있는 기능을 제공한다. 이를 통해 kustomize 같은 도구를 사용하는 고급 구성 사용자들이, 공개 차트를 포크하거나 차트 유지관리자에게 소프트웨어에 대한 모든 최종 구성옵션을 지정하도록 요구하지 않고도 구성 변경사항을 적용할 수 있도록 해준다. 또한 엔터프라이즈 환경이나 배포 전 매니페스트 분석시에 공통 도구와 사이트카를 주입하는 사용 사례도 있다.

전제 조건

  • 헬름 버전 3.1 이상

사용법

포스트 렌더러는 STDIN 에서 렌더링된 쿠버네티스 매니페스트를 받고 STDOUT 으로 유효한 쿠버네티스 매니페스트를 반환하는 실행파일이면 된다. 실패 시에는 0이 아닌 종료 코드를 반환해야 한다. 이것은 두 구성 요소 사이의 유일한 "API" 이다. 이러한 구조는 포스트 렌더 프로세스로 수행할 수 있는 작업에 유연성을 제공한다.

포스트 렌더러는 install, upgrade, template 과 함께 사용할 수 있다. 포스트 렌더러를 사용하려면 렌더러 실행파일의 경로와 함께 --post-renderer 플래그를 사용한다.

$ helm install mychart stable/wordpress --post-renderer ./path/to/executable

경로에 구분자가 없으면 $PATH 에서 검색하고, 그렇지 않으면 상대경로를 완전한 전체 경로로 풀어낸다.

여러 개의 포스트 렌더러를 사용하려면 스크립트에서 모두 호출하거나 빌드한 바이너리 도구에서 함께 호출해야 한다. bash의 경우, renderer1 | renderer2 | renderer3 와 같이 간단하게 표현할 수 있다.

kustomize 를 포스트 렌더러로 사용하는 예는 이곳에서 확인할 수 있다.

주의사항

포스트 렌더러를 사용할 때 유의해야 하는 몇 가지 중요한 사항들이 있다. 포스트 렌더러를 사용할 때 가장 중요한 것은, 해당 릴리스를 수정하는 모든 사람들이 반복 가능한 빌드를 갖기 위해서는 반드시 동일한 렌더러를 사용해야 한다는 것이다. 이 기능은 사용자가 사용 중인 렌더러를 전환하거나 렌더러 사용을 중지할 수 있게 하려고 만들어졌지만 우발적인 수정이나 데이터 손실을 방지하기 위해서는 신중하게 수행해야 한다.

또 다른 중요한 사항은 보안에 관한 것이다. 포스트 렌더러를 사용하는 경우 다른 임의의 실행 파일의 경우와 마찬가지로 신뢰할 수 있는 소스에서 가져온 것인지 확인해야 한다. 신뢰할 수 없거나 확인되지 않은 렌더러를 사용하는 것은 종종 시크릿 데이터를 포함하는 렌더링 된 템플릿에 대한 전체 접근 권한을 갖게 되므로 권장되지 않는다.

사용자 정의 포스트 렌더러

포스트 렌더러 단계는 Go SDK에서 사용할 때 훨씬 더 많은 유연성을 제공한다. 모든 포스트 렌더러는 다음 Go 인터페이스만 구현하면 된다.

type PostRenderer interface {
    // Run 함수는 헬름 렌더링 매니페스트로 채워진 단일 버퍼가 필요하다. 
    // 수정된 결과가 별도의 버퍼에 반환되거나 포스트 렌더링 단계를 실행하는 
    // 동안 이슈나 실패가 발생한 경우 오류가 반환된다.
    Run(renderedManifests *bytes.Buffer) (modifiedManifests *bytes.Buffer, err error)
}

Go SDK 사용에 대한 자세한 내용은 Go SDK 섹션를 참조하자.

Go SDK

헬름 3는 헬름을 활용하는 소프트웨어 및 도구를 빌드할 때 더 나은 경험을 제공하기 위해 완전 재구성된 Go SDK를 선보였다. 전체 문서는 https://pkg.go.dev/helm.sh/helm/v3에서 찾을 수 있지만 가장 일반적인 패키지 중 일부와 간단한 예제는 다음과 같다.

패키지 개요

다음은 가장 널리 사용되는 패키지들의 목록과 그에 관한 간단한 설명이다.

  • pkg/action: 헬름 작업을 수행하기 위한 기본 "클라이언트"를 포함해야 한다. 이것은 CLI가 내부적으로 사용하는 것과 동일한 패키지이다. 다른 Go 프로그램에서 기본 헬름 명령어만 수행하고자 하는 경우 이 패키지가 적합하다.
  • pkg/{chart,chartutil}: 차트를 로드하고 조작하는데 사용되는 메서드 및 헬퍼이다.
  • pkg/cli 및 해당 하위 패키지: 표준 헬름 환경 변수에 대한 모든 핸들러를 포함하고 하위 패키지에는 출력 및 값 파일 처리를 포함한다.
  • pkg/release: Release 오브젝트 및 상태를 정의한다.

이 외에도 더 많은 패키지가 있으므로, 자세한 내용은 설명서를 확인하자!

간단한 예

다음은 Go SDK를 사용하여 helm list 를 수행하는 간단한 예이다.

package main

import (
    "log"
    "os"

    "helm.sh/helm/v3/pkg/action"
    "helm.sh/helm/v3/pkg/cli"
)

func main() {
    settings := cli.New()

    actionConfig := new(action.Configuration)
    // You can pass an empty string instead of settings.Namespace() to list
    // all namespaces
    if err := actionConfig.Init(settings.RESTClientGetter(), settings.Namespace(), os.Getenv("HELM_DRIVER"), log.Printf); err != nil {
        log.Printf("%+v", err)
        os.Exit(1)
    }

    client := action.NewList(actionConfig)
    // Only list deployed
    client.Deployed = true
    results, err := client.Run()
    if err != nil {
        log.Printf("%+v", err)
        os.Exit(1)
    }

    for _, rel := range results {
        log.Printf("%+v", rel)
    }
}

스토리지 백엔드

헬름 3는 기본 릴리스 정보 저장소를 릴리스의 네임스페이스에서 시크릿으로 변경하였다. 헬름 2는 기본적으로 릴리스 정보를 틸러(Tiller) 인스턴스 네임스페이스의 컨피그맵으로 저장한다. 다음 하위 섹션에서는 다양한 백엔드를 구성하는 방법을 보여준다. 이 구성은 HELM_DRIVER 환경 변수를 기반으로 한다. 값은 [configmap, secret, sql] 중 하나로 설정될 수 있다.

컨피그맵 스토리지 백엔드

컨피그맵 백엔드를 활성화 하려면 환경 변수를 HELM_DRIVER 에서 configmap 로 설정해야 한다.

다음과 같이 셸에서 설정할 수 있다.

export HELM_DRIVER=configmap

기본 백엔드에서 컨피그맵 백엔드로 전환하려면 직접 마이그레이션을 수행해야 한다. 다음 명령어를 사용하여 릴리스 정보를 검색할 수 있다.

kubectl get secret --all-namespaces -l "owner=helm"

운영 참고사항: 출시 정보에는 무단 접근으로부터 보호해야 하는 민감한 데이터(예: 비밀번호, 개인키 및 기타 자격증명)가 포함될 수 있다. 예를 들어 RBAC을 사용하여 쿠버네티스 인증을 관리할 때 컨피그맵 리소스에 대한 광범위한 접근 권한을 부여하는 동시에 시크릿 리소스에 대한 접근을 제한할 수 있다. 예를 들어 기본 사용자 대면 역할 보기 권한은 대부분의 리소스에 접근 권한을 부여하지만, 보안 시크릿에는 부여하지 않는다. 또한 암호화 된 저장소에 대해 시크릿 데이터를 구성할 수 있다. 컨피그맵 백엔드로 전환하기로 결정한 경우 애플리케이션의 민감한 데이터가 노출될 수 있으므로 유의해야 한다.

SQL 스토리지 백엔드

SQL 데이터베이스에 릴리스 정보를 저장하는 베타 SQL 스토리지 백엔드가 있다.

이러한 스토리지 백엔드는 릴리스 정보의 무게가 1MB를 초과하는 경우에 사용하면 특히 유용하다. (이 경우 쿠버네티스의 기본 etcd 키-값 저장소의 내부 제한으로 인해 컨피그맵/시크릿에 저장할 수 없다.)

SQL 백엔드를 활성화하려면 SQL 데이터베이스를 배포하고 환경변수 HELM_DRIVER 에서 sql 로 설정해야 한다. DB 세부 정보는 환경변수 HELM_DRIVER_SQL_CONNECTION_STRING 으로 설정된다.

다음과 같이 셸에서 설정할 수 있다.

export HELM_DRIVER=sql
export HELM_DRIVER_SQL_CONNECTION_STRING=postgresql://helm-postgres:5432/helm?user=helm&password=changeme

참고: 현재 PostgreSQL 만 지원된다.

운영 참고사항: 다음을 권장한다.

  • 운영 데이터베이스를 준비하자. PostgreSQL에 대한 자세한 내용은 서버 관리 문서를 참조하자.
  • 릴리스 정보를 위해 쿠버네티스 RBAC를 미러링하도록 권한 관리를 활성화하자.

기본 백엔드에서 SQL 백엔드로 전환하려면 직접 마이그레이션을 수행해야 한다. 다음 명령어를 통해 릴리스 정보를 검색할 수 있다.

kubectl get secret --all-namespaces -l "owner=helm"