Ceph ๊ธฐ๋ฐ˜ ์Šคํ† ๋ฆฌ์ง€๋ฅผ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ์—ฐ๊ฒฐํ•˜๋Š” ์‹ค์ œ ์˜ˆ

CSI(์ปจํ…Œ์ด๋„ˆ ์Šคํ† ๋ฆฌ์ง€ ์ธํ„ฐํŽ˜์ด์Šค)๋Š” Kubernetes์™€ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ ๊ฐ„์˜ ํ†ตํ•ฉ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งํ•œ, ์˜ค๋Š˜์€ CSI์™€ Ceph์˜ ์กฐํ•ฉ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Ceph ์Šคํ† ๋ฆฌ์ง€ ์—ฐ๊ฒฐ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—.
์ด ๊ธฐ์‚ฌ๋Š” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก ์•ฝ๊ฐ„ ๋‹จ์ˆœํ™”๋œ ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Ceph ๋ฐ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ์€ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ ๊ฐ€์š”?

Ceph ๊ธฐ๋ฐ˜ ์Šคํ† ๋ฆฌ์ง€๋ฅผ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ์—ฐ๊ฒฐํ•˜๋Š” ์‹ค์ œ ์˜ˆ

๋”ฐ๋ผ์„œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์†์‰ฝ๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฟ ๋ฒ ์Šคํ”„๋ ˆ์ด. ๊ทผ์ฒ˜์—์„œ ์ž‘๋™ํ•˜๋Š” Ceph ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด๋ถ ์„ธํŠธ. ๊ทธ๋“ค ์‚ฌ์ด์— ์ƒ์‚ฐ์„ ์œ„ํ•ด์„œ๋Š” ์ตœ์†Œ 10Gbit/s์˜ ๋Œ€์—ญํญ์„ ๊ฐ€์ง„ ๋„คํŠธ์›Œํฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์€ ์–ธ๊ธ‰ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด๊ฑฐ ๋‹ค ๋ชจ์•˜์œผ๋ฉด ๊ฐ€์ž!

๋จผ์ € Ceph ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™ํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ceph health
ceph -s

๋‹ค์Œ์œผ๋กœ RBD ๋””์Šคํฌ์šฉ ํ’€์„ ์ฆ‰์‹œ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ceph osd pool create kube 32
ceph osd pool application enable kube rbd

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € RBD์šฉ Ceph CSI ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์„ค์น˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋Œ€๋กœ Helm์„ ํ†ตํ•ด ์„ค์น˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
์ฐจํŠธ์™€ ํ•จ๊ป˜ ์ €์žฅ์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ceph-csi-rbd ์ฐจํŠธ์— ๋Œ€ํ•œ ๋ณ€์ˆ˜ ์„ธํŠธ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.yml

์ด์ œ cephrbd.yml ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด Ceph์—์„œ ๋ชจ๋‹ˆํ„ฐ์˜ ํด๋Ÿฌ์Šคํ„ฐ ID์™€ IP ์ฃผ์†Œ๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค.

ceph fsid  # ั‚ะฐะบ ะผั‹ ัƒะทะฝะฐะตะผ clusterID
ceph mon dump  # ะฐ ั‚ะฐะบ ัƒะฒะธะดะธะผ IP-ะฐะดั€ะตัะฐ ะผะพะฝะธั‚ะพั€ะพะฒ

์–ป์€ ๊ฐ’์„ cephrbd.yml ํŒŒ์ผ์— ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— PSP ์ •์ฑ…(Pod ๋ณด์•ˆ ์ •์ฑ…) ์ƒ์„ฑ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์„น์…˜์˜ ์˜ต์…˜ ๋…ธ๋“œํ”Œ๋Ÿฌ๊ทธ์ธ ะธ ์ œ๊ณต์ž ์ด๋ฏธ ํŒŒ์ผ์— ์žˆ๋Š” ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

