튜토리얼: Getter 플러그인 만들기
시스템 정보를 표시하는 helm system-info 명령어를 만들어봅시다.
서브프로세스 런타임
서브프로세스 런타임을 사용하여 Getter 플러그인을 만들어봅시다.
사전 요구 사항
- 최신 헬름4 릴리즈를 설치하세요: v4.0.0
- 터미널 세션에서 다운로드한 릴리즈에 관해서
helm을 별칭으로 설정하세요. 이제helm version --short를 실행하면 해당 터미널 세션에서 올바른 Helm 버전이 표시됩니다.
1. 플러그인 디렉터리 생성
파일 시스템의 어디에서나 생성할 수 있습니다. 예를 들어:
mkdir -p $HOME/code/helm/plugins/demo-getter
cd $HOME/code/helm/plugins/demo-getter
2. 플러그인 매니페스트 생성
apiVersion: v1
type: getter/v1
name: demo-getter
version: 0.1.0
runtime: subprocess
config:
protocols: ["demo"]
runtimeConfig:
protocolCommands:
- protocols:
- demo
platformCommand:
- command: get-demo.sh
3. 스크립트 생성
Getter 플러그인은 패키지된 아티팩트(이 경우 차트)를 가져오거나 다운로드하고, 다운로드된 패키지의 경로를 반환하는 역할을 합니다. 데모 목적으로 시스템 유틸리티를 사용하여 임시 디렉터리를 만들고(시간이 지나면 자동으로 정리됩니다), helm create와 helm package 명령어로 임시 디렉터리에 데모 차트 패키지를 생성한 후 패키지 경로를 반환해봅시다:
#!/usr/bin/env sh
set -e
URI=$@
TMPDIR="$(mktemp -d)"
# make a fake chart for testing with the passed URL basename
FILENAME=$(basename -- $URI)
helm create $TMPDIR/$FILENAME 1>/dev/null
helm package $TMPDIR/$FILENAME -d $TMPDIR 1>/dev/null
# cat $FILENAME-0.1.0.tgz
# just to not need to know the chart version
rm -r $TMPDIR/$FILENAME 1>/dev/null
cat $TMPDIR/$FILENAME-*
실행 가능하도록 설정합니다:
chmod +x get-demo.sh
4. 개발 모드로 설치 및 테스트
파일 시스템에서 플러그인을 설치하면 로컬 개발 모드로 설치됩니다. 이 경우 출처 확인 및 검증을 건너뜁니다:
% helm plugin install $HOME/code/helm/plugins/demo-getter
Installing plugin from local directory (development mode)
Installed plugin: demo-getter
CLI 플러그인 튜토리얼에서 살펴봤듯이, 로컬 개발 모드 설치는 플러그인 소스 디렉터리에서 플러그인 디렉터리로 심볼릭 링크를 생성합니다. 이제 두 개의 플러그인이 설치되었습니다:
% ls -lah $(helm env HELM_PLUGINS)
total 0
drwxr-xr-x@ 4 r6by staff 160B Nov 10 04:04 .
drwxr-xr-x@ 3 r6by staff 96B Jan 21 2025 ..
lrwxr-xr-x 1 r6by staff 41B Nov 10 04:04 demo-getter -> /Users/r6by/code/helm/plugins/demo-getter
lrwxr-xr-x 1 r6by staff 41B Nov 10 02:18 system-info -> /Users/r6by/code/helm/plugins/system-info
CLI 플러그인 튜토리얼과 달리 이 플러그인은 helm help의 사용 가능한 명령어 목록에 표시되지 않습니다. CLI 플러그인 유형만 helm CLI 서브커맨드 목록에 나타납니다.
하지만 모든 플러그인 유형과 마찬가지로, helm plugin list에서 설치된 포스트 렌더러 플러그인 세부 정보를 확인할 수 있습니다:
% helm plugin list
NAME VERSION TYPE APIVERSION PROVENANCE SOURCE
demo-getter 0.1.0 getter/v1 v1 local dev unknown
system-info 0.1.0 cli/v1 v1 local dev unknown
실행해봅시다. "example"이라는 이름의 차트에 대한 템플릿 YAML이 반환되어야 합니다:
% helm template example demo://does-not-matter/example
LOTS OF YAML, INCLUDING:
---
# Source: example/templates/tests/test-connection.yaml
만들어냈습니다. 서브프로세스 런타임을 사용하는 데모 Getter 플러그인을!
다음으로는 WASM 런타임으로 버전을 만들어봅시다...
Wasm 런타임
사전 요구 사항
- 서브프로세스 런타임의 사전 요구 사항
- Go 1.25 설치
demo:// URL을 https://로 변환하는 커스텀 프로토콜 getter를 만들어봅시다.
1. 저장소 설정
템플릿에서 새 저장소를 스캐폴드하거나 클론하세요: https://github.com/gjenkins8/helm-extism-plugin-template
2. 플러그인 매니페스트 업데이트
서브프로세스 Getter의 동일한 단계와 거진 유사합니다. 클론한 Git 저장소에서 진행한다는 점만 제외하고 말이죠.
Wasm의 경우 runtime과 runtimeConfig 필드 값이 변경됩니다:
apiVersion: v1
type: getter/v1
name: demo-getter
version: 0.1.0
runtime: extism/v1
config:
protocols: ["demo"]
runtimeConfig:
memory:
maxPages: 16
timeout: 30000
3. main.go 업데이트
플러그인의 입출력 메시지를 지정합니다:
package main
...
type InputMessage struct {
URL string `json:"url"`
Protocol string `json:"protocol"`
}
type OutputMessage struct {
Data []byte `json:"data"`
}
replaceMeImplementationGoesHere 함수를 실제 로직으로 교체합니다:
...
// Delete the `replaceMeImplementationGoesHere` function
func demoDownloader(input InputMessage) (*OutputMessage, error) {
// Convert demo:// to https://
downloadURL := strings.Replace(input.URL, "demo://", "https://", 1)
pdk.Log(pdk.LogLevelInfo, fmt.Sprintf("Converted %s to %s", input.URL, downloadURL))
// Download content
resp, err := http.Get(downloadURL)
if err != nil {
return nil, fmt.Errorf("failed to download: %w", err)
}
defer resp.Body.Close()
// Read and output content
data, _ := io.ReadAll(resp.Body)
output := OutputMessage{Data: data}
return &output, nil
}
demoDownloader를 호출하도록 runPlugin 함수를 업데이트합니다:
func runPlugin() error {
...
// Remove: output, err := replaceMeImplementationGoesHere(input)
output, err := demoDownloader(input)
4. WebAssembly 빌드
$ make build
$ ls -la plugin.wasm
5. 개발 모드로 설치 및 테스트
서브프로세스 CLI 플러그인 단계와 동일합니다.
만들어냈습니다. Extism PDK를 통한 샌드박스 실행과 구조화된 통신을 갖춘 WebAssembly 플러그인!