Agile&DevOps/helm

1. 기존 Helm chart 설치, 업그레이드, 삭제

Happy@Cloud 2019. 9. 10. 02:23

이번 장에서는 공개된 오픈소스소프트웨어의 Helm chart를 설치, 업그레이드, 삭제하는 명령어들에 대해 배워 보겠습니다. 

각 목적에 맞는 명령어 리스트를 1 page로 정리하면 아래와 같습니다.

이제 각 명령을 실제 예제를 통해 설명하겠습니다.

사전에 사용하고 있는 VM에 helm과 kubernetes가 설치되어 있어야 합니다.

 

1. 차트 저장소 이용하기 

1) helm repo list : 자신의 VM에 등록된 helm chart 저장소 목록을 표시합니다.

$ helm repo ls

 

2) helm repo add <repo name> <url> : 새로운 helm chart 저장소를 등록합니다.

가장 많이 사용하는 Bitnami사의 helm chart는 아래 주소에서 확인할 수 있습니다. 

https://github.com/bitnami/charts/tree/main/bitnami

Bitnami helm chart 저장소를 추가하는 방법은 아래와 같습니다. 

$ helm repo add bitnami https://charts.bitnami.com/bitnami

 

 

3) helm repo remove <repo name> : 등록한 helm chart저장소를 삭제합니다.

위에서 등록한 incubator 저장소를 삭제해 보겠습니다.

# helm repo remove bitnami

* 삭제 되는 거 확인하고, 이후 작업을 위해 다시 추가해 주십시오. 

$ helm repo add bitnami https://charts.bitnami.com/bitnami

 

4) helm repo update: Local의 chart 저장소를 최신 목록으로 갱신합니다. 

# helm repo update


2. Helm chart 설치 및 업그레이드

1) helm search repo <keyword> : 등록된 helm chart repository에서 필요한 chart를 찾습니다.

# helm search repo redis

2) helm inspect [chart/values/readme] <chart name> : helm chart의 제반 정보를 볼 수 있습니다.

chart에 대한 기본 정보인 Chart.yaml의 내용 조회

# helm inspect chart stable/redis

설치 시 환경설정 값이 있는 values.yaml의 내용 조회

# helm inspect values stable/redis

helm inspect명령으로 기존 환경설정값을 참조한 후 새로운 환경설정파일을 만들어 재정의하여 설치할 수 있습니다.

예를 들어 위에서 storageClass값을 재정의하고 싶다면, 아래와 같이 별도 환경설정 파일을 만들어 설치합니다.

# vi myconfig.yaml

# helm install -f myconfig.yaml stable/redis --name myredis --namespace devops

 

- README 파일 내용 조회

# helm inspect readme stable/redis

 

3) helm chart 설치

helm install <release name> [-f <config path>] <chart>  [--namespace <namespace>] [--set <key> =<value>,<key>=<value>,...] 

helm chart를 설치하는 명령입니다. 각 옵션의 의미는 아래와 같습니다. 

- <release name> : 배포될 release 이름입니다. deployment, service, POD등의 이름은 이 release name을 이용하여 명명됩니다. 

helm install <chart> : <chart>부분에는 3가지 유형의 값이 올 수 있습니다. -> helm repository에 등록된 chart 이름 OR Chart.yaml이 있는 디렉토리 OR chart압축파일명

- f <config path> : 원래 values.yaml에 정의된 환경설정을 재정의한 config파일(확장자는 yaml)의 경로를 지정

--namespace <namespace> : 배포될 namespace 지정

--set <key>=<value> : 원래 values.yaml을 파라미터를 이용하여 재정의할 때 사용합니다. 

사용예)

# helm install myredis stable/redis --namespace helmtest

# helm install hellohelm ~/hellohelm --namespace helmtest

# helm install mymariadb mariadb-6.8.8.tgz --namespace helmtest

 

4) helm pull: Helm chart를 로컬에 압축파일로 다운로드 

