OCI 기반 레지스트리 사용
OCI 기반 레지스트리 사용
주의: warning이 페이지는 아직 Helm 4용으로 갱신되지 않았어요. 일부 내용은 Helm 4에 정확하지 않거나 적용되지 않을 수 있어요. Helm 4의 새 기능·개선·변경점에 대한 자세한 내용은 Helm 4 개요를 참고하세요.
차트 패키지를 저장하고 공유하려면 OCI를 지원하는 컨테이너 레지스트리를 사용하는 것을 권장해요.
출처: 문서
본문
OCI 기반 레지스트리 사용
OCI 기반 레지스트리의 Helm 저장소
Helm 저장소는 패키징된 Helm 차트를 보관하고 배포하는 방법이에요. OCI 기반 레지스트리는 Helm 저장소를 0개 이상 포함할 수 있고, 각 저장소는 패키징된 Helm 차트를 0개 이상 포함할 수 있어요.
호스팅 레지스트리 사용
Helm 차트에 사용할 수 있는 OCI를 지원하는 호스팅 컨테이너 레지스트리가 여러 개 있어요. 예를 들면:
호스팅 컨테이너 레지스트리 공급자의 문서를 따라 OCI를 지원하는 레지스트리를 만들고 구성해요.
참고: OCI 기반 레지스트리인 Docker Registry나 zot를 개발 컴퓨터에서 실행할 수 있어요. 개발 컴퓨터에서 OCI 기반 레지스트리를 실행하는 것은 테스트 목적으로만 사용해야 해요.
sigstore로 OCI 기반 차트 서명
helm-sigstore 플러그인은 컨테이너 이미지 서명에 사용하는 것과 같은 도구로 Helm 차트에 서명할 수 있게 해 줘요. 이는 고전적인 차트 저장소가 지원하는 GPG 기반 프러비넌스의 대안을 제공해요.
helm sigstore 플러그인 사용에 대한 자세한 내용은 그 프로젝트의 문서를 참고하세요.
레지스트리 작업 명령
registry 하위 명령
login
레지스트리에 로그인 (수동 비밀번호 입력)
$ helm registry login -u myuser localhost:5000
Password:
Login succeeded
호스트는 레지스트리 호스트 이름만 있어야 하며, 선택적으로 포트를 포함할 수 있어요. URL 스킴이나 경로는 포함하지 마세요:
| 예 | 유효 |
|---|---|
| ghcr.io | 예 |
| localhost:5000 | 예 |
| https://ghcr.io | 아니요 - 스킴 허용 안 됨 |
| ghcr.io/myrepo | 아니요 - 경로 허용 안 됨 |
logout
레지스트리에서 로그아웃
$ helm registry logout localhost:5000
Logout succeeded
push 하위 명령
차트를 OCI 기반 레지스트리에 업로드:
$ helm push mychart-0.1.0.tgz oci://localhost:5000/helm-charts
Pushed: localhost:5000/helm-charts/mychart:0.1.0
Digest: sha256:ec5f08ee7be8b557cd1fc5ae1a0ac985e8538da7c93f51a51eff4b277509a723
push 하위 명령은 helm package로 미리 만든 .tgz 파일에만 사용할 수 있어요.
helm push로 차트를 OCI 레지스트리에 업로드할 때 참조는 oci://를 접두사로 붙여야 하며 basename이나 태그를 포함하면 안 돼요.
레지스트리 참조 basename은 차트 이름에서, 태그는 차트의 시맨틱 버전에서 유추돼요. 이는 현재 엄격한 요구 사항이에요.
일부 레지스트리는 저장소 및/또는 네임스페이스(지정된 경우)를 미리 만들어 두어야 해요. 그렇지 않으면 helm push 작업 중에 오류가 발생해요.
프러비넌스 파일(.prov)을 만들었고 차트 .tgz 파일 옆에 있다면, push 시 자동으로 레지스트리에 업로드돼요. 이는 Helm 차트 매니페스트에 추가 레이어를 만들게 돼요.
helm-push 플러그인(ChartMuseum에 차트 업로드용) 사용자는 플러그인이 새 내장 push와 충돌하므로 문제를 겪을 수 있어요. v0.10.0 버전부터 플러그인은 cm-push로 이름이 바뀌었어요.
기타 하위 명령
oci:// 프로토콜 지원은 다양한 다른 하위 명령에서도 사용할 수 있어요. 전체 목록은 다음과 같아요:
-
helm pull -
helm push -
helm show -
helm template -
helm install -
helm upgrade
레지스트리 참조의 basename(차트 이름)은 차트 다운로드와 관련된 모든 유형의 액션에 포함돼요 (helm push에서는 생략되는 것과 반대).
위 하위 명령을 OCI 기반 차트에 사용하는 몇 가지 예제:
$ helm pull oci://localhost:5000/helm-charts/mychart --version 0.1.0
Pulled: localhost:5000/helm-charts/mychart:0.1.0
Digest: sha256:0be7ec9fb7b962b46d81e4bb74fdcdb7089d965d3baca9f85d64948b05b402ff
$ helm show all oci://localhost:5000/helm-charts/mychart --version 0.1.0
apiVersion: v2
appVersion: 1.16.0
description: A Helm chart for Kubernetes
name: mychart
...
$ helm template myrelease oci://localhost:5000/helm-charts/mychart --version 0.1.0
---
# Source: mychart/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
...
$ helm install myrelease oci://localhost:5000/helm-charts/mychart --version 0.1.0
NAME: myrelease
LAST DEPLOYED: Wed Oct 27 15:11:40 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
...
$ helm upgrade myrelease oci://localhost:5000/helm-charts/mychart --version 0.2.0
Release "myrelease" has been upgraded. Happy Helming!
NAME: myrelease
LAST DEPLOYED: Wed Oct 27 15:12:05 2021
NAMESPACE: default
STATUS: deployed
REVISION: 2
NOTES:
...
digest로 차트 설치
digest로 차트를 설치하는 것은 태그보다 더 안전해요. digest는 불변이기 때문이에요. digest는 차트 URI에 지정돼요:
$ helm install myrelease oci://localhost:5000/helm-charts/mychart@sha256:52ccaee6d4dd272e54bfccda77738b42e1edf0e4a20c27e23f0b6c15d01aef79
NAME: myrelease
LAST DEPLOYED: Wed Oct 27 15:11:40 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
...
의존성 지정
차트의 의존성은 dependency update 하위 명령으로 레지스트리에서 내려 받을 수 있어요.
Chart.yaml의 특정 항목에 대한 repository는 basename 없이 레지스트리 참조로 지정돼요:
dependencies:
- name: mychart
version: "2.7.0"
repository: "oci://localhost:5000/myrepo"
dependency update를 실행하면 oci://localhost:5000/myrepo/mychart:2.7.0을 가져와요.
Helm 차트 매니페스트
레지스트리에 표현된 예제 Helm 차트 매니페스트(mediaType 필드에 주목):
{
"schemaVersion": 2,
"config": {
"mediaType": "application/vnd.cncf.helm.config.v1+json",
"digest": "sha256:8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111",
"size": 117
},
"layers": [
{
"mediaType": "application/vnd.cncf.helm.chart.content.v1.tar+gzip",
"digest": "sha256:1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617",
"size": 2487
}
]
}
다음 예제는 프러비넌스 파일을 포함해요(추가 레이어에 주목):
{
"schemaVersion": 2,
"config": {
"mediaType": "application/vnd.cncf.helm.config.v1+json",
"digest": "sha256:8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111",
"size": 117
},
"layers": [
{
"mediaType": "application/vnd.cncf.helm.chart.content.v1.tar+gzip",
"digest": "sha256:1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617",
"size": 2487
},
{
"mediaType": "application/vnd.cncf.helm.chart.provenance.v1.prov",
"digest": "sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a",
"size": 643
}
]
}
차트 저장소에서 마이그레이션
고전적인 차트 저장소(index.yaml 기반)에서의 마이그레이션은 helm pull을 사용한 다음 helm push로 결과 .tgz 파일을 레지스트리에 업로드하는 것처럼 간단해요.