1. Helm ๊ตฌ์„ฑ ๋ฐ ์‚ฌ์šฉ

- Helm ๋‹ค์šด๋กœ๋“œ ๋ฐ ์„ค์น˜

์œˆ๋„์šฐ ์„ค์น˜

  • Chocolatey ์„ค์น˜
    PowerShell ์„ ์—ด์–ด์„œ ์•„๋ž˜ ๋ช…๋ น์„ ์ˆ˜ํ–‰ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ google cloud sdk ๋ฅผ ์„ค์น˜ ํ•˜๋ฉด์„œ ์„ค์น˜ ๋˜์—ˆ์„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
  
  • Helm ์„ค์น˜
  choco install kubernetes-helm
  

Mac / LINUX ์„ค์น˜

  • ์ˆ˜๋™ ์„ค์น˜ ๋ฐฉ๋ฒ•
  # helm ๋‹ค์šด๋กœ๋“œ
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

# ์‹คํ–‰๊ถŒํ•œ ๋ณ€๊ฒฝ
chmod 700 get_helm.sh

# helm ์„ค์น˜
./get_helm.sh

# ๋ฒ„์ „ ํ™•์ธ
helm version

# Helm Repository ์ถ”๊ฐ€
helm repo add stable https://charts.helm.sh/stable

# Repository ์—…๋ฐ์ดํŠธ 
helm repo update
  
  • Brew ์„ค์น˜
  brew install helm
  

2. Mysql Helm ์ฐจํŠธ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์„ค์น˜

- mysql helm ๊ฒ€์ƒ‰

  helm search repo stable/mysql

NAME                CHART VERSION    APP VERSION    DESCRIPTION
stable/mysql        1.6.3            5.7.28         Fast, reliable, scalable, and easy to use open-...
stable/mysqldump    2.6.0            2.4.1          A Helm chart to help backup MySQL databases usi...
  

- ํ”ผํ‚ค์ง€ ๋ฉ”ํƒ€ ์ •๋ณด ๋ณด๊ธฐ

  helm show chart stable/mysql

apiVersion: v1
appVersion: 5.7.28
description: Fast, reliable, scalable, and easy to use open-source relational database
  system.
home: https://www.mysql.com/
icon: https://www.mysql.com/common/logos/logo-mysql-170x115.png
keywords:
- mysql
- database
- sql
maintainers:
- email: o.with@sportradar.com
  name: olemarkus
- email: viglesias@google.com
  name: viglesiasce
name: mysql
sources:
- https://github.com/kubernetes/charts
- https://github.com/docker-library/mysql
version: 1.6.3
  

- mysql helm ์ฐจํŠธ ์„ค์น˜ ๋ฐ Deployment

  helm install mysql stable/mysql 

AME: mysql-1588321002
LAST DEPLOYED: Fri May  1 08:16:55 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
mysql-1588321002.default.svc.cluster.local

To get your root password run:

    MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)

i99OpY3CRp
To connect to your database:

1. Run an Ubuntu pod that you can use as a client:

    kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il

2. Install the mysql client:

    $ apt-get update && apt-get install mysql-client -y

3. Connect using the mysql cli, then provide your password:
    $ mysql -h mysql -p

To connect to your database directly from outside the K8s cluster:
    MYSQL_HOST=127.0.0.1
    MYSQL_PORT=3306

    # Execute the following command to route the connection:
    kubectl port-forward svc/mysql-1588321002 3306

    mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
  
  helm ls

NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS         C
HART            APP VERSION
mysql-1588321701        default         1               2020-05-01 17:28:25.322363879 +0900 +09 deployed       m
ysql-1.6.3      5.7.28
  

- helm ์ฐจํŠธ uninstall

  heml list

NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS         C
HART            APP VERSION
mysql-1588321701        default         1               2020-05-01 17:28:25.322363879 +0900 +09 deployed       m
ysql-1.6.3      5.7.28


helm uninstall mysql-1588321701
release "mysql-1588321701" uninstalled
  

3. Helm ์ฐจํŠธ ๋งŒ๋“ค๊ธฐ

- Helm ์ฐจํŠธ ์ƒ์„ฑ

  helm create nginxstd
  

- Template ํŒŒ์ผ ์ˆ˜์ •

  • Charts.yaml ํŒŒ์ผ ์ˆ˜์ •
  apiVersion: v2