Helm chart를 설치할 때 '3) helm chart 설치'처럼 helm registry에서 내려 받는 방법도 있지만 helm chart를 로컬에 다운로드 하여 설치하는 방법도 있습니다.

폐쇄망에서는 이 방법을 사용해야 합니다.

- helm chart 압축파일을 내려 받기: helm pull {chart path}

- helm chart 압축 해제: tar xvf {helm chart 압축 파일} 

- values.yaml안의 container image 경로를 구하고, docker save {image path} -o {압축파일명} 으로 image 압축 

- 폐쇄망 안으로 helm chart와 image 압축파일을 반입함

- image를 작업 장비에서 docker load -i {image 압축 파일}로 로딩하고, private image registry에 업로드 함

- values.yaml에서 image 경로 중 registry부분을 변경함: 예) redis:7.0 ==> myharbor.io/db/redis:7.0 

- helm chart를 설치함 : helm install {release 명} [-f {사용자정의 yaml 경로}] {helm chart 디렉토리 경로} 

예) helm install redis -f myredis.yaml ~/helm-chart/redis  

 

5) helm ls : 설치된 helm chart 리스트 표시

위 helm chart 설치 사용예에서 첫번째는 아마 문제 없이 실행될겁니다. install 후에 아래 명령을 입력해 보십시오.

# helm ls

6) helm chart 업그레이드

helm upgrade <release> [-f <config path>] <chart>

chart설치 후 설정 내용을 바꿔서 다시 배포할 때 사용합니다. 

제가 미리 github에 만들어 놓은 helm repository를 이용해 간단히 실습해 보겠습니다. 

- 아래와 같이 먼저 repository를 등록합니다.

# helm repo add github-stable https://happycloudpak.github.io/helm-charts/stable

# helm repo update

# helm search hello-helm

 

- hello-helm 차트를 설치합니다. 편의상 현재 namespace에 설치합니다.  

# helm install hello1 github-stable/hello-helm

# kubectl get all

- 웹 브라우저에서 보기: http://169.56.164.246.nip.io 로 접근하면 아래와 같이 보여야 합니다.

그러나 이 주소는 제 VM서버의 주소이기 때문에 안될 수 있습니다. 

그럼 주소값을 바꿔서 chart를 업그레이드 해 보겠습니다. 

- chart 환경설정값 보기

# helm inspect values github-stable/hello-helm 

아래와 같은 결과가 보일겁니다. 

- 환경설정 재정의 파일 만들기

# mkdir ~/tmp && cd ~/tmp

helm inspect values github-stable/hello-helm > hello.yaml

# vi hello.yaml 

다른 값들은 모두 지우고 아래 내용만 남긴 후, 주소를 본인의 k8s master VM IP로 바꿉니다.

ingress:
  hosts:
    - host: 169.56.164.246.nip.io
      paths: [ "/", "/hello" ]

- chart upgrade 

# helm upgrade hello1 -f hello.yaml github-stable/hello-helm

 

- 테스트

이제 웹브라우저에서 http://<k8s master VM IP>.nip.io 로 접근하면 정상적으로 보일겁니다.

 

7) helm history <release> : 배포 history 표시

위 starthelm 설치와 업그레이드를 한 후, 아래 명령을 수행해 봅니다.

# helm history hello1

더보기

Tip) history의 description 지정하기

위 명령을 수행해 보면 마지막 column에 description이 있습니다.  이 description을 지정하려면 아래와 같이 --description <comment> 를 이용합니다. 

# helm upgrade -f config.yaml hello1 github-stable/starthelm --description "change ingress host" 

# helm history hello1

* description 파라미터는 install, upgrade, rollback, delete에 모두 사용할 수 있습니다.

8) helm rollback <release> <revision no> : rollback 하기

배포된 chart를 특정 버전으로 rollback하는 명령입니다.

# helm history hello1

# helm rollback hello1 1helm rollback hello1 1 --description "find bug, so rollback"

# helm history hello1

 

 

 


 

3. Helm chart 삭제

1) helm delete <release name>

