Облачная платформа контейнеров №6 ~ корпоративное распределенное хранилище Ceph ~ v14.2.10
Беседа с новичком Scofield по эксплуатации и техническому обслуживанию
Вступление
В качестве унифицированной распределенной системы хранения ceph обеспечивает высокую производительность, доступность и масштабируемость. Унификация ceph заключается в том, что он может предоставлять файловые системы, хранилище блоков и хранилище объектов.В облачной среде ceph обычно используется в качестве внутреннего хранилища для обеспечения высокой доступности данных.
ceph был опубликован в 2004 году, а затем был открыт для сообщества. После более чем десяти лет разработки он в настоящее время поддерживается и широко используется многими поставщиками облачных услуг. Например, openstack \ kubernetes \ virtual machine system и т. Д. . .
Схема архитектуры:
Функции
- Высокая производительность
использует алгоритм CRUSH, распределение данных сбалансировано, а параллелизм высокий.
Изоляция домена аварийного восстановления может реализовать правила размещения копий для различных нагрузок, таких как межмашинное пространство, осведомленность о стойке и т. Д.
Он может поддерживать масштаб до тысяч узлов хранения и поддерживать данные от терабайтов до петабайт.
Количество реплик высокой доступности можно гибко контролировать.
Поддерживает разделение доменов сбоя и строгую согласованность данных.
Автоматическое устранение и самовосстановление различных сценариев отказов.
Нет единой точки отказа, автоматическое управление.- Высокая масштабируемость и
децентрализация.
Гибкое расширение.
Он линейно растет с увеличением количества узлов.
Поддерживает три интерфейса хранилища: хранилище блоков, хранилище файлов, хранилище объектов,
настраиваемые интерфейсы и многоязычные драйверы.Метод развертывания
1. Разверните на «голом железе» в качестве независимого кластера хранения для предоставления услуг хранения для кубернетов (рекомендуется для онлайн-среды)
2. Разверните в кластер кубернетов и используйте Rook для управления ceph. Rook - это оператор, который может предоставлять возможности управления кластером Ceph и использует контроллер CRD для развертывания ресурсов Ceph и управления ими. По сравнению с развертыванием на «голом железе». Это ближе к кубернетам, но это новинка. Стабильность и сложность устранения неполадок сомнительны, а среду генерации нужно оценивать отдельно.
3. В качестве теста в этой статье используется ладья для развертывания кластера ceph.
Сначала посмотрите на схему архитектуры
Как видно из двух приведенных выше официальных диаграмм,
Rook Operator является основным компонентом, который в основном используется для управления кластером хранения и мониторинга демона хранения, чтобы гарантировать работоспособность кластера хранения.
Rook Agent запускается на каждом узле хранения и настраивается с помощью подключаемого модуля FlexVolume и инфраструктуры управления объемом хранилища Kubernetes (CSI) для интеграции.
Rook использует форму Kubernetes Pod для развертывания демонов Ceph MON, OSD и MGR.
4. Перед развертыванием ceph вам необходимо убедиться, что на вашем сервере есть свободные жесткие диски для использования кластером ceph, обычно три или больше, если вы просто тестируете хотя бы один.
Как показано ниже, sdb предназначен для ceph
1fdisk -l
2
3Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
4Units = sectors of 1 * 512 = 512 bytes
5Sector size (logical/physical): 512 bytes / 512 bytes
6I/O size (minimum/optimal): 512 bytes / 512 bytes
7
8
9Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
10Units = sectors of 1 * 512 = 512 bytes
11Sector size (logical/physical): 512 bytes / 512 bytes
12I/O size (minimum/optimal): 512 bytes / 512 bytes
13Disk label type: dos
14Disk identifier: 0x0001ce60
15
16 Device Boot Start End Blocks Id System
17/dev/sda1 * 2048 2099199 1048576 83 Linux
18/dev/sda2 2099200 209715199 103808000 8e Linux LVM
Развернуть ладью-цеф
Установите root-operator, разверните эту статью в пространстве имен: rook
1, разверните общие ресурсы
1[root@k8s-master001 rook]# kubectl apply -f common.yaml
2namespace/rook created
3Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
4。。中间省略N行
5clusterrolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role created
2. Разверните ресурсы оператора
1[root@k8s-master001 rook]# kubectl label node k8s-master003 app.storage=rook-ceph
2node/k8s-master003 labeled
3[root@k8s-master001 rook]# kubectl label node k8s-master002 app.storage=rook-ceph
4node/k8s-master002 labeled
5[root@k8s-master001 rook]# kubectl label node k8s-master001 app.storage=rook-ceph
6node/k8s-master001 labeled
7
8[root@k8s-master001 rook]# kubectl apply -f operator.yaml
9configmap/rook-ceph-operator-config created
10deployment.apps/rook-ceph-operator created
11
12[root@k8s-master001 rook]# kubectl get po -n rook
13NAME READY STATUS RESTARTS AGE
14rook-ceph-operator-87f875bbc-zz9lb 0/1 Pending 0 106s
15
16再次查看,知道全部Pod为Running状态,表示安装成功
17如果不是Runing状态,可以使用例如:kubectl describe po rook-discover-5qrc6 -n rook
18查看详情,一般情况可能是镜像下载失败,如果是其他情况,请根据实际情况自行解决。。。
19
20[root@k8s-master001 rook]# kubectl get po -n rook
21NAME READY STATUS RESTARTS AGE
22rook-ceph-operator-87f875bbc-zz9lb 1/1 Running 3 27m
23rook-discover-5qrc6 1/1 Running 0 3m42s
24rook-discover-fzfz5 1/1 Running 0 3m52s
25rook-discover-fzg7r 1/1 Running 0 20m
3. Создайте кластер ceph.
Здесь вам нужно изменить файл cluster.yaml, чтобы
установить узел хранения ceph и используемый жесткий диск в соответствии с реальной ситуацией . В противном случае все диски, доступные в системе, будут отформатированы. Здесь вам нужно установить следующие
1 storage: # cluster level storage configuration and selection
2 useAllNodes: false
3 useAllDevices: false
4 #deviceFilter:
5 config:
6 # metadataDevice: "md0" # specify a non-rotational storage so ceph-volume will use it as block db device of bluestore.
7 # databaseSizeMB: "1024" # uncomment if the disks are smaller than 100 GB
8 # journalSizeMB: "1024" # uncomment if the disks are 20 GB or smaller
9 # osdsPerDevice: "1" # this value can be overridden at the node or device level
10 # encryptedDevice: "true" # the default value for this option is "false"
11# Individual nodes and their config can be specified as well, but 'useAllNodes' above must be set to false. Then, only the named
12# nodes below will be used as storage resources. Each node's 'name' field should match their 'kubernetes.io/hostname' label.
13 nodes:
14 - name: "10.26.25.20" #这个地方最好写hostname
15 devices:
16 - name: "sdb"
17 - name: "10.26.25.21"
18 devices:
19 - name: "sdb"
20 - name: "10.26.25.22"
21 devices:
22 - name: "sdb"
Измените положение и пол узла, установите ceph на узел с фиксированной меткой, здесь используйте метку app.storage = rook-ceph.
1 placement:
2 all:
3 nodeAffinity:
4 requiredDuringSchedulingIgnoredDuringExecution:
5 nodeSelectorTerms:
6 - matchExpressions:
7 - key: app.storage
8 operator: In
9 values:
10 - rook-ceph
Для выполнения команды развертывания по этой ссылке необходимо загрузить несколько образов ceph. В зависимости от сетевой ситуации это может занять много времени. . .
1[root@k8s-master001 rook]# kubectl apply -f cluster.yaml
2cephcluster.ceph.rook.io/rook-ceph created
3
4[root@k8s-master001 rook]# kubectl get po -n rook
5NAME READY STATUS RESTARTS AGE
6csi-cephfsplugin-2fsl9 3/3 Running 0 6m54s
7csi-cephfsplugin-4r5cg 3/3 Running 0 6m55s
8csi-cephfsplugin-htdjs 3/3 Running 0 6m54s
9csi-cephfsplugin-provisioner-7646976d94-9kfd6 5/5 Running 1 6m53s
10csi-cephfsplugin-provisioner-7646976d94-rbztr 5/5 Running 0 6m53s
11csi-rbdplugin-56jpj 3/3 Running 0 6m59s
12csi-rbdplugin-8h25h 3/3 Running 0 6m59s
13csi-rbdplugin-provisioner-55c946c8c-d25g4 6/6 Running 2 6m58s
14csi-rbdplugin-provisioner-55c946c8c-g77s8 6/6 Running 1 6m57s
15csi-rbdplugin-z4qpw 3/3 Running 0 6m59s
16rook-ceph-crashcollector-k8s-master001-6975bdf888-bpm7r 1/1 Running 0 2m6s
17rook-ceph-crashcollector-k8s-master002-746b76cd87-5xzz4 1/1 Running 0 3m18s
18rook-ceph-crashcollector-k8s-master003-5b54f4496-hntgb 1/1 Running 0 2m34s
19rook-ceph-mgr-a-58594cfb7d-l7wjg 1/1 Running 0 2m7s
20rook-ceph-mon-a-84b755686-c6cxr 1/1 Running 0 3m18s
21rook-ceph-mon-b-776469c655-d5jb7 1/1 Running 0 3m1s
22rook-ceph-mon-c-64648fbd69-n5jh4 1/1 Running 0 2m35s
23rook-ceph-operator-87f875bbc-cgvwm 1/1 Running 3 7m35s
24rook-discover-d9fpp 1/1 Running 0 7m31s
25rook-discover-kxmdx 1/1 Running 0 7m31s
26rook-discover-z9kzt 1/1 Running 0 7m31s
Как видно из вышеприведенного вывода, модуль OSD не запущен.
Просмотрите обнаружение журнала rook-discover-kxmdx. Я смог найти sdb жесткого диска, но не
выполнил никаких операций с процессом жесткого диска . Я внезапно подумал, что ceph также отформатировал жесткий диск с помощью ключа lvm, а затем проверил систему. Как и ожидалось, lvm2 не был установлен , так что начнем сначала:
1kubectl delete -f cluster.yaml
2kubectl delete -f operator.yaml
3kubectl delete -f common.yaml
4在所有节点删除
5rm -rf /var/lib/rook/*
Установить lvm2
1yum install -y lvm2
Снова развернуть
1[root@k8s-master001 rook]# kubectl get po -n rook
2NAME READY STATUS RESTARTS AGE
3csi-cephfsplugin-9l55s 3/3 Running 0 10m
4csi-cephfsplugin-czwlx 3/3 Running 0 10m
5csi-cephfsplugin-np7n7 3/3 Running 0 10m
6csi-cephfsplugin-provisioner-7646976d94-579qz 5/5 Running 3 10m
7csi-cephfsplugin-provisioner-7646976d94-v68wg 5/5 Running 0 10m
8csi-rbdplugin-9q82d 3/3 Running 0 10m
9csi-rbdplugin-l55zq 3/3 Running 0 10m
10csi-rbdplugin-provisioner-55c946c8c-ft4xl 6/6 Running 0 10m
11csi-rbdplugin-provisioner-55c946c8c-zkzh7 6/6 Running 1 10m
12csi-rbdplugin-wk7cw 3/3 Running 0 10m
13rook-ceph-crashcollector-k8s-master001-6c4c78b6cd-gcfvn 1/1 Running 0 6m17s
14rook-ceph-crashcollector-k8s-master002-746b76cd87-47k84 1/1 Running 0 9m7s
15rook-ceph-crashcollector-k8s-master003-5b54f4496-ts64m 1/1 Running 0 8m43s
16rook-ceph-mgr-a-66779c74c5-cnxbm 1/1 Running 0 8m16s
17rook-ceph-mon-a-5b7bcd77ff-sb4fz 1/1 Running 0 9m25s
18rook-ceph-mon-b-779c8467d4-bfd4g 1/1 Running 0 9m7s
19rook-ceph-mon-c-574fd97c79-v5qcd 1/1 Running 0 8m44s
20rook-ceph-operator-87f875bbc-z7rwn 1/1 Running 1 11m
21rook-ceph-osd-0-66775549dc-g2ttv 1/1 Running 0 6m11s
22rook-ceph-osd-2-6c5b4fc67-gtqjf 1/1 Running 0 6m20s
23rook-ceph-osd-prepare-k8s-master001-jbpgg 0/1 Completed 0 8m13s
24rook-ceph-osd-prepare-k8s-master002-vfvnp 0/1 Completed 0 8m12s
25rook-ceph-osd-prepare-k8s-master003-ffd6r 0/1 Completed 0 6m28s
26rook-discover-74qf2 1/1 Running 0 10m
27rook-discover-fk4wn 1/1 Running 0 10m
28rook-discover-fvbcf 1/1 Running 0 10m
Наконец-то увидел бегущую ладью-цеф-осд- * Под. Если osd не запущен, ceph не может предоставить емкость хранилища.
4. Создайте ceph-dashboard
1[root@k8s-master001 rook]# kubectl apply -f dashboard-external-https.yaml
2service/rook-ceph-mgr-dashboard-external-https created
3
4使用如下命令查询dashboard的admin密码
5MGR_POD=`kubectl get pod -n rook | grep mgr | awk '{print $1}'`
6kubectl -n rook-ceph logs $MGR_POD | grep password
5. Установите инструмент ceph-tool, который является клиентским инструментом ceph, вы можете использовать команду ceph для управления кластером ceph.
1[root@k8s-master001 rook]# kubectl apply -f toolbox.yaml
6. Создайте класс хранилища кластера kubernetes, reclaimPolicy по умолчанию: измените политику с «Удалить» на «Сохранить», в зависимости от ваших потребностей.
1[root@k8s-master001 rook]# kubectl apply -f storageclass.yaml
2cephblockpool.ceph.rook.io/k8spool created
3storageclass.storage.k8s.io/rook-ceph created
Используйте ceph для обеспечения хранилища кубернетов
Убедитесь, что класс хранилища можно использовать. Здесь nodeSelector используется для назначения модуля конкретному компьютеру или не установлен.
1---
2apiVersion: apps/v1
3kind: StatefulSet
4metadata:
5 name: demo001
6 labels:
7 app: demo00
8spec:
9 serviceName: demo001
10 replicas: 1
11 selector:
12 matchLabels:
13 app: demo001
14 template:
15 metadata:
16 labels:
17 app: demo001
18 spec:
19 terminationGracePeriodSeconds: 180
20 nodeSelector:
21 kubernetes.io/hostname: k8s-master001
22 containers:
23 - name: demo001
24 image: nginx
25 imagePullPolicy: IfNotPresent
26 ports:
27 - containerPort: 80
28 name: port
29 volumeMounts:
30 - name: volume
31 mountPath: /var/www/html
32 volumeClaimTemplates:
33 - metadata:
34 name: volume
35 spec:
36 accessModes: ["ReadWriteOnce"]
37 storageClassName: rook-ceph
38 resources:
39 requests:
40 storage: 1Gi
Выполнить развертывание kubectl apply -f demo.yaml
1[root@k8s-master001 rook]# kubectl get po
2NAME READY STATUS RESTARTS AGE
3demo001-0 1/1 Running 0 78s
4查看可提供服务的存储类
5[root@k8s-master001 rook]# kubectl get sc
6NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
7rook-ceph rook.rbd.csi.ceph.com Retain Immediate true 8m15s
8看已经创建的存储卷
9[root@k8s-master001 rook]# kubectl get pv,pvc
10NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
11persistentvolume/pvc-e96e54cb-88bb-44b0-a07d-19cbb36fe739 1Gi RWO Retain Bound default/volume-demo001-0 rook-ceph 104s
12
13NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
14persistentvolumeclaim/volume-demo001-0 Bound pvc-e96e54cb-88bb-44b0-a07d-19cbb36fe739 1Gi RWO rook-ceph 110s
Как видно из вышеприведенного вывода, кубернеты создали PV: pvc-e96e54cb-88bb-44b0-a07d-19cbb36fe739, вызвав класс хранилища, и связали его с PVC: volume-demo001-0.
Теперь мы заходим в pod nginx, чтобы просмотреть ситуацию с подключенным диском.
1[root@k8s-master001 rook]# kubectl exec -ti demo001-0 /bin/sh
2kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
3# df -h
4Filesystem Size Used Avail Use% Mounted on
5overlay 50G 5.6G 45G 12% /
6/dev/rbd0 976M 2.6M 958M 1% /var/www/html
Здесь / dev / rbd0 - это внутреннее хранилище, предоставляемое кластером ceph для nginx, размером 1 ГБ, и оно указано в файле развертывания demo.yaml.
Краткое изложение того, как избегать ям
1. Поскольку ceph нуждается в системном инструменте lvm2 при создании OSD, лучше всего установить его заранее перед развертыванием.
2. При указании информации о жестком диске в cluster.yaml лучше всего использовать имя хоста или убедиться, что система DNS разрешает правильно.
1nodes:
2 - name: "10.26.25.20" #这个地方最好写hostname
3 devices:
4 - name: "sdb"
3. Не создавайте вручную разделы для жесткого диска, используемого ceph.
4. При повторном развертывании не забудьте удалить каталог / var / lib / rook / перед повторным развертыванием, чтобы не оставалась старая информация о кластере.
5. Лучше всего использовать метки в производственной среде для установки ceph на назначенный узел, избегая установки на главном узле.
Примечание: изображения в статье взяты из Интернета. Если есть какие-либо нарушения, пожалуйста, свяжитесь со мной, чтобы удалить их вовремя.