csiConfig:
  - clusterID: "bcd0d202-fba8-4352-b25d-75c89258d5ab"
    monitors:
      - "v2:172.18.8.5:3300/0,v1:172.18.8.5:6789/0"
      - "v2:172.18.8.6:3300/0,v1:172.18.8.6:6789/0"
      - "v2:172.18.8.7:3300/0,v1:172.18.8.7:6789/0"

nodeplugin:
  podSecurityPolicy:
    enabled: true

provisioner:
  podSecurityPolicy:
    enabled: true

๋‹ค์Œ์œผ๋กœ ๋‚จ์€ ๊ฒƒ์€ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ์ฐจํŠธ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespace

์ข‹์Šต๋‹ˆ๋‹ค. RBD ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!
Kubernetes์—์„œ ์ƒˆ๋กœ์šด StorageClass๋ฅผ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‹ค์‹œ Ceph๋ฅผ ์•ฝ๊ฐ„ ์กฐ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Ceph์—์„œ ์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ์—๊ฒŒ ํ’€์— ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ํ๋ธŒ:

ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'

์ด์ œ ์•ก์„ธ์Šค ํ‚ค๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ceph auth get-key client.rbdkube

๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

์ด ๊ฐ’์„ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์˜ Secret์— ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(ํ•„์š”ํ•œ ๊ฒฝ์šฐ). ์‚ฌ์šฉ์ž ํ‚ค:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: ceph-csi-rbd
stringData:
  # ะ—ะฝะฐั‡ะตะฝะธั ะบะปัŽั‡ะตะน ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‚ ะธะผะตะฝะธ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั ะธ ะตะณะพ ะบะปัŽั‡ัƒ, ะบะฐะบ ัƒะบะฐะทะฐะฝะพ ะฒ
  # ะบะปะฐัั‚ะตั€ะต Ceph. ID ัŽะทะตั€ะฐ ะดะพะปะถะตะฝ ะธะผะตั‚ัŒ ะดะพัั‚ัƒะฟ ะบ ะฟัƒะปัƒ,
  # ัƒะบะฐะทะฐะฝะฝะพะผัƒ ะฒ storage class
  userID: rbdkube
  userKey: <user-key>

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋น„๋ฐ€์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค:

kubectl apply -f secret.yaml

๋‹ค์Œ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ StorageClass ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
   clusterID: <cluster-id>
   pool: kube

   imageFeatures: layering

   # ะญั‚ะธ ัะตะบั€ะตั‚ั‹ ะดะพะปะถะฝั‹ ัะพะดะตั€ะถะฐั‚ัŒ ะดะฐะฝะฝั‹ะต ะดะปั ะฐะฒั‚ะพั€ะธะทะฐั†ะธะธ
   # ะฒ ะฒะฐัˆ ะฟัƒะป.
   csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
   csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi-rbd
   csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
   csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi-rbd
   csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
   csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi-rbd

   csi.storage.k8s.io/fstype: ext4

reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
  - discard

์ž‘์„ฑํ•ด์•ผ ํ•จ ํด๋Ÿฌ์Šคํ„ฐID, ์šฐ๋ฆฌ ํŒ€์—์„œ ์ด๋ฏธ ๋ฐฐ์šด ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์„ธํ”„ fsid์„ ํด๋ฆญํ•˜๊ณ  ์ด ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

kubectl apply -f storageclass.yaml

ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ PVC(์˜๊ตฌ ๋ณผ๋ฅจ ์ฒญ๊ตฌ)๋ฅผ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rbd-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-rbd-sc

Kubernetes๊ฐ€ Ceph์—์„œ ์š”์ฒญ๋œ ๋ณผ๋ฅจ์„ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ–ˆ๋Š”์ง€ ์ฆ‰์‹œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

kubectl get pvc
kubectl get pv

๋ชจ๋“  ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! Ceph ์ชฝ์—์„œ๋Š” ์–ด๋–ค ๋ชจ์Šต์ธ๊ฐ€์š”?
ํ’€์˜ ๋ณผ๋ฅจ ๋ชฉ๋ก์„ ์–ป๊ณ  ๋ณผ๋ฅจ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ด…๋‹ˆ๋‹ค.

rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653  # ั‚ัƒั‚, ะบะพะฝะตั‡ะฝะพ ะถะต, ะฑัƒะดะตั‚ ะดั€ัƒะณะพะน ID ั‚ะพะผะฐ, ะบะพั‚ะพั€ั‹ะน ะฒั‹ะดะฐะปะฐ ะฟั€ะตะดั‹ะดัƒั‰ะฐั ะบะพะผะฐะฝะดะฐ

์ด์ œ RBD ๋ณผ๋ฅจ ํฌ๊ธฐ ์กฐ์ •์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
pvc.yaml ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ๋ณผ๋ฅจ ํฌ๊ธฐ๋ฅผ 2Gi๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

kubectl apply -f pvc.yaml

๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋ณผ๋ฅจ ํฌ๊ธฐ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653

kubectl get pv
kubectl get pvc

PVC์˜ ํฌ๊ธฐ๋Š” ๋ณ€ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์œ ๋ฅผ ์•Œ์•„๋ณด๋ ค๋ฉด Kubernetes์— PVC์˜ YAML ์„ค๋ช…์„ ์ฟผ๋ฆฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

kubectl get pvc rbd-pvc -o yaml

๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€: ์‚ฌ์šฉ์ž๊ฐ€ ํฌ๋“œ๋ฅผ (๋‹ค์‹œ) ์‹œ์ž‘ํ•˜์—ฌ ๋…ธ๋“œ์—์„œ ๋ณผ๋ฅจ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ ํฌ๊ธฐ ์กฐ์ •์„ ์™„๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ์œ ํ˜•: FileSystemResizePending

์ฆ‰, ๋””์Šคํฌ๋Š” ์ปค์กŒ์ง€๋งŒ ๋””์Šคํฌ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ์ปค์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ํ™•์žฅํ•˜๋ ค๋ฉด ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋‚˜๋ผ์—์„œ๋Š” ์ƒ์„ฑ๋œ PVC/PV๊ฐ€ ํ˜„์žฌ ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ๋„ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ…Œ์ŠคํŠธ Pod๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

---
apiVersion: v1
kind: Pod
metadata:
  name: csi-rbd-demo-pod
spec:
  containers:
    - name: web-server
      image: nginx:1.17.6
      volumeMounts:
        - name: mypvc
          mountPath: /data
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        claimName: rbd-pvc
        readOnly: false

์ด์ œ PVC๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

kubectl get pvc

ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์—์„œ๋Š” RBD ๋ธ”๋ก ์žฅ์น˜(Rados Block Device์˜ ์•ฝ์ž)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ–ˆ์ง€๋งŒ ์—ฌ๋Ÿฌ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ์ด ๋””์Šคํฌ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. CephFS๋Š” ๋””์Šคํฌ ์ด๋ฏธ์ง€๋ณด๋‹ค๋Š” ํŒŒ์ผ ์ž‘์—…์— ํ›จ์”ฌ ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
Ceph ๋ฐ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CephFS์™€ ์ž‘๋™ํ•˜๋„๋ก CSI ๋ฐ ๊ธฐํƒ€ ํ•„์š”ํ•œ ์—”ํ„ฐํ‹ฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด Helm ์ฐจํŠธ์—์„œ ํ•„์š”ํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค.

helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.yml

์ด๋ฒˆ์—๋„ cephfs.yml ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Ceph ๋ช…๋ น์ด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

ceph fsid
ceph mon dump

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ํŒŒ์ผ์„ ์ฑ„์šฐ์‹ญ์‹œ์˜ค.

csiConfig:
  - clusterID: "bcd0d202-fba8-4352-b25d-75c89258d5ab"
    monitors:
      - "172.18.8.5:6789"
      - "172.18.8.6:6789"
      - "172.18.8.7:6789"

nodeplugin:
  httpMetrics:
    enabled: true
    containerPort: 8091
  podSecurityPolicy:
    enabled: true

provisioner:
  replicaCount: 1
  podSecurityPolicy:
    enabled: true