name: nginx-std
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
  
  • Template/deployment.yaml ํŒŒ์ผ ์ƒ์„ฑ
  apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.container.name }}
spec:
  replicas: {{ .Values.replicas }}
  selector:
    matchLabels:
      app: {{ .Values.container.name }}
  template:
    metadata:
      labels:
        app: {{ .Values.container.name }}
        environment: {{ .Values.environment }}
    spec:
      containers:
        - name: {{ .Values.container.name }}
          image: {{ .Values.container.image }}:{{ .Values.container.tag }}
          ports:
            - containerPort: {{ .Values.container.port }}
          env:
            - name: environment
              value: {{ .Values.environment }}
  
  • template/service.yaml ํŒŒ์ผ ์ƒ์„ฑ
  apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.container.name }}-service
  labels:
    app: {{ .Values.container.name }}
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: {{ .Values.container.port }}
  selector:
    app: {{ .Values.container.name }}
  type: LoadBalancer
  
  • values.yaml ํŒŒ์ผ ์ƒ์„ฑ
  environment: development
container:
  name: nginx
  port: 80
  image: nginx
  tag: latest
replicas: 2
  

- ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ

  • K8s ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
  helm install nginxstd ./nginxstd
  
  • ์‚ญ์ œ
  # ํ™•์ธ
kubectl get all
helm list

# ์‚ญ์ œ 
helm uninstall nginxstd
  

4. ํŒจํ‚ค์ง€ ๋ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ƒ์„ฑ

- ํŒจํ‚ค์ง€ ์ƒ์„ฑ

  helm package ./nginxstd

mkdir prod

mv ./nginx-std-0.1.0.tgz ./prod/
  

- helm ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํŒŒ์ผ ์ƒ์„ฑ

  # ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํŒŒ์ผ ์ƒ์„ฑ (index.yaml)
heml repo index ./prod

# ํŒŒ์ผ ์ƒ์„ฑ ํ™•์ธ
cat ./prod/index.yaml
  

5 Helm ํŒจํ‚ค์ง€ ๋ฐ Repository ๊ตฌ์„ฑํ•˜๊ธฐ

- Github.com Repository ์ƒ์„ฑ

  • repository ์ƒ์„ฑ

  • github page ์„ค์ •

- Git repository ์ƒ์„ฑ ๋ฐ ๋™๊ธฐํ™”

  cd prod

git init

git add .

git brancb -m main 

git commit -a -m "initial commit"

git remote add origin https://github.com/dangtong76/helm-prod.git

git push origin main
  

- Helm ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ตฌ์„ฑ ๋ฐ ์ถ”๊ฐ€

  • Git page ๋กœ ์„œ๋น„์Šค ๋˜๋Š” Git ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ Helm ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ถ”๊ฐ€
  helm repo add helm-prod https://dangtong76.github.io/helm-prod
  
  • ์ถ”๊ฐ€ํ™•์ธ
  helm repo list

helm search repo nginx
  

- Helm ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— redis ์ถ”๊ฐ€

  • redis ์•ˆ์ •๋ฒ„์ „ ์ฐจํŠธ๋ฅผ ๋กœ์ปฌ prod ๋””๋ ‰ํ† ๋ฆฌ์— ๋‹ค์šด๋กœ๋“œ
  helm search repo redis

helm fetch stable/redis -d ./prod
  
  • index.yaml ๊ฐฑ์‹ฑ
  helm repo index ./prod
  
  • git ์—…๋ฐ์ดํŠธ
  git status

git add .

git commit -a -m "add redis"

git push origin master
  
  • helm update ์ˆ˜ํ–‰
  helm repo update

helm search repo redis
  

์—…๋ฐ์ดํŠธ ์—†์ด “helm search repo redis” ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๊ฒ€์ƒ‰์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

6 Helm ์ฐจํŠธ ์—…๊ทธ๋ ˆ์ด๋“œ

- Repository ๋ฅผ ํ†ตํ•œ Helm ์ธ์Šคํ†จ

  helm list

helm install nginxstd helm-prod/nginx-std
# ๋˜๋Š” 
helm install helm-prod/nginx-std --generate-name

#ํ™•์ธ
helm status nginxstd
kubectl get all 
  

- helm ๋ฉ”๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ํ†ตํ•œ ์ฐจํŠธ ๋ณ€๊ฒฝ ๋ฐ ์—…๋ฐ์ดํŠธ

  • stage-values.yaml ํŒŒ์ผ ์ƒ์„ฑ
  environment: development
