ตัวอย่างจริงของการเชื่อมต่อที่เก็บข้อมูลที่ใช้ Ceph กับคลัสเตอร์ Kubernetes

Container Storage Interface (CSI) เป็นอินเทอร์เฟซแบบรวมระหว่าง Kubernetes และระบบจัดเก็บข้อมูล เราได้พูดคุยเกี่ยวกับมันสั้น ๆ แล้ว บอกและวันนี้เราจะมาดูการผสมผสานระหว่าง CSI และ Ceph โดยละเอียดยิ่งขึ้น เราจะแสดงให้เห็นว่าทำอย่างไร เชื่อมต่อที่เก็บข้อมูล Ceph ไปยังคลัสเตอร์ Kubernetes
บทความนี้ให้ตัวอย่างจริงแม้ว่าจะเรียบง่ายเล็กน้อยเพื่อความสะดวกในการรับรู้ เราไม่พิจารณาติดตั้งและกำหนดค่าคลัสเตอร์ Ceph และ Kubernetes

คุณสงสัยหรือไม่ว่ามันทำงานอย่างไร?

ตัวอย่างจริงของการเชื่อมต่อที่เก็บข้อมูลที่ใช้ Ceph กับคลัสเตอร์ Kubernetes

ดังนั้น คุณจะมีคลัสเตอร์ Kubernetes ที่ใช้งานอยู่เพียงปลายนิ้ว เช่น คิวบีสเปรย์. มีคลัสเตอร์ Ceph ทำงานอยู่ใกล้ๆ คุณสามารถติดตั้งคลัสเตอร์ดังกล่าวได้ด้วยสิ่งนี้ ชุดเพลย์บุ๊ก. ฉันหวังว่าไม่จำเป็นต้องพูดถึงว่าสำหรับการผลิตระหว่างพวกเขาจะต้องมีเครือข่ายที่มีแบนด์วิธอย่างน้อย 10 Gbit/s

ถ้าคุณมีครบขนาดนี้แล้ว ไปกันเลย!

ขั้นแรก ไปที่หนึ่งในโหนดคลัสเตอร์ Ceph และตรวจสอบว่าทุกอย่างเป็นไปตามลำดับ:

ceph health
ceph -s

ต่อไป เราจะสร้างพูลสำหรับดิสก์ RBD ทันที:

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

มาดูคลัสเตอร์ Kubernetes กันดีกว่า ก่อนอื่นเราจะติดตั้งไดรเวอร์ Ceph CSI สำหรับ RBD เราจะติดตั้งผ่าน 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

ตอนนี้คุณต้องกรอกไฟล์ cephbd.yml ในการดำเนินการนี้ ให้ค้นหา ID คลัสเตอร์และที่อยู่ IP ของจอภาพใน Ceph:

ceph fsid  # так мы узнаем clusterID
ceph mon dump  # а так увидим IP-адреса мониторов

เราป้อนค่าที่ได้รับลงในไฟล์ cephrbd.yml ในขณะเดียวกัน เราก็เปิดใช้งานการสร้างนโยบาย PSP (นโยบายความปลอดภัยของ Pod) ตัวเลือกในส่วนต่างๆ nodeplugin и ผู้จัดเตรียม ในไฟล์อยู่แล้วสามารถแก้ไขได้ดังนี้

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 ใช้งานได้!
มาสร้าง StorageClass ใหม่ใน Kubernetes กันดีกว่า สิ่งนี้จำเป็นต้องแก้ไข 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==

มาเพิ่มค่านี้ให้กับ Secret ในคลัสเตอร์ Kubernetes - ในจุดที่เราต้องการ กุญแจผู้ใช้:

---
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

จำเป็นต้องกรอก รหัสคลัสเตอร์ซึ่งเราได้เรียนรู้จากทีมงานแล้ว เซ็ฟ เอฟซิดและใช้รายการนี้กับคลัสเตอร์ Kubernetes:

kubectl apply -f storageclass.yaml

หากต้องการตรวจสอบว่าคลัสเตอร์ทำงานร่วมกันอย่างไร ให้สร้าง PVC (Persistent Volume Claim) ต่อไปนี้:

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

ดูเหมือนทุกอย่างจะดีมาก! ฝั่งเซ็ฟจะหน้าตาเป็นยังไงบ้าง?
เราได้รับรายการวอลุ่มในกลุ่มและดูข้อมูลเกี่ยวกับวอลุ่มของเรา:

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

เราจะเห็นว่าขนาดของพีวีซีไม่เปลี่ยนแปลง หากต้องการทราบสาเหตุ คุณสามารถค้นหา Kubernetes สำหรับคำอธิบาย YAML ของ PVC ได้:

kubectl get pvc rbd-pvc -o yaml

นี่คือปัญหา:

ข้อความ: กำลังรอให้ผู้ใช้ (ใหม่) เริ่มพ็อดเพื่อเสร็จสิ้นการปรับขนาดระบบไฟล์ของโวลุ่มบนโหนด ประเภท: FileSystemResizePending

นั่นคือดิสก์เติบโตขึ้น แต่ระบบไฟล์ในนั้นไม่มี
หากต้องการขยายระบบไฟล์ คุณต้องเมานต์โวลุ่ม ในประเทศของเรา PVC/PV ที่สร้างขึ้นในปัจจุบันไม่ได้ใช้ในทางใดทางหนึ่ง

เราสามารถสร้าง test 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 เราจะกำหนดค่า CSI และเอนทิตีที่จำเป็นอื่นๆ เพื่อทำงานร่วมกับ CephFS

มารับค่าจากแผนภูมิ 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
เราเปลี่ยนพอร์ตสำหรับ httpMetrics (Prometheus จะไปที่นั่นเพื่อตรวจสอบตัวชี้วัด) เพื่อไม่ให้ขัดแย้งกับ nginx-proxy ซึ่งติดตั้งโดย Kubespray คุณอาจไม่ต้องการสิ่งนี้

ติดตั้งแผนภูมิ Helm ในคลัสเตอร์ Kubernetes:

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

มากรอกที่นี่กัน รหัสคลัสเตอร์ และใช้ได้กับ 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

แน่นอนว่า การติดตั้ง FS บนโหนด Ceph เช่นนี้เหมาะสำหรับวัตถุประสงค์ในการฝึกอบรมเท่านั้น ซึ่งเป็นสิ่งที่เราทำบน หลักสูตรสเลอร์ม. ฉันไม่คิดว่าจะมีใครทำเช่นนี้ในการผลิต มีความเสี่ยงสูงที่จะลบไฟล์สำคัญโดยไม่ตั้งใจ

สุดท้ายนี้ เรามาดูกันว่าสิ่งต่าง ๆ ทำงานอย่างไรกับการปรับขนาดโวลุ่มในกรณีของ CephFS กลับไปที่ Kubernetes และแก้ไขรายการของเราสำหรับ PVC - เพิ่มขนาดที่นั่นเช่น 7Gi

ลองใช้ไฟล์ที่แก้ไขแล้ว:

kubectl apply -f pvc.yaml

มาดูไดเร็กทอรีที่ติดตั้งเพื่อดูว่าโควต้าเปลี่ยนแปลงไปอย่างไร:

getfattr -n ceph.quota.max_bytes <каталог-с-данными>

เพื่อให้คำสั่งนี้ใช้งานได้ คุณอาจต้องติดตั้งแพ็คเกจบนระบบของคุณ Attribution-NonCommercial-ShareAlike.

ตากลัวแต่มือกลัว

คาถาและการแสดง YAML ยาวๆ เหล่านี้ดูซับซ้อนเมื่อดูเผินๆ แต่ในทางปฏิบัติ นักเรียนของ Slurm จะเข้าใจได้อย่างรวดเร็ว
ในบทความนี้ เราไม่ได้เจาะลึกเข้าไปในป่า - มีเอกสารอย่างเป็นทางการสำหรับเรื่องนั้น หากคุณสนใจรายละเอียดการตั้งค่าพื้นที่จัดเก็บ Ceph ด้วยคลัสเตอร์ Kubernetes ลิงก์เหล่านี้จะช่วยได้:

หลักการทั่วไปของ Kubernetes ที่ทำงานกับวอลุ่ม
เอกสาร RBD
การรวม RBD และ Kubernetes จากมุมมองของ Ceph
การรวม RBD และ Kubernetes จากมุมมองของ CSI
เอกสารทั่วไปของ CephFS
การรวม CephFS และ Kubernetes จากมุมมองของ CSI

ในหลักสูตร Slurm ฐาน Kubernetes คุณสามารถดำเนินการเพิ่มเติมอีกเล็กน้อยและปรับใช้แอปพลิเคชันจริงใน Kubernetes ซึ่งจะใช้ CephFS เป็นที่จัดเก็บไฟล์ ด้วยคำขอ GET/POST คุณจะสามารถถ่ายโอนไฟล์ไปและรับจาก Ceph ได้

และหากคุณสนใจในการจัดเก็บข้อมูลมากกว่าก็สมัครเลย หลักสูตรใหม่บน Ceph. ในขณะที่การทดสอบเบต้ากำลังดำเนินอยู่ คุณสามารถรับหลักสูตรนี้ได้พร้อมส่วนลด และคุณสามารถกำหนดเนื้อหาของหลักสูตรได้

ผู้เขียนบทความ: Alexander Shvalov วิศวกรฝึกหัด Southbridgeผู้ดูแลระบบ Kubernetes ที่ผ่านการรับรอง ผู้เขียนและผู้พัฒนาหลักสูตร Slurm

ที่มา: will.com