๋ชจ๋‹ˆํ„ฐ ์ฃผ์†Œ๋Š” ์ฃผ์†Œ:ํฌํŠธ๋ผ๋Š” ๊ฐ„๋‹จํ•œ ํ˜•์‹์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์— cephfs๋ฅผ ๋งˆ์šดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ์ฃผ์†Œ๋Š” v2 ๋ชจ๋‹ˆํ„ฐ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„์ง ๋ชจ๋ฅด๋Š” ์ปค๋„ ๋ชจ๋“ˆ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
Kubespray๊ฐ€ ์„ค์น˜ํ•œ nginx-proxy์™€ ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก httpMetrics์šฉ ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค(Prometheus๋Š” ๋ฉ”ํŠธ๋ฆญ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด ํ•ด๋‹น ํฌํŠธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค). ์ด๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— Helm ์ฐจํŠธ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace

Ceph ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋กœ ์ด๋™ํ•˜์—ฌ ๊ฑฐ๊ธฐ์— ๋ณ„๋„์˜ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ค๋ช…์„œ์—๋Š” CephFS ํ”„๋กœ๋น„์ €๋„ˆ์— ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋ณ„๋„์˜ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. fs ์ œํ•œ๋œ ๊ถŒ๋ฆฌ:

ceph auth get-or-create client.fs mon 'allow r' mgr 'allow rw' mds 'allow rws' osd 'allow rw pool=cephfs_data, allow rw pool=cephfs_metadata'

๊ทธ๋ฆฌ๊ณ  ์ฆ‰์‹œ ๊ทธ์˜ ์•ก์„ธ์Šค ํ‚ค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ceph auth get-key client.fs

Secret๊ณผ StorageClass๋ฅผ ๋ณ„๋„๋กœ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ RBD์˜ ์˜ˆ์—์„œ ์ด๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-cephfs-secret
  namespace: ceph-csi-cephfs
stringData:
  # ะะตะพะฑั…ะพะดะธะผะพ ะดะปั ะดะธะฝะฐะผะธั‡ะตัะบะธ ัะพะทะดะฐะฒะฐะตะผั‹ั… ั‚ะพะผะพะฒ
  adminID: fs
  adminKey: <ะฒั‹ะฒะพะด ะฟั€ะตะดั‹ะดัƒั‰ะตะน ะบะพะผะฐะฝะดั‹>

๋งค๋‹ˆํŽ˜์ŠคํŠธ ์ ์šฉ:

kubectl apply -f secret.yaml