위에서 hello1으로 설치한 chart를 삭제 해 봅시다.

# helm delete hello1

# helm ls

# helm ls --all

지금까지 기존 helm chart를 repository로 부터 설치, 업그레이드, 삭제하는 방법을 배웠습니다. 

다음 장에서는 새로운 chart를 만들고 테스트하여 패키징(압축파일로 묶음)한 후 repository에 등록하는 방법을 배우도록 하겠습니다. 


Helm으로 Database 설치하기

Bitnami Helm chart로 주요 Database를 설치하겠습니다. 

실습을 위해서는 사전에 NFS서버와 Dynamic Provisioning 설정이 되어 있어야 합니다.  

https://happycloud-lee.tistory.com/178

 

NFS서버 설치와 NFS Dynamic Provisioning 설정

NFS서버 설치는 아래 글을 참고하세요 . happycloud-lee.tistory.com/46?category=832247 NFS서버 만들기 1. ubuntu https://hiondal.blog.me/221624709742 NFS서버 만들기 k8s에서 Volume으로 사용할 수 있는 종류는 아래와 같이

happycloud-lee.tistory.com

먼저 Bitnami helm chart 저장소를 추가 하십시오. 이미 있는지 먼저 보고 없으면 추가하세요. 

$ helm repo ls
# 없으면 추가
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm repo update

helm chart를 다운로드 할 디렉토리를 만듭니다. 

$ mkdir -p ~/install

 

MySQL

1) helm chart를 다운로드 후 압축 해제하고 helm chart 디렉토리로 이동합니다. 

# Search helm chart 
$ helm search repo mysql
NAME                  	CHART VERSION	APP VERSION	DESCRIPTION                                       
bitnami/mysql         	9.14.4       	8.0.35     	MySQL is a fa...

# Download helm chart 
$ helm pull bitnami/mysql

# 압축해제 
$ tar xvf mysql-9.14.4.tgz

# Move helm chart directory
$ cd mysql

 

2) values.yaml파일을 복사하여 사용자정의 yaml파일 'mysql.yaml'을 만듭니다. 

내용은 아래와 같이 합니다.  수정할 항목은 아래와 같습니다. 

- storageClass: kubeclt get sc하여 NFS dynamic provisioning에서 지정한 StorageClass명으로 변경

- auth.rootPassword, auth.database, auth.username, auth.password, auth.replicationPassword: 적절하게 변경 

- primary.persistence.storageClass, primary.persistence.size 

- primary.service.type: k8s cluster외부에서 접근하려면 NodePort로 하고 그 하위의 nodePorts.mysql에 접근할 포트를 지정

- secondary.replicaCount: Pod수를 지정 

- secondary.persistence.storageClass, secondary.persistence.size

global:
  storageClass: "nfs-retain"

## @param architecture MySQL architecture (`standalone` or `replication`)
architecture: replication
##
auth:
  rootPassword: "P@ssw0rd$"
  createDatabase: true
  database: "mydb"
  username: "u00"
  password: "P@ssw0rd$"
  ##
  replicationUser: replicator
  replicationPassword: "P@ssw0rd$"
primary:
  name: primary
  ##
  persistence:
    enabled: true
    storageClass: "nfs-retain"
    size: 100m
  ##
  service:
    type: NodePort
    ports:
      mysql: 3306
    ##
    nodePorts:
      mysql: "32700"

secondary:
  name: secondary
  ##
  replicaCount: 1
    ##
  persistence:
    enabled: true
    storageClass: "nfs-retain"
    ##
    accessModes:
      - ReadWriteOnce
    ##
    size: 100m
  ##
  service:
    type: ClusterIP
    ##
    ports:
      mysql: 3306

 

3) Pod 배포 

# --dry-run 옵션으로 배포 yaml이 잘 생성되는지 테스트  
$ helm install mysql -f mysql.yaml . --dry-run

# 배포
$ helm install mysql -f mysql.yaml . 

# PVC binding 체크
$ kubectl get pvc 

# Service Node Port 체크
$ kubectl get svc

