[k8s] Dynamic Provisioning์„ ํ†ตํ•ด ์Šคํ† ๋ฆฌ์ง€ ๋ฆฌ์†Œ์Šค ์ž๋™์œผ๋กœ ํ• ๋‹น๋ฐ›๊ธฐ

ํ”„๋กœ๋น„์ €๋‹(provisioning)์ด๋ž€?

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ํ”„๋กœ๋น„์ €๋‹์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ €์žฅ์†Œ์™€ ๊ด€๋ จํ•˜์—ฌ ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์„œ๋น„์Šค์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ €์žฅ์†Œ ์ž์›์„ ํ• ๋‹นํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค. 

 

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—” 2๊ฐ€์ง€ ์œ ํ˜•์˜ ํ”„๋กœ๋น„์ €๋‹์ด ์žˆ๋‹ค. 

 

 

1. ์ •์  ํ”„๋กœ๋น„์ €๋‹

์ •์  ํ”„๋กœ๋น„์ €๋‹์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ Persistent Volume(PV)์„ ์ƒ์„ฑํ•˜๋ฉฐ, ํ•ด๋‹น PV์˜ ์šฉ๋Ÿ‰, ์•ก์„ธ์Šค ๋ชจ๋“œ ๋ฐ ์ €์žฅ์†Œ ์œ ํ˜•๊ณผ ๊ฐ™์€ ํ•˜์œ„ ์ €์žฅ์†Œ์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ PV๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ฑํ•˜๋Š” Persistent Volume Claim(PVC)์—์„œ ์š”์ฒญ๋  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ PVC๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ํ•ด๋‹น PVC์˜ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ์ผ์น˜ํ•˜๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ PV์— ๋ฐ”์ธ๋”ฉํ•œ๋‹ค. 

 

 

2. ๋™์  ํ”„๋กœ๋น„์ €๋‹

๋™์  ํ”„๋กœ๋น„์ €๋‹์—์„œ๋Š” PVC์š”์ฒญ์— ๋Œ€ํ•œ PV๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์„ ์ž๋™ํ™”ํ•œ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” PV์ƒ์„ฑ์„ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์ธ StorageClass๋ฅผ ์ •์˜ํ•œ๋‹ค. ๊ฐ StorageClass๋Š” PV๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฑ…์ž„์ด ์žˆ๋Š” ํ”„๋กœ๋น„์ €๋„ˆ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • StorageClass๋ฅผ ์ฐธ์กฐํ•˜๋Š” PVC๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ํ”„๋กœ๋น„์ €๋„ˆ๋Š” PVC์˜ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ์ผ์น˜ํ•˜๋Š” PV๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž์˜ ์ˆ˜๋™ ๊ฐœ์ž…์„ ์—†์• ์ค€๋‹ค. 

 

 

 

ํ™˜๊ฒฝ ๊ตฌ์„ฑ

Dynamic Provisioning์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค. 

ex) STORAGEOS, NFS

 

์„ค์น˜๋ฅผ ์™„๋ฃŒํ•˜๋ฉด Service/Pod/Secret ๋“ฑ์˜ ์—ฌ๋Ÿฌ Object๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. 

 

Dynamic Provisioning์„ ์‚ฌ์šฉํ•˜๋ฉด PV๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, ๋ณผ๋ฅจ์ด ๋ฐ”๋กœ ์ƒ์„ฑ ๋ฉ๋‹ˆ๋‹ค. PV๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Pod๊ฐ€ ์—ฐ๊ฒฐ ๋  ๋•Œ Volume ์ด ์ƒ์„ฑ๋œ๋‹ค. 

 

 

์•„๋ž˜์™€ ๊ฐ™์ด default๋ฅผ ์„ค์ •ํ•˜๋ฉด PVC๋ฅผ ์ƒ์„ฑํ•  ๋•Œ StorageClassName์„ ์ƒ๋žตํ•˜๋ฉด default StorageClass๊ฐ€ ์ ์šฉ์ด๋˜์–ด ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค. 

 

 

 

StorageOS Operator ์„ค์น˜๋ถ€ํ„ฐ ํ•ด๋ณด์ž.

# ์„ค์น˜
kubectl apply -f https://github.com/storageos/cluster-operator/releases/download/1.5.0/storageos-operator.yaml

# ์„ค์น˜ ํ™•์ธ 
kubectl get all -n storageos-operator

# Deployment ์ˆ˜์ •
kubectl edit deployments.apps storageos-cluster-operator -n storageos-operator

# spec.containers.env์˜ DISABLE_SCHEDULER_WEBHOOK์˜ Value๋ฅผ true๋กœ ์„ค์ •
spec:
  containers:
  - command:
    - cluster-operator
    env:
    - name: DISABLE_SCHEDULER_WEBHOOK
      value: "false"    # true ๋กœ ๋ณ€๊ฒฝ
    image: storageos/cluster-operator:1.5.0
    imagePullPolicy: IfNotPresent

 

 

๊ด€๋ฆฌ ๊ณ„์ •์„ ์œ„ํ•œ Secret ์ƒ์„ฑ (username ๋ฐ password๋ฅผ Base64๋ฌธ์ž๋กœ ๋งŒ๋“ค๊ธฐ)

echo -n "admin" | base64
echo -n "1234" | base64

 

 

apiUsername ๋ฐ apiPassword ๋ถ€๋ถ„์— ์œ„ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ ๋ฌธ์ž ๋„ฃ๊ธฐ