์ด์ œ ๋ณ„๋„์˜ StorageClass๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
  clusterID: <cluster-id>

  # ะ˜ะผั ั„ะฐะนะปะพะฒะพะน ัะธัั‚ะตะผั‹ CephFS, ะฒ ะบะพั‚ะพั€ะพะน ะฑัƒะดะตั‚ ัะพะทะดะฐะฝ ั‚ะพะผ
  fsName: cephfs

  # (ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝะพ) ะŸัƒะป Ceph, ะฒ ะบะพั‚ะพั€ะพะผ ะฑัƒะดัƒั‚ ั…ั€ะฐะฝะธั‚ัŒัั ะดะฐะฝะฝั‹ะต ั‚ะพะผะฐ
  # pool: cephfs_data

  # (ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝะพ) ะ ะฐะทะดะตะปะตะฝะฝั‹ะต ะทะฐะฟัั‚ั‹ะผะธ ะพะฟั†ะธะธ ะผะพะฝั‚ะธั€ะพะฒะฐะฝะธั ะดะปั Ceph-fuse
  # ะฝะฐะฟั€ะธะผะตั€:
  # fuseMountOptions: debug

  # (ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝะพ) ะ ะฐะทะดะตะปะตะฝะฝั‹ะต ะทะฐะฟัั‚ั‹ะผะธ ะพะฟั†ะธะธ ะผะพะฝั‚ะธั€ะพะฒะฐะฝะธั CephFS ะดะปั ัะดั€ะฐ
  # ะกะผ. man mount.ceph ั‡ั‚ะพะฑั‹ ัƒะทะฝะฐั‚ัŒ ัะฟะธัะพะบ ัั‚ะธั… ะพะฟั†ะธะน. ะะฐะฟั€ะธะผะตั€:
  # kernelMountOptions: readdir_max_bytes=1048576,norbytes

  # ะกะตะบั€ะตั‚ั‹ ะดะพะปะถะฝั‹ ัะพะดะตั€ะถะฐั‚ัŒ ะดะพัั‚ัƒะฟั‹ ะดะปั ะฐะดะผะธะฝะฐ ะธ/ะธะปะธ ัŽะทะตั€ะฐ Ceph.
  csi.storage.k8s.io/provisioner-secret-name: csi-cephfs-secret
  csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi-cephfs
  csi.storage.k8s.io/controller-expand-secret-name: csi-cephfs-secret
  csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi-cephfs
  csi.storage.k8s.io/node-stage-secret-name: csi-cephfs-secret
  csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi-cephfs

  # (ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝะพ) ะ”ั€ะฐะนะฒะตั€ ะผะพะถะตั‚ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะปะธะฑะพ ceph-fuse (fuse), 
  # ะปะธะฑะพ ceph kernelclient (kernel).
  # ะ•ัะปะธ ะฝะต ัƒะบะฐะทะฐะฝะพ, ะฑัƒะดะตั‚ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒัั ะผะพะฝั‚ะธั€ะพะฒะฐะฝะธะต ั‚ะพะผะพะฒ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ,
  # ัั‚ะพ ะพะฟั€ะตะดะตะปัะตั‚ัั ะฟะพะธัะบะพะผ ceph-fuse ะธ mount.ceph
  # mounter: kernel
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
  - debug

์—ฌ๊ธฐ์„œ ์ฑ„์›Œ๋ณด์ž ํด๋Ÿฌ์Šคํ„ฐID Kubernetes์— ์ ์šฉ ๊ฐ€๋Šฅ:

kubectl apply -f storageclass.yaml

ะŸั€ะพะฒะตั€ะบะฐ

ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „ ์˜ˆ์™€ ๊ฐ™์ด PVC๋ฅผ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-cephfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  storageClassName: csi-cephfs-sc

๊ทธ๋ฆฌ๊ณ  PVC/PV๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

kubectl get pvc
kubectl get pv

CephFS์˜ ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ณด๋ ค๋ฉด ์ด ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์–ด๋”˜๊ฐ€์— ๋งˆ์šดํŠธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Ceph ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

# ะขะพั‡ะบะฐ ะผะพะฝั‚ะธั€ะพะฒะฐะฝะธั
mkdir -p /mnt/cephfs

# ะกะพะทะดะฐั‘ะผ ั„ะฐะนะป ั ะบะปัŽั‡ะพะผ ะฐะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ะฐ
ceph auth get-key client.admin >/etc/ceph/secret.key

# ะ”ะพะฑะฐะฒะปัะตะผ ะทะฐะฟะธััŒ ะฒ /etc/fstab
# !! ะ˜ะทะผะตะฝัะตะผ ip ะฐะดั€ะตั ะฝะฐ ะฐะดั€ะตั ะฝะฐัˆะตะณะพ ัƒะทะปะฐ
echo "172.18.8.6:6789:/ /mnt/cephfs ceph name=admin,secretfile=/etc/ceph/secret.key,noatime,_netdev    0       2" >> /etc/fstab

mount /mnt/cephfs

๋ฌผ๋ก  ์ด์™€ ๊ฐ™์€ Ceph ๋…ธ๋“œ์— FS๋ฅผ ๋งˆ์šดํŠธํ•˜๋Š” ๊ฒƒ์€ ํ›ˆ๋ จ ๋ชฉ์ ์—๋งŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋Ÿผ ์ฝ”์Šค. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ˆ„๊ตฌ๋„ ์ด๋Ÿฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ํŒŒ์ผ์„ ์‹ค์ˆ˜๋กœ ์‚ญ์ œํ•  ์œ„ํ—˜์ด ๋†’์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ CephFS์˜ ๊ฒฝ์šฐ ๋ณผ๋ฅจ ํฌ๊ธฐ ์กฐ์ •์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Kubernetes๋กœ ๋Œ์•„๊ฐ€์„œ PVC์— ๋Œ€ํ•œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ํŽธ์ง‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด 7Gi๋กœ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค.