replicas: 4
  
  • helm upgrade ๋กœ ์ฐจํŠธ ๋ณ€๊ฒฝ ์ ์šฉ
  helm upgrade -f ./nginxstd/stage-values.yaml nginxstd helm-prod/nginx-std
  
  • helm history ๋กœ ํ™•์ธ
  helm history
  
  • RollBack ์ˆ˜ํ–‰
  helm rollback nginxstd 1
  
  • Rollback ํ™•์ธ
  helm history nginxstd

helm helm status nginxstd

kubectl get po 
  

- Helm CLI ์˜ต์…˜์„ ํ†ตํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ

  • ํ˜„์žฌ ์ฐจํŠธ์˜ value ๋ฅผ ํ™”์ธ
  helm show values helm-prod/nginx-std

environment: development
container:
  name: nginx
  port: 80
  image: nginx:1.7.9
  tag: hello
replicas: 2
  
  • CLI ์˜ต์…˜์„ ํ†ตํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ
  helm upgrade --set replicas=4 --set environment=dev nginxstd helm-prod/nginx-std
  
  • ํ™•์ธ
  helm history

helm status nginxstd

kubectl get po
  

7 ์‚ญ์ œ

  helm uninstall nginxstd
  

[์—ฐ์Šต๋ฌธ์ œ] 11-1. Helm ์ฐจํŠธ ์„ค์น˜ ์‹ค์Šต

๋ฌธ์ œ:

  1. Helm ์ €์žฅ์†Œ์—์„œ stable/mysql ์ฐจํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋ณด์„ธ์š”.
  2. Helm์„ ์ด์šฉํ•ด mydb๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ MySQL์„ ์„ค์น˜ํ•˜๊ณ , root ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ rootpw1234๋กœ ์ง€์ •ํ•˜์„ธ์š”.
  3. ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋œ ํ›„, kubectl ๋ช…๋ น์–ด๋กœ MySQL์˜ root ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”.

ํžŒํŠธ:

  • helm search repo ๋ช…๋ น์–ด๋กœ ์ฐจํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • --set ์˜ต์…˜์œผ๋กœ ์ฐจํŠธ์˜ ๊ฐ’์„ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” Secret์— base64๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

[์—ฐ์Šต๋ฌธ์ œ] 11-2. Helm ์ฐจํŠธ ๊ฐ’ ์˜ค๋ฒ„๋ผ์ด๋“œ ์‹ค์Šต

๋ฌธ์ œ:

  • Helm์„ ์ด์šฉํ•ด mydb2๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ MySQL์„ ์„ค์น˜ํ•˜์„ธ์š”.
  • ๋‹ค์Œ ๊ฐ’์„ ์ง์ ‘ ์ง€์ •ํ•˜์„ธ์š”:
    • MySQL ์‚ฌ์šฉ์ž๋ช…: user1
    • MySQL ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ: pw5678
    • ์ƒ์„ฑํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„: testdb
    • root ๋น„๋ฐ€๋ฒˆํ˜ธ: rootpw1234

ํžŒํŠธ:

  • ์—ฌ๋Ÿฌ ๊ฐ’์„ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ๋•Œ๋Š” --set ์˜ต์…˜์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์‰ผํ‘œ(,)๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[์—ฐ์Šต๋ฌธ์ œ] 11-3. Helm ์ฐจํŠธ ์ง์ ‘ ๋งŒ๋“ค๊ธฐ

๋ฌธ์ œ:

  1. nginx-std๋ผ๋Š” ์ด๋ฆ„์˜ Helm ์ฐจํŠธ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.
  2. ์ƒ์„ฑ๋œ ์ฐจํŠธ์˜ values.yaml ํŒŒ์ผ์—์„œ replica ์ˆ˜๋ฅผ 3, ํ™˜๊ฒฝ(environment)์„ prod๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”.
  3. ์ˆ˜์ •ํ•œ ์ฐจํŠธ๋ฅผ mynginx๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์„ค์น˜ํ•˜์„ธ์š”.

ํžŒํŠธ:

  • helm create ๋ช…๋ น์–ด๋กœ ์ฐจํŠธ ๋ผˆ๋Œ€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • values.yaml ํŒŒ์ผ์—์„œ ๊ธฐ๋ณธ๊ฐ’์„ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์„ธ์š”.
  • ์„ค์น˜ ์‹œ ์ฐจํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.