# Pod 생성 확인
$ kubectl get po -w 또는 $ watch kubectl get po

 

참고) 재설치 시 기존 k8s 객체 삭제  

만약 문제가 있다면 아래와 같이 helm 으로 모든 배포 k8s 객체를 지웁니다. 

PVC와 PV객체는 수동으로 지워야 합니다. 

$ helm delete mysql 

# PVC 지우기
$ kubectl get pvc 
NAME                          STATUS   VOLUME                                     
data-mysql-primary-0          Bound    pvc-76d9d7f6-634d-48c4-8d1c-362ad6b0f97c   
data-mysql-secondary-0        Bound    pvc-c4fb4bdf-5efd-47a1-b8db-f1937b7b6cb7 
$ kubectl delete pvc data-mysql-primary-0 data-mysql-secondary-0

# PV 지우기 (위 PVC 목록의 'VOLUME'이 PV객체명임)
$ kubectl delete pv pvc-76d9d7f6-634d-48c4-8d1c-362ad6b0f97c pvc-c4fb4bdf-5efd-47a1-b8db-f1937b7b6cb7

 

Redis

1) helm chart를 다운로드 후 압축 해제하고 helm chart 디렉토리로 이동합니다. 

# Search helm chart 
$ helm search repo redis
NAME                  	CHART VERSION	                                       
bitnami/redis         	18.4.0       	

# Download helm chart 
$ helm pull bitnami/redis

# 압축해제 
$ tar xvf redis-18.4.0.tgz

# Move helm chart directory
$ cd redis

 

2) values.yaml파일을 복사하여 사용자정의 yaml파일 'redis.yaml'을 만듭니다. 

내용은 아래와 같이 합니다.  수정할 항목은 아래와 같습니다. 

- storageClass: kubeclt get sc하여 NFS dynamic provisioning에서 지정한 StorageClass명으로 변경

- auth.password: 적절하게 변경 

- master.count, master.persistence.storageClass, master.persistence.size 

- master.service.type: k8s cluster외부에서 접근하려면 NodePort로 하고 그 하위의 nodePorts.redis에 접근할 포트를 지정

- replica.replicaCount: Pod수를 지정 

- replica.persistence.storageClass, replica.persistence.size

## @param architecture Redis&reg; architecture. Allowed values: `standalone` or `replication`
architecture: replication
##
auth:
  ##
  enabled: true
  sentinel: true
  ##
  password: "P@ssw0rd$"
  ##

master:
  ## @param master.count Number of Redis&reg; master instances to deploy (experimental, requires additional configuration)
  ##
  count: 1
  ##
  persistence:
    enabled: true
    ##
    storageClass: "nfs-retain"
    accessModes:
      - ReadWriteOnce
    size: 100m
  ##
  service:
    type: NodePort
    ports:
      redis: 6379
    ##
    nodePorts:
      redis: "32600"
##

replica:
  ##
  kind: StatefulSet
  ##
  replicaCount: 3
  ##
  persistence:
    enabled: true
    ##
    storageClass: "nfs-retain"
    ##
    accessModes:
      - ReadWriteOnce
    size: 100m
  ##
  service:
    ##
    type: ClusterIP
    ##
    ports:
      redis: 6379

 

3) Pod 배포 

# --dry-run 옵션으로 배포 yaml이 잘 생성되는지 테스트  
$ helm install redis -f redis.yaml . --dry-run

# 배포
$ helm install redis -f redis.yaml . 

# PVC binding 체크
$ kubectl get pvc 

# Service Node Port 체크
$ kubectl get svc

# Pod 생성 확인
$ kubectl get po -w 또는 $ watch kubectl get po

 

참고) 재설치 시 기존 k8s 객체 삭제  

만약 문제가 있다면 아래와 같이 helm 으로 모든 배포 k8s 객체를 지웁니다. 

PVC와 PV객체는 수동으로 지워야 합니다. 

$ helm delete redis