kubectl create -f - <<END
apiVersion: v1
kind: Secret
metadata:
  name: "storageos-api"
  namespace: "storageos-operator"
  labels:
    app: "storageos"
type: "kubernetes.io/storageos"
data:
  apiUsername: YWRtaW4=  # admin
  apiPassword: MTIzNA==  # 1234
END

 

 

Dashboard ์ ‘์†์„ ์œ„ํ•œ Service ์ˆ˜์ •

kubectl edit service storageos -n storageos

 

 

spec์— externalIPs์™€ Master IP ์ถ”๊ฐ€

spec:
  clusterIP: 10.109.77.121
  externalIPs:     # ์ถ”๊ฐ€
  - 192.168.0.30   # Master IP ์ถ”๊ฐ€
  ports:

 

 

์ ‘์†

http://192.168.0.30:5705/

 

 

Default StorageClass ์ถ”๊ฐ€

kubectl apply -f - <<END
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: default
  annotations: 
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/storageos
parameters:
  adminSecretName: storageos-api
  adminSecretNamespace: storageos-operator
  fsType: ext4
  pool: default
END

 

StorageClass ํ™•์ธ

kubectl get storageclasses.storage.k8s.io
NAME                PROVISIONER               AGE
default (default)   kubernetes.io/storageos   3s
fast                kubernetes.io/storageos   59s

 

 

1. PersistentVolume (PV 2๊ฐœ ์ƒ์„ฑ)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-hostpath1
spec:
  capacity:
    storage: 1G
  accessModes:
  - ReadWriteOnce
  hostPath:
    path: /mnt/hostpath
    type: DirectoryOrCreate
    
--------------------
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-hostpath2
spec:
  capacity:
    storage: 2G
  accessModes:
  - ReadWriteOnce
  hostPath:
    path: /mnt/hostpath
    type: DirectoryOrCreate

 

2. PersistentVolumeClaim (์ •์ 1๊ฐœ, ๋™์ 2๊ฐœ)

# ์ง์ ‘ ์—ฐ๊ฒฐ
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-hostpath1
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1G
  storageClassName: ""
----------------

# ๋™์  ์—ฐ๊ฒฐ
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-fast1
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1G
  storageClassName: "fast"
  --------------
  
# ๋™์  ์—ฐ๊ฒฐ
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-default1
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2G

 

์œ„์™€ ๊ฐ™์ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด PV๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ด๋•Œ ์ƒ์œ„ 2๊ฐœ๋Š” ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ๋…ธ๋“œ์— ์‹ค์ œ ๋ณผ๋ฅจ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ๋์ง€๋งŒ, ๋„ค๋ฒˆ์งธ ๊ฒฝ์šฐ์—” ์ง์ ‘ ์—ฐ๊ฒฐํ–ˆ๊ณ  Pod์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณผ๋ฅจ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๋‹ค. ๋˜ํ•œ ๋™์ ์œผ๋กœ ๋งŒ๋“  ๊ฒฝ์šฐ PV๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

 

 

 

Status & ReclaimPolicy

Status๋Š” ์ตœ์ดˆ PV๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์„ ๋•Œ Available ์ƒํƒœ์ด๊ณ  PVC์™€ ์—ฐ๊ฒฐ์ด ๋˜๋ฉด Bound ์ƒํƒœ๋กœ ๋ณ€ํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

PV ์ง์ ‘ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—” PV์˜ Status๊ฐ€ ์ตœ์ดˆ Available์ด๊ณ , PVC์™€ ์—ฐ๊ฒฐ๋œ๋‹ค๋ฉด PV์˜ Status๋Š” Bound ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ํ•˜์ง€๋งŒ PVC์™€ ์—ฐ๊ฒฐ๋œ๋‹ค๊ณ  ๋ณผ๋ฅจ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , Pod๊ฐ€ PVC๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌ๋™์ด ๋  ๋•Œ ์‹ค์ œ ๋ณผ๋ฅจ์ด ๋งŒ๋“ค์–ด ์ง„๋‹ค.

 

 

๋งŒ์•ฝ ์ดํ›„์— Pod๊ฐ€ ์‚ญ์ œ๋  ๊ฒฝ์šฐ PV/PVC์—๋Š” ์•„๋ฌด ๋ณ€ํ™”๊ฐ€ ์—†๊ณ  Bound ์ƒํƒœ๊ฐ€ ์œ ์ง€ ๋œ๋‹ค. ์ด ๋•Œ PVC๋ฅผ ์‚ญ์ œํ•ด์•ผ์ง€๋งŒ PV์™€ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด์„œ PV๊ฐ€ Released ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

PV์™€ ์‹ค์ œ Data๊ฐ„์˜ ์—ฐ๊ฒฐ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ Failed ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

 

 

 

PVC๊ฐ€ ์‚ญ์ œ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ PV์— ์„ค์ •ํ•ด ๋†“์€ RecalimPolicy์— ๋”ฐ๋ผ PV์˜ ์ƒํƒœ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š”๋ฐ Retain / Delete / Recycle 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • Retain: Default, ๋ฐ์ดํ„ฐ ๋ณด์กด, ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • Delete: StorageClass๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ๋ณผ๋ฅจ์˜ Default ์ •์ฑ…, Volume์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜๊ธฐ๋„ ์•ˆ๋˜๊ธฐ๋„ ํ•จ,์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • Recycle: Deprecated ๋œ ์˜ต์…˜, ๋ฐ์ดํ„ฐ ์‚ญ์ œ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