1. 기존 Helm chart 설치, 업그레이드, 삭제
이번 장에서는 공개된 오픈소스소프트웨어의 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
먼저 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® architecture. Allowed values: `standalone` or `replication`
architecture: replication
##
auth:
##
enabled: true
sentinel: true
##
password: "P@ssw0rd$"
##
master:
## @param master.count Number of Redis® 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(®) 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명