ํŽธ์ง‘๋œ ํŒŒ์ผ์„ ์ ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

kubectl apply -f pvc.yaml

ํ• ๋‹น๋Ÿ‰์ด ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๋งˆ์šดํŠธ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

getfattr -n ceph.quota.max_bytes <ะบะฐั‚ะฐะปะพะณ-ั-ะดะฐะฝะฝั‹ะผะธ>

์ด ๋ช…๋ น์ด ์ž‘๋™ํ•˜๋ ค๋ฉด ์‹œ์Šคํ…œ์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์†์„ฑ.

๋ˆˆ์ด ๋‘๋ ต๊ณ  ์†์ด

์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ฃผ๋ฌธ๊ณผ ๊ธด YAML ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ํ‘œ๋ฉด์ ์œผ๋กœ๋Š” ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ Slurm ํ•™์ƒ๋“ค์€ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ต์ˆ™ํ•ด์ง‘๋‹ˆ๋‹ค.
์ด ๊ธฐ์‚ฌ์—์„œ ์šฐ๋ฆฌ๋Š” ์ •๊ธ€ ์†์œผ๋กœ ๊นŠ์ด ๋“ค์–ด ๊ฐ€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ณต์‹ ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋กœ Ceph ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์„ค์ •ํ•˜๋Š” ์„ธ๋ถ€ ์ •๋ณด์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ๋งํฌ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณผ๋ฅจ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” Kubernetes์˜ ์ผ๋ฐ˜ ์›์น™
RBD ๋ฌธ์„œ
Ceph ๊ด€์ ์—์„œ RBD์™€ Kubernetes ํ†ตํ•ฉ
CSI ๊ด€์ ์—์„œ RBD์™€ Kubernetes ํ†ตํ•ฉ
์ผ๋ฐ˜ CephFS ๋ฌธ์„œ
CSI ๊ด€์ ์—์„œ CephFS์™€ Kubernetes ํ†ตํ•ฉ

์Šฌ๋Ÿผ ์ฝ”์Šค์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ ์ด์Šค ์ข€ ๋” ๋‚˜์•„๊ฐ€ CephFS๋ฅผ ํŒŒ์ผ ์Šคํ† ๋ฆฌ์ง€๋กœ ์‚ฌ์šฉํ•  ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Kubernetes์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GET/POST ์š”์ฒญ์„ ํ†ตํ•ด Ceph์—์„œ ํŒŒ์ผ์„ ์ „์†กํ•˜๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ์ €์žฅ์— ๋” ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๊ฐ€์ž…ํ•˜์„ธ์š”. Ceph์˜ ์ƒˆ๋กœ์šด ์ฝ”์Šค. ๋ฒ ํƒ€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ๊ฐ•์ขŒ๋ฅผ ํ• ์ธ๋œ ๊ฐ€๊ฒฉ์œผ๋กœ ์ˆ˜๊ฐ•ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ•์ขŒ ๋‚ด์šฉ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์‚ฌ ์ž‘์„ฑ์ž: Alexander Shvalov, ํ˜„์ง ์—”์ง€๋‹ˆ์–ด ์‚ฌ์šฐ์Šค ๋ธŒ๋ฆฌ์ง€, ๊ณต์ธ Kubernetes ๊ด€๋ฆฌ์ž, Slurm ๊ณผ์ •์˜ ์ €์ž ๋ฐ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

DDoS ๋ณดํ˜ธ, VPS VDS ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ํ˜ธ์ŠคํŒ… ๊ตฌ์ž… ๐Ÿ”ฅ DDoS ๊ณต๊ฒฉ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ์•ˆ์ •์ ์ธ ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…, VPS ๋ฐ VDS ์„œ๋ฒ„๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š” | ProHoster