CubeFS Это новое поколение облачной системы хранения данных, которая поддерживает S3、HDFS и POSIX и другие протоколы доступа, поддерживающие два механизма хранения: мультирепликацию и стирающее кодирование, предоставляющие пользователям мультиарендность, много AZ развертыватьи по регионамкопироватьждатьмногодобрыйхарактеристика。
CubeFS Как облачный роднойиз распределенной складской платформы,Обеспечивает много доступ к протоколу,Поэтому сценарии его применения также очень широки.,В этом разделе кратко представлены несколько типичных сценариев применения.
CubeFS
Имеет множество многохарактеристик, в том числе:
многопротокол
Совместимый S3, POSIX, HDFS и другие типы могут иметь доступ к протоколу, и протоколы могут взаимодействовать друг с другом.
двойной двигатель
Поддерживает два механизма: многократное копирование и стирающее кодирование. Пользователи могут гибко выбирать в соответствии с бизнес-сценариями.
много арендатор
поддерживатьмного арендаторуправлять,Обеспечьте детализированную политику изоляции клиентов.
Расширяемый
Распределенные службы хранения данных масштаба PB или EB можно легко построить, а каждый модуль можно расширять горизонтально.
высокая производительность
Поддержка многоуровневого кэша,Специальная оптимизация для небольших файлов,поддерживатьмногодобрыйвысокая производительностьизкопироватьпротокол
облачный родной
CubeFS можно быстро использовать в Kubernetes на основе плагина CSI.
общий CubeFS Подсистемой метаданных (Metadata Подсистема), подсистема данных (Data Subsystem)и Узел управления связи (Master) и Object Gateway (Object Gateway). Подсистема), которую можно передать POSIX/HDFS/S3 Интерфейс для доступа к сохраненным данным.
Узел управления ресурсами
Много Master Он состоит из узлов и отвечает за асинхронную обработку различных типов задач, таких как управление фрагментами данных и метаданных (включая создание, удаление, обновление и проверку согласованности и т. д.), проверку состояния работоспособности узлов данных или узлов метаданных. а также сохранение и управление информацией об объеме ожидания.
Master Узлов может быть много, количество узлов равно проходу. через Raft Алгоритм обеспечивает согласованность метаданных и сохраняется до
RocksDB
середина.
подсистема метаданных
Много Meta Node Состав узла, много фрагментов данных (мета Partition)и Raft Пример (на основе Multi-Raft протокол репликации), каждый фрагмент метаданных представляет собой Inode Метаданные диапазона, которые содержат две памяти. B-Tree дерево: индексный дескриптор BTree и dentry BTree。
Требуется как минимум 3 экземпляра метаданных, поддерживается горизонтальное расширение.
Подсистема данных
Разделена на подсистему реплики и подсистему стирающего кодирования.,Обе подсистемы могут хранить существующее одновременно.,Вы также можете сохранить их отдельно:
Узлы данных поддерживают горизонтальное расширение.
объектная подсистема
Зависит отобъектузел(ObjectNode)композиция,Совместимый стандарт предусмотрен S3 Доступ к протоколам семантического доступа можно получить через Amazon S3 SDK или есть s3cmd и другие инструменты для доступа к ресурсам хранения.
рулон
Логично из концепции,Состоит из множества данныхидированных осколков.,С точки зрения клиента,рулон можно рассматривать как экземпляр файловой системы, к которому может получить доступ контейнер. С точки зрения объектхранилищеиз,Рулон соответствует ведру. Рулон можно монтировать в существумного контейнера.,делатьискусствокуски Могут быть доступны одновременно различным клиентам.。
CubeFS из Установить Есть много способов, в том числе Docker、YUM Подожди, раз уж мы здесь прямо Kubernetes используется,поэтому мы можем пройти Helm Приходить Установить CubeFS, каждый компонент будет напрямую использовать хост-сеть, используйте hostPath
Сопоставьте диск с контейнером середина.
Развертывание CubeFS в кластере Kubernetes может осуществляться в соответствии с архитектурой, показанной на рисунке ниже:
CubeFS в настоящее время состоит из следующих четырех частей:
Master
:Узел управления Службы, отвечающие за поддержание всего кластера метаинформации, развертывание StatefulSet ресурс.DataNode
:данныехранилищеузел,Необходимость монтирования большого количества дисков, отвечающих за файлы данных в фактическом хранилище.,развертыватьдля DaemonSet ресурс.MetaNode
:Юаньданныеузел,Отвечает за всю метаинформацию файла.,развертыватьдля DaemonSet ресурс.ObjectNode
:Ответственный за конверсию S3 Протокол обеспечивает возможности хранения объектов, сервисы без отслеживания состояния, развертывание для Deployment ресурс.Перед развертыванием нам необходимо иметь кластер Kubernetes как минимум с 3 узлами (желательно более 4 для аварийного восстановления), а версия кластера должна быть больше или равна 1,15.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 46d v1.28.7
node1 Ready <none> 46d v1.28.7
node2 Ready <none> 46d v1.28.7
Во-первых, нам нужно пометить узлы собственными метками, чтобы указать роль, которую эта машина будет играть в кластере CubeFS:
Поскольку у нас здесь всего 3 узла, нам нужно, чтобы эти узлы выполняли некоторые общие роли.
Master
Узлов, не менее трех, рекомендуется нечетное количество:kubectl label node master component.cubefs.io/master=enabled
kubectl label node node1 component.cubefs.io/master=enabled
kubectl label node node2 component.cubefs.io/master=enabled
MetaNode
узел данных элемента, по крайней мере 3 Индивидуальное, нечетное или четное не имеет значения:kubectl label node master component.cubefs.io/metanode=enabled
kubectl label node node1 component.cubefs.io/metanode=enabled
kubectl label node node2 component.cubefs.io/metanode=enabled
Datanode
узел данных, по крайней мере 3 Индивидуальное, нечетное или четное не имеет значения:kubectl label node master component.cubefs.io/datanode=enabled
kubectl label node node1 component.cubefs.io/datanode=enabled
kubectl label node node2 component.cubefs.io/datanode=enabled
ObjectNode
объектхранилищеузел,Можно отметить по необходимости,Если функция хранилища объектов не требуется, можно обойтись и без этого компонента:kubectl label node node1 component.cubefs.io/objectnode=enabled
kubectl label node node2 component.cubefs.io/objectnode=enabled
CSI
компонент для использования в Kubernetes используется в CubeFS требует наличия развертывания на всех узлах:kubectl label node node1 component.cubefs.io/csi=enabled
kubectl label node node2 component.cubefs.io/csi=enabled
CubeFS Установка будет передаваться на основе этих тегов nodeSelector
Сопоставьте, а затем создайте соответствующий Pod。
Далее мы можем пройти Helm Приходить Установить CubeFS , сначала нам нужно CubeFS из Helm Chart Скачать на локальный:
git clone https://github.com/cubefs/cubefs-helm
cd cubefs-helm
Затем настройте его в соответствии со своей средой. values Файл, например Внизлапшадаa simpleiz values документ:
# cubefs-values.yaml
component:
master: true
datanode: true
metanode: true
objectnode: false
client: false
csi: true
monitor: false
ingress: true
image:
# 3.3.0 версия появится раньше /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found ошибка
server: cubefs/cfs-server:v3.3.0
client: cubefs/cfs-client:v3.3.0
csi_driver: cnych/cubefs-cfs-csi-driver:3.2.0.150.0
csi_provisioner: cnych/csi-provisioner:v2.2.2
csi_attacher: cnych/csi-attacher:v3.4.0
csi_resizer: cnych/csi-resizer:v1.3.0
driver_registrar: cnych/csi-node-driver-registrar:v2.5.0
master:
# The replicas of master component, at least 3, recommend to be an odd number
replicas: 3
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
resources:
enabled: true
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "500m"
metanode:
total_mem: "4000000000"
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
resources:
enabled: true
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "500m"
datanode:
# DataNode Чтобы использовать из-диск, вы можете смонтировать многоблок
# Формат: Точка монтирования: зарезервированное пространство
# Зарезервированное место: Единичный байт, когда оставшееся пространство на диске меньше этого значения, данные на диск больше не записываются.
disks:
- /data0:10000000000
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
resources:
enabled: true
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "500m"
csi:
driverName: csi.cubefs.com
logLevel: error
kubeletPath: /var/lib/kubelet
controller:
tolerations: []
nodeSelector:
component.cubefs.io/csi: "enabled"
node:
tolerations: []
nodeSelector:
component.cubefs.io/csi: "enabled"
resources:
enabled: true
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "500m"
storageClass:
setToDefault: false
reclaimPolicy: "Delete"
# CSI Конфигурация клиента
provisioner:
# Kubelet из Главный каталог
kubelet_path: /var/lib/kubelet
Затем используйте следующую команду для развертывания CubeFS:
helm upgrade --install cubefs -n cubefs-system ./cubefs-helm/cubefs -f cubefs-values.yaml --create-namespace
После завершения развертывания вы можете использовать команду kubectl get pods -n cubefs-system
Подождите, пока статус всех компонентов изменится на Running Вот и все:
$ kubectl get pods -n cubefs-system
NAME READY STATUS RESTARTS AGE
cfs-csi-controller-66cdbb664f-pqkp6 4/4 Running 0 28m
cfs-csi-node-966t9 2/2 Running 0 25m
cfs-csi-node-9f4ts 2/2 Running 0 25m
datanode-4zfhc 1/1 Running 0 28m
datanode-blc8w 1/1 Running 0 28m
datanode-ldj72 1/1 Running 0 28m
master-0 1/1 Running 0 28m
master-1 1/1 Running 0 23m
master-2 1/1 Running 0 23m
metanode-5csgt 1/1 Running 0 7m31s
metanode-jvqnl 1/1 Running 0 7m31s
metanode-vpjtj 1/1 Running 0 7m31s
Ключевые журналы каждого компонента будут выводиться на стандартный вывод контейнера.
Кроме того, StorageClass
объект, который можно передать kubectl get sc
Проверять:
$ kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
cfs-sc csi.cubefs.com Delete Immediate true 29m
Теперь существование нашего Понятного доступноиз StorageClass объект, вы можете создать следующий PVC возражать против теста CubeFS функция складирования. Как показал Вниз:
# cubefs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cubefs-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: cfs-sc
Выше PVC В объекте, который мы передаем storageClassName
Задается с помощью из StorageClass Имя, вот оно cfs-sc
,Это имя необходимо, и мы создали его раньше из StorageClass Название такое же, поэтому оно будет основано на cubefs-sc
Определите параметры для создания хранилищерулона. Когда мы пишем существовать pvc yaml В основном обращайте внимание на параметры:
metadata.name
:pvc из названия, может быть изменено по мере необходимости, то же самое namespace Вниз pvc имядатолькоиз,Нет двух одинаковыхизимя。metadata.namespace
:pvc Местосуществоватьизпространство имена, измените при необходимостиspec.resources.request.storage
:pvc Размер емкости.storageClassName
:этотда storage class изName. если Хотите узнать, какие сейчас кластеры класс хранения, вы можете передать команду kubectl get sc
Приходить Проверять。Примените это прямо здесь yaml Файл Вот и все:
kubectl apply -f cubefs-pvc.yaml
После выполнения команды вы можете передать команду kubectl get pvc -n пространство имен
чтобы просмотреть соответствующий pvc из Статус, Ожидание Представитель ждет, Связанный Это значит, что творение прошло успешно.
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
cubefs-pvc Bound pvc-53cc95b7-8a05-43f8-8903-f1c6f7b11c05 5Gi RWO cfs-sc 3s
если PVC из Статус всегда был В ожидании вы можете проверить причину с помощью команды:
kubectl describe pvc -n пространство имен PVC имя
если Сообщение об ошибке не очевидноили Не могу видетьошибка,тогда вы можете использовать kubectl logs
Сначала проверьте связанные команды csi controller pod Внутри csi-provisioner
Сообщение об ошибке контейнера,csi-provisioner
да k8s и csi driver Из среднего моста очень много информации имеется в журнале Проверять.
если csi-provisioner
Если конкретную проблему невозможно найти в журнале, используйте kubectl exec
Просмотр связанных команд csi controller pod Внутри cfs-driver контейнеризбревно,этоизбревнопомещатьсуществоватьконтейнер Внутри /cfs/logs
Вниз.
Недоступно здесь Kubectl logs Связанные команды дапотому что cfs-driver изLog не выводит на стандартный вывод, хотя некоторые другие аналогичны csi-provisioner
из sidecar Контейнер из журнала выводится на стандартный вывод, поэтому его можно использовать kubectl logs
Просмотр связанных команд。
Понятно PVC Затем подключите Вниз и можете существовать монтировать на указывает каталог. Например, у нас есть пример, показанный в Вниз:
# cfs-csi-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: cfs-csi-demo
namespace: default
spec:
selector:
matchLabels:
app: cfs-csi-demo-pod
template:
metadata:
labels:
app: cfs-csi-demo-pod
spec:
nodeSelector:
component.cubefs.io/csi: enabled
containers:
- name: cfs-csi-demo
image: nginx:1.17.9
imagePullPolicy: "IfNotPresent"
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
mountPropagation: HostToContainer
name: mypvc
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: cubefs-pvc
Выше Список ресурсовсерединамы будемимядля cubefs-pvc
из PVC монтировать на cfs-csi-demo
контейнер Внутри /usr/share/nginx/html
Вниз.
Также создайте этот список ресурсов напрямую.
kubectl apply -f cfs-csi-demo.yaml
После создания можно пройти kubectl get pods
Проверять Pod из Статус:
$ kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cfs-csi-demo-5d456c8d97-sjsvw 1/1 Running 0 78s 10.0.1.85 node1 <none> <none>
Мы можем перейти непосредственно к /usr/share/nginx/html
Файл записи каталога в тест CubeFS функция хранения:
$ kubectl exec -it cfs-csi-demo-5d456c8d97-sjsvw -- /bin/bash
root@cfs-csi-demo-5d456c8d97-sjsvw:/# echo "Hello, CubeFS" > /usr/share/nginx/html/index.html
root@cfs-csi-demo-5d456c8d97-sjsvw:/#
Тогда мы можем преобразовать это Pod удалитьреконструкция,Затем Проверятьда Есть ли ещеэтотдокумент:
$ kubectl delete pod cfs-csi-demo-5d456c8d97-sjsvw
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
cfs-csi-demo-5d456c8d97-c245z 1/1 Running 0 3m22s
$ kubectl exec -it cfs-csi-demo-5d456c8d97-c245z -- ls /usr/share/nginx/html
index.html
$ kubectl exec -it cfs-csi-demo-5d456c8d97-c245z -- cat /usr/share/nginx/html/index.html
Hello, CubeFS
если можно увидеть Hello, CubeFS
Это означает CubeFS Изхранилище функционирует нормально.