# PVC 지우기
$ kubectl get pvc 
NAME                          STATUS   VOLUME                                     
redis-data-redis-master-0     Bound    pvc-0d5bae70-5b15-47fc-99f3-e54aa3c95b90   
redis-data-redis-replicas-0   Bound    pvc-xxxxx
redis-data-redis-replicas-1   Bound    pvc-xxxxx
redis-data-redis-replicas-2   Bound    pvc-xxxxx

$ kubectl delete pvc redis-data-redis-master-0 redis-data-redis-replicas-0 redis-data-redis-replicas-1 redis-data-redis-replicas-2

# PV 지우기 (위 PVC 목록의 'VOLUME'이 PV객체명임)
$ kubectl delete pv {VOLUME}에 있는 PV명

 

MongoDB

1) helm chart를 다운로드 후 압축 해제하고 helm chart 디렉토리로 이동합니다. 

# Search helm chart 
$ helm search repo mongodb
NAME                  	CHART VERSION	                                       
bitnami/mongodb         14.3.2      	

# Download helm chart 
$ helm pull bitnami/mongodb

# 압축해제 
$ tar xvf mongodb-14.3.2.tgz

# Move helm chart directory
$ cd mongodb

 

2) values.yaml파일을 복사하여 사용자정의 yaml파일 'mongodb.yaml'을 만듭니다. 

내용은 아래와 같이 합니다.  수정할 항목은 아래와 같습니다. 

- storageClass: kubeclt get sc하여 NFS dynamic provisioning에서 지정한 StorageClass명으로 변경

- auth.rootPassword, auth.username, auth.password, auth.database: 적절하게 변경 

- replicaCount: Pod 수 지정

- service.type: k8s cluster외부에서 접근하려면 NodePort로 하고 그 하위의 nodePorts.mongodb에 접근할 포트를 지정

- persistence.storageClass, persistence.size

global:
  storageClass: "nfs-retain"
## @param architecture MongoDB(&reg;) architecture (`standalone` or `replicaset`)
architecture: replicaset
##
auth:
  enabled: true
  rootUser: root
  rootPassword: "P@ssw0rd$"
  ##
  username: "u00"
  password: "P@ssw0rd$"
  database: "mydb"
##
replicaCount: 2

service:
  type: NodePort
  ports:
    mongodb: 27017
  nodePorts:
    mongodb: "32500"

persistence:
  enabled: true
  storageClass: "nfs-retain"
  accessModes:
    - ReadWriteOnce
  size: 100m

 

3) Pod 배포 

# --dry-run 옵션으로 배포 yaml이 잘 생성되는지 테스트  
$ helm install mongodb -f mongodb.yaml . --dry-run

# 배포
$ helm install mongodb -f mongodb.yaml . 

# PVC binding 체크
$ kubectl get pvc 

# Service Node Port 체크
$ kubectl get svc

# Pod 생성 확인
$ kubectl get po -w 또는 $ watch kubectl get po

* Service를 NodePort로 지정했는데 이 버전의 helm chart의 버그인지 NodePort Service 객체가 안 생김

아래 명령으로 Service객체를 수정하고 테스트 하기 바랍니다. 

$ kubectl edit svc mongodb-headless

참고) 재설치 시 기존 k8s 객체 삭제  

만약 문제가 있다면 아래와 같이 helm 으로 모든 배포 k8s 객체를 지웁니다. 

PVC와 PV객체는 수동으로 지워야 합니다. 

$ helm delete mongodb

# PVC 지우기
$ kubectl get pvc 
NAME                STATUS   VOLUME                                     
datadir-mongodb-0   Bound    pvc-ecb241e9-88af-4001-a22f-b3243b8dc683
datadir-mongodb-1   Bound    pvc-ff78cdaf-2eda-45a2-a593-29f8ab7deb9e

$ kubectl delete pvc datadir-mongodb-0 datadir-mongodb-1

# PV 지우기 (위 PVC 목록의 'VOLUME'이 PV객체명임)
$ kubectl delete pv {VOLUME}에 있는 PV명