ํ๋ก๋น์ ๋(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 ๋ ์ต์ , ๋ฐ์ดํฐ ์ญ์ , ์ฌ์ฌ์ฉ ๊ฐ๋ฅ