레지스트리

헬름 3는 패키지 배포를 위해 OCI를 지원한다. 차트 패키지는 OCI 기반 레지스트리 간에 저장 및 공유할 수 있다.

OCI 지원 활성화

현재 OCI 지원은 실험적(experimental) 으로 간주되고 있다.

아래에서 기술된 명령들을 사용하려면 환경에서 HELM_EXPERIMENTAL_OCI 변수를 설정하자:

export HELM_EXPERIMENTAL_OCI=1

레지스트리 실행

테스트 목적으로 레지스트리를 시작하는 것은 간단하다. 도커를 설치한 경우, 다음 명령어를 실행하자.

docker run -dp 5000:5000 --restart=always --name registry registry

이렇게 하면 localhost:5000에서 레지스트리 서버가 시작될 것이다.

docker logs -f registry를 사용하여 로그를 확인하고 docker rm -f registry를 사용하여 중지하자.

스토리지를 보존하려면 위의 명령에 -v $(pwd)/registry:/var/lib/registry를 추가하자.

자세한 설정 옵션은 해당 문서를 참조하자.

인증

레지스트리에 인증을 활성화하려면, 다음과 같이 해보자.

먼저 사용자 이름과 비밀번호로 auth.htpasswd 파일을 만들자.

htpasswd -cB -b auth.htpasswd myuser mypass

그런 다음, 서버를 시작하여 해당 파일을 마운트하고 REGISTRY_AUTH 환경 변수를 지정하자.

docker run -dp 5000:5000 --restart=always --name registry \
  -v $(pwd)/auth.htpasswd:/etc/docker/registry/auth.htpasswd \
  -e REGISTRY_AUTH="{htpasswd: {realm: localhost, path: /etc/docker/registry/auth.htpasswd}}" \
  registry

레지스트리 작업 명령어

helm registryhelm chart 명령어로 레지스트리와 로컬 캐시에 대한 작업을 할 수 있다.

registry 하위 명령어

login

레지스트리에 로그인 (암호 수동 입력)

$ helm registry login -u myuser localhost:5000
Password:
Login succeeded

logout

레지스트리에서 로그아웃

$ helm registry logout localhost:5000
Logout succeeded

chart 하위 명령어

save

로컬 캐시에 차트 디렉토리를 저장

$ helm chart save mychart/ localhost:5000/myrepo/mychart:2.7.0
ref:     localhost:5000/myrepo/mychart:2.7.0
digest:  1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
size:    2.4 KiB
name:    mychart
version: 0.1.0
2.7.0: saved

list

저장된 모든 차트 나열

$ helm chart list
REF                                                     NAME                    VERSION DIGEST  SIZE            CREATED
localhost:5000/myrepo/mychart:2.7.0                     mychart                 2.7.0   84059d7 454 B           27 seconds
localhost:5000/stable/acs-engine-autoscaler:2.2.2       acs-engine-autoscaler   2.2.2   d8d6762 4.3 KiB         2 hours
localhost:5000/stable/aerospike:0.2.1                   aerospike               0.2.1   4aff638 3.7 KiB         2 hours
localhost:5000/stable/airflow:0.13.0                    airflow                 0.13.0  c46cc43 28.1 KiB        2 hours
localhost:5000/stable/anchore-engine:0.10.0             anchore-engine          0.10.0  3f3dcd7 34.3 KiB        2 hours
...

export

디렉토리로 차트 내보내기

$ helm chart export localhost:5000/myrepo/mychart:2.7.0
ref:     localhost:5000/myrepo/mychart:2.7.0
digest:  1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
size:    2.4 KiB
name:    mychart
version: 0.1.0
Exported chart to mychart/

push

원격지로 차트 밀어주기(push)

$ helm chart push localhost:5000/myrepo/mychart:2.7.0
The push refers to repository [localhost:5000/myrepo/mychart]
ref:     localhost:5000/myrepo/mychart:2.7.0
digest:  1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
size:    2.4 KiB
name:    mychart
version: 0.1.0
2.7.0: pushed to remote (1 layer, 2.4 KiB total)

remove

캐시에서 차트 제거하기

$ helm chart remove localhost:5000/myrepo/mychart:2.7.0
2.7.0: removed

pull

원격지에서 차트 가져오기(pull)

$ helm chart pull localhost:5000/myrepo/mychart:2.7.0
2.7.0: Pulling from localhost:5000/myrepo/mychart
ref:     localhost:5000/myrepo/mychart:2.7.0
digest:  1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
size:    2.4 KiB
name:    mychart
version: 0.1.0
Status: Downloaded newer chart for localhost:5000/myrepo/mychart:2.7.0

내 차트는 어디 있나?

위의 명령어들을 사용하여 저장된 차트는 파일 시스템에 캐시될 것이다.

OCI 이미지 레이아웃 사양은 파일시스템 레이아웃에 엄격하게 적용되는데, 예를 들면 다음과 같다.

$ tree ~/Library/Caches/helm/
/Users/myuser/Library/Caches/helm/
└── registry
    ├── cache
    │   ├── blobs
    │   │   └── sha256
    │   │       ├── 1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
    │   │       ├── 31fb454efb3c69fafe53672598006790122269a1b3b458607dbe106aba7059ef
    │   │       └── 8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111
    │   ├── index.json
    │   ├── ingest
    │   └── oci-layout
    └── config.json

모든 헬름 차트 매니페스트에 대한 참조(ref)를 포함하는 예시 index.json:

$ cat ~/Library/Caches/helm/registry/cache/index.json  | jq
{
  "schemaVersion": 2,
  "manifests": [
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:31fb454efb3c69fafe53672598006790122269a1b3b458607dbe106aba7059ef",
      "size": 354,
      "annotations": {
        "org.opencontainers.image.ref.name": "localhost:5000/myrepo/mychart:2.7.0"
      }
    }
  ]
}

헬름 차트 매니페스트 예시 ('mediaType' 필드를 주목하자):

$ cat ~/Library/Caches/helm/registry/cache/blobs/sha256/31fb454efb3c69fafe53672598006790122269a1b3b458607dbe106aba7059ef | jq
{
  "schemaVersion": 2,
  "config": {
    "mediaType": "application/vnd.cncf.helm.config.v1+json",
    "digest": "sha256:8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111",
    "size": 117
  },
  "layers": [
    {
      "mediaType": "application/tar+gzip",
      "digest": "sha256:1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617",
      "size": 2487
    }
  ]
}

차트 저장소에서 마이그레이션

클래식 차트 저장소 (index.yaml 기반 저장소)에서 마이그레이션하는 작업은 helm fetch (헬름 2 CLI), helm chart save, helm chart push 정도로 간단하다.