쿠버네티스 패키지 매니저 Helm
#2-5 Helm Chart 배포
조대협 (http://bcho.tistory.com)
Helm 차트를 작성했으면, 다른 사용자들이 사용하기 쉽게 차트를 차트 리포지토리 (Chart repository)에 배포할 수 있다.
Helm 파일 패키징
파일을 배포하기 위해서는 먼저 차트 파일들을 *.tgz 파일 형태로 패키징해야 하는데, helm package 명령을 사용하면 된다.
%helm package [차트 디렉토리]
형태로 사용하면 된다. 앞의 예제인 helloworld 차트를 패키징 하려면 아래와 같은 명령을 사용하면 된다.
%helm package ./helloworld
Successfully packaged chart and saved it to: /home/terrychol/31.helm/helloworld-0.1.0.tgz
만약에 패키지된 파일에 대한 무결성을 보장하기 위해서(패키지된 파일이 변조되지 않음을 보장하는 방법) 패키지파일에 키로 사이닝을 하는 방법이 있다. helm package --sign … 옵션을 이용해서 사이닝을 한다. 패키지에 사이닝을 하면 *.prov 파일 (provenance file) 이 생성되고, 차트 패키지를 설치할때 helm install --verify 옵션을 이용하면 이 provenance 파일을 이용해서 파캐지의 무결성 (변조가 되었는지)을 확인한 후, 변조되지 않은 경우에만 설치를 한다.
원리 자체는 PKI(비대칭키) 알고리즘을 이용해서 패키지에 사이닝 한후에, 차트를 인스톨할때 사이닝을 확인하여 패키지 변조 여부를 파악하는 방식이다.
자세한 설정 방법은 https://helm.sh/docs/developing_charts/#helm-provenance-and-integrity
문서를 참고하기 바란다.
Helm Chart repository server
패키징된 차트패키지 파일을 서버에 배포해야하는데, 서버는 일반적은 HTTP 서버면 모두 사용이 가능하다. github,일반 웹서버, AWS S3, Google Cloud Storage(aka GCS)등이 모두 가능한데, 디렉토리 구조면 repository server 구조에 맞춰서 저장해놓으면 된다.
리포지토리 서버의 디렉토리 구조는 다음과 같다.
charts/
|- index.yaml
|- alpine-0.1.2.tgz
|- alpine-0.1.2.tgz.prov
*.tgz 파일은 차트 패키지 파일이고
*.prov 파일은 차트 패키지에 대한 provenance 파일이다.
그리고 index.yaml에 리파지토리에 있는 패키지들에 대한 정보를 저장한다.
아래는 index.yaml 파일 샘플이다.
apiVersion: v1
entries:
helloworld:
- apiVersion: v1
appVersion: "1.0"
created: 2019-06-19T15:37:08.158097657+09:00
description: A Helm chart for Kubernetes
digest: f7fcd1078546939bd04b4f94282fb15b3d8d4c422e61b5b03b7e4061c1b61037
name: helloworld
urls:
- http://127.0.0.1:8879/helloworld-0.1.0.tgz
version: 0.1.0
helloworld2:
- apiVersion: v1
appVersion: "1.0"
created: 2019-06-19T15:37:08.158803299+09:00
description: A Helm chart for Kubernetes
digest: 69510159a58a1c5c228b6870546b67d852b09d299b36d4617bf9e9b971be01fd
name: helloworld2
urls:
- http://127.0.0.1:8879/helloworld2-0.1.0.tgz
version: 0.1.0
generated: 2019-06-19T15:37:08.15656402+09:00
helloworld와 helloworld2 가 포함되어 있고, 패키지 URL은 http://127.0.0.1:8879/ 이다.
간단하게 Helm 차트 리파지토리를 띄우는 방법은 패키지 (*.tgz)이 있는 디렉토리에서 helm serve 명령을 이용하면 디폴트로 현재 디렉토리에 있는 패키지들을 이용하여 index.yaml 파일을 자동으로 생성하고, 이를 8879 포트를 이용해서 서빙한다.
아래는 helm serve 명령을 이용해서 현재 디렉토리 “.”를 패키지 디렉토리로 해서 차트 리파지토리 서버를 기동한 결과이다.
%helm serve --repo-path .
Regenerating index. This may take a moment.
Now serving you on 127.0.0.1:8879
위의 명령을 사용하면 자동으로 현재 디렉토리에 있는 패키지 파일 (*.tgz)을 읽어서 index.yaml을 자동으로 생성해서 repository 서비스를 제공한다.
helm serve를 이용하는 것이 아니라 웹서버등을 이용할 경우에는 index.yaml을 별도로 생성해줘야 하는데, helm repo index 라는 명령을 이용하면 된다.
%helm repo index [디렉토리명]
을 실행하면, [디렉토리명]에 있는 helm 패키지 파일들에 대한 index.yaml을 생성한다. 이때 웹서버의 URL을 정해줄 수 있는데,
%helm repo index [디렉토리명] --url [http or https URL for repository]
--url 옵션으로 웹서버의 URL을 주면, index.yaml에서 패키지 경로에 웹서버의 경로를 붙여준다.
%helm repo index . --url https://bwcho75.github.io/my-repo
apiVersion: v1
entries:
helloworld:
- apiVersion: v1
appVersion: "1.0"
created: 2019-06-19T18:16:29.31329401+09:00
description: A Helm chart for Kubernetes
digest: f7fcd1078546939bd04b4f94282fb15b3d8d4c422e61b5b03b7e4061c1b61037
name: helloworld
urls:
https://bwcho75.github.io/my-repo/helloworld-0.1.0.tgz
version: 0.1.0
helloworld2:
- apiVersion: v1
appVersion: "1.0"
created: 2019-06-19T18:16:29.314605303+09:00
description: A Helm chart for Kubernetes
digest: 69510159a58a1c5c228b6870546b67d852b09d299b36d4617bf9e9b971be01fd
name: helloworld2
urls:
https://bwcho75.github.io/my-repo/helloworld2-0.1.0.tgz
version: 0.1.0
generated: 2019-06-19T18:16:29.311471188+09:00
다음에 helm 클라이언트에서 이 repository를 사용하도록 하려면,이 repository를 리스트에 추가해야 한다.
명령을 helm repo add [리파지토리 이름] [URL] 식으로 지정하면 된다.
리파지토리 이름은 사용자가 임의적으로 정하는 이름이고 URL은 Helm 리자지토리의 http URL 이다.
아래는 myrepo라는 이름으로, http://localhost:8879 서버를 등록하는 방법이다.
helm repo add myrepo http://localhost:8879
"myrepo" has been added to your repositories
팀내나 아니면 작은 시스템을 위한 Helm repository 라면, helm serv,git (or github) 또는 간단한 웹서버 정도로도 repository 운영이 가능하다. 새로운 차트의 등록은 위에 처럼 그러나 큰 규모로 운영을 하거나 외부에 까지 repository를 오픈할 경우에는 사용자 인증등 별도의 보안 기능이 있고, 매번 index.yaml을 재생성하는게 아니라, 추가 삭제할 수 있는 repository를 사용하는 것을 권장한다.
ChartMuseum
Charmusem (https://chartmuseum.com) 은 오픈소스 Helm Chart Repository 서버이다. 인증 기능을 제공할 뿐만 아니라 파일 스토리지를 AWS S3, 구글 GCS등을 백앤드로 사용할 수 있다.
기본 설치 및 사용은 도커로 패키징 되어있는 이미지를 사용하면 된다.
docker run --rm -it \
-p 8080:8080 \
-v $(pwd)/charts:/charts \
-e DEBUG=true \
-e STORAGE=local \
-e STORAGE_LOCAL_ROOTDIR=/charts \
chartmuseum/chartmuseum:v0.8.1
Helm repository 서버이외에도, Chartmuseum은 추가적으로 필요한 기능에 대해서 오픈소스로 제공하고 있다.
chartmuseum/helm-push - Helm plugin to push chart package to ChartMuseum
chartmuseum/storage - Go library providing common interface for working across multiple cloud storage backends
chartmuseum/auth - Go library for generating ChartMuseum JWT Tokens, authorizing HTTP requests, etc.
chartmuseum/auth-server-example - Example server providing JWT tokens for ChartMuseum auth
chartmuseum/testbed - Docker testbed for continuous integration
chartmuseum/www - chartmuseum.com static site source code
chartmuseum/ui - ChartMuseum frontend UI
이중에서 주의 깊게 볼만한것은 chartmuseum/ui 와 chartmuseum/helm-push 인데, ui는 chartmuseum 에 대한 웹 인터페이스를 제공한다.
<그림. Chartmuseum ui 웹 화면 >
Chartmuseum push는 CLI도구로, 로컬에 있는 Helm 차트 패키지를 Chartmuseum 에 설치할 수 있는 기능이다. Helm 클라이언트가 깔려 있는 로컬 환경(PC나 노트북)에 인스톨 해서 사용한다.
로컬환경에 설치를 한후에, 차트를 Chartmuseum repository에 차트를 저장하려면
%helm push [차트디렉토리] [repository 서버명]
으로 실행하면 된다. [차트 디렉토리]는 차트 파일이 들어있는 디렉토리이고 [repository 서버명] 은 helm repo add로 등록한 repository 이다.
%helm push ./helloworld chartmuseum
지금까지, Helm에 대해서 알아보았다. Helm 은 쿠버네티스를 사용할때, 같이 많이 사용되는 솔루션이고 특히 쿠버네티스에 애플리케이션 설정 및 배포 관점에서 매우 유용하다. 물론 전체 CI/CD 파이프라인을 모두 만들 수 는 없지만, Spinnaker나 Jenkins X 등의 툴과 함께 전체 CI/CD 파이프라인의 중요한 요소로서 사용된다.
'클라우드 컴퓨팅 & NoSQL > 도커 & 쿠버네티스' 카테고리의 다른 글
쿠버네티스용 Continuous Deployment 툴인 Skaffold #2 (1) | 2019.07.04 |
---|---|
쿠버네티스용 Continuous Deployment 툴인 Skaffold (1) | 2019.06.25 |
쿠버네티스 패키지 매니저 Helm #2-4. Chart Hook (0) | 2019.06.20 |
쿠버네티스 패키지 매니저 Helm #2-3. Charts (디렉토리 구조) (0) | 2019.06.16 |
쿠버네티스 패키지 매니저 Helm #2-2. Chart (버전과 릴리즈) (1) | 2019.06.11 |