쿠버네티스 패키지 매니저 HELM
업그레이드와 롤백
Chart로 의해서 설치된 리소스들을 쿠버네티스에서 릴리즈라고 한다.
예를 들어 같은 차트로 MySQL을 쿠버네티스 클러스터 내에 여러번 설치 할 수 있다. 각각 설치된 MySQL들을 릴리즈라고 하고, 릴리즈에 설정이 변경된 경우에, 차트를 수정해서 변경을 반영할 수 있다. 변경이 반영될때 마다 새로운 버전이 생성된다.
처음 helm install로 설치를 할때 --name 옵션으로 저장한 설치 이름이 릴리즈 명이 되고, 이 릴리즈를 업데이트 하고 싶으면 helm upgrade {Helm 릴리즈명} {차트 디렉토리} 를 실행하면, 해당 릴리즈를 업데이트하고, 새로운 버전을 생성한다.
앞의 예제의 values.yaml 에서 replicaCount: 3 를 변경한 후, upgrade를 해보자
%helm upgrade helloworld ./helloworld/
명령을 실행하면 다음과 같이 기존 배포가 업데이트 된다.
Release "helloworld" has been upgraded. Happy Helming!
LAST DEPLOYED: Sun Jun 9 20:58:41 2019
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Service
NAME AGE
helloworld-svc 2d
==> v1beta2/Deployment
helloworld-deployment 2d
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
helloworld-deployment-696fc568f9-2dkpm 0/1 ContainerCreating 0 0s
helloworld-deployment-696fc568f9-fqqg8 1/1 Running 0 2d
helloworld-deployment-696fc568f9-r8qct 1/1 Running 0 2d
그리고 위와 같이 Deployment pod가 3개로 늘어난것을 확인할 수 있다.
업그레이드 한후 버전을 확인하려면 helm history {릴리즈 이름} 을 사용하면 되는데,
% helm history helloworld
를 실행하면 아래와 같이 2번 버전이 새로 생긴것을 확인할 수 있다.
REVISION UPDATED STATUS CHART DESCRIPTION
1 Fri Jun 7 23:24:34 2019 SUPERSEDED helloworld-0.1.0 Install complete
2 Sun Jun 9 20:58:41 2019 DEPLOYED helloworld-0.1.0 Upgrade complete
만약 예전 버전으로 돌리고 싶으면 rollback 명령을 사용하면 되는데, helm rollback {릴리즈 이름} {릴리즈 버전} 으로 실행하면 된다. helm rollback helloworld 1 는 helloworld 릴리즈를 1 버전으로 롤백 하는 명령어 이다. 명령어를 실행해보면 다음과 같이 롤백이 완료되는 것을 확인할 수 있고,
% helm rollback helloworld 1
Rollback was a success! Happy Helming!
helm history로 해당 릴리즈의 버전을 확인해보면, 3번 버전에서 1번으로 롤백을 한것을 확인할 수 있다.
%helm history helloworld
REVISION UPDATED STATUS CHART DESCRIPTION
1 Fri Jun 7 18:24:34 2019 SUPERSEDED helloworld-0.1.0 Install complete
2 Sun Jun 9 20:58:41 2019 SUPERSEDED helloworld-0.1.0 Upgrade complete
3 Sun Jun 9 21:43:48 2019 DEPLOYED helloworld-0.1.0 Rollback to 1
릴리즈
앞에서도 설명했듯이 차트 하나로 같은 클러스터에 같은 애플리케이션을 여러개를 설치할 수 있다. MySQL이나 Redis 메모리 서버들은 애플리케이션이 아니기 때문에 같은 이미지로 여러개의 릴리즈를 설치할 수 있다.
그런데 앞의 스크립트로 helloworld 차트를 한번 더 설치하면 에러가 날것이다. 이유는 차트에 정의된 Service와 Deployment 리소스의 이름이 동일하기 때문이다.
templates/helloworld.yaml 파일에서 Deployment 이름 정의 부분을 보면, 이름을 {{.Value.name}}을 사용하도록 하였다.
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: {{ .Values.name }}-deployment
:
그래서 values.yaml에서 name을 변경하지 않는 이상, Deployment는 같은 이름을 가지게 된다.
이 문제를 해결하기 위해서 리소스들의 이름을 릴리즈 이름을 사용하도록 하면 된다. 릴리즈 이름은 {{ .Release.Name}} 을 사용하면, 릴리즈 이름을 리소스 이름으로 사용할 수 있다. helloworld.yaml을 아래와 같이 수정하면 된다.
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: {{ .Release.Name }}
spec:
그런데, 이렇게 설치가 된 리소스들이 어떤 차트에 의해서 설치된 것인지 구별이 잘 안될 수 있기 때문에, 좀더 좋은 방법은 리소스 이름을 “차트 이름-릴리즈 이름" 형태로 하는 것이 좋다. 차트 이름은 {{ .Chart.Name }} 을 사용하면 된다. 아래는 “차트 이름-릴리즈 이름" 형태로 정의한 예제이다.
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: {{ .Chart.Name }}-{{ .Release.Name }}
helm template 명령을 이용해서 테스트를 해보자. 같은 예제를 helloworld2 디렉토리에 새롭게 만들었다. (그래서 아래 명령을 보면 ./helloworld2 디렉토리를 차트 디렉토리로 실행하였다.) 그리고 릴리즈 이름을 --name을 이용해서 myrelease로 지정하였다.
% helm template --name myrelease ./helloworld2
---
# Source: helloworld2/templates/helloworld.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: helloworld2-myrelease
spec:
replicas: 3
:
metadata:
name: helloworld-deployment
spec:
replicas: 10
minReadySeconds: 5
삭제
그리고 설치된 차트는 간단하게 helm delete 명령으로 삭제가 가능하다.
%helm delete helloworld
release "helloworld" deleted
'클라우드 컴퓨팅 & NoSQL > 도커 & 쿠버네티스' 카테고리의 다른 글
쿠버네티스 패키지 매니저 Helm #2-4. Chart Hook (0) | 2019.06.20 |
---|---|
쿠버네티스 패키지 매니저 Helm #2-3. Charts (디렉토리 구조) (0) | 2019.06.16 |
쿠버네티스 패키지 매니저 Helm #2-1. Chart (0) | 2019.06.09 |
쿠버네티스 패키지 매니저 Helm #1 - 개념, 설치 (0) | 2019.06.04 |
서버리스 오픈소스 - knative #2 비동기 처리를 위한 Eventing (0) | 2019.04.24 |