Container Cloud Platform No.6 ~ Enterprise Distributed Storage Ceph ~ v14.2.10
Entretien Scofield novice sur le fonctionnement et la maintenance
introduction
En tant que système de stockage distribué unifié, ceph offre des performances élevées, une haute disponibilité et une évolutivité élevée. L'unification de ceph est qu'il peut fournir des systèmes de fichiers, des blocs de stockage et des objets de stockage. Dans un environnement cloud, ceph est généralement utilisé comme stockage back-end pour garantir une haute disponibilité des données.
ceph a été publié en 2004 puis ouvert à la communauté. Après plus de dix ans de développement, il est actuellement pris en charge et largement utilisé par de nombreux fournisseurs de cloud. Par exemple, openstack \ kubernetes \ système de machine virtuelle, etc. . .
Diagramme d'architecture:
Fonctionnalités
- La haute performance
adopte l'algorithme CRUSH, la distribution des données est équilibrée et le parallélisme est élevé.
L'isolation du domaine de reprise après sinistre peut implémenter les règles de placement de copie de diverses charges, telles que la salle inter-machines, la détection des racks, etc.
Il peut prendre en charge l'échelle de milliers de nœuds de stockage et prendre en charge des téraoctets à pétaoctets de données. - Le
nombre de réplicas à haute disponibilité peut être contrôlé de manière flexible.
Prend en charge la séparation des domaines de pannes et une forte cohérence des données.
Une variété de scénarios de défaillance sont automatiquement réparés et auto-guéris.
Pas de point de défaillance unique, gestion automatique. - Évolutivité et
décentralisation élevées .
Expansion flexible.
Il croît linéairement à mesure que le nombre de nœuds augmente.
Prend en charge trois interfaces de stockage: stockage de blocs, stockage de fichiers, stockage d'objets,
interfaces personnalisées et pilotes multilinguesMéthode de déploiement
1. Déployez sur du métal nu en tant que cluster de stockage indépendant pour fournir des services de stockage pour kubernetes (recommandé pour l'environnement en ligne)
2. Déployez sur le cluster kubernetes et utilisez Rook pour gérer ceph. Rook est un opérateur qui peut fournir des capacités de gestion de cluster Ceph. Il utilise le contrôleur CRD pour déployer et gérer les ressources ceph. Par rapport au déploiement sur du métal nu. C'est plus proche de kubernetes, mais c'est nouveau, la stabilité et la difficulté de dépannage sont incertaines, et l'environnement de génération doit être évalué par lui-même.
3. À titre de test, cet article utilise rook pour déployer le cluster ceph.
Premier regard sur le diagramme d'architecture
Comme le montrent les deux schémas officiels ci-dessus,
Rook Operator est le composant principal.Il est principalement utilisé pour gérer le cluster de stockage et surveiller le démon de stockage pour assurer la santé du cluster de stockage.
Rook Agent s'exécute sur chaque nœud de stockage et est configuré avec le plug-in FlexVolume et le cadre de contrôle du volume de stockage (CSI) Kubernetes pour l'intégration.
Rook utilise la forme de Kubernetes Pod pour déployer les démons MON, OSD et MGR de Ceph.
4. Avant de déployer ceph, vous devez vous assurer que votre serveur dispose de disques durs libres pour le cluster ceph à utiliser, généralement trois ou plus, si vous en testez au moins un.
Comme indiqué ci-dessous, sdb est pour 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
Déployer rook-ceph
Installez root-operator, déployez cet article dans l'espace de noms: rook
1, déployez des ressources communes
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. Déployer les ressources des opérateurs
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. Créez un cluster ceph.
Ici, vous devez modifier le fichier cluster.yaml pour
définir le nœud de stockage ceph et le disque dur utilisé en fonction de la situation réelle . Sinon, tous les disques disponibles pour le système seront formatés. Ici, vous avez besoin pour régler les éléments suivants
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"
Modifiez la situation et le sexe du nœud, installez ceph sur le nœud avec une étiquette fixe, utilisez ici l'étiquette 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
Pour exécuter la commande de déploiement, ce lien doit télécharger des images de ceph. Selon la situation du réseau, cela peut prendre un certain temps. . .
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
Comme vous pouvez le voir dans la sortie ci-dessus, aucun pod OSD n'est en cours d'exécution.
Afficher la découverte du journal rook-discover-kxmdx. J'ai pu trouver le disque dur sdb, mais je n'ai
effectué aucune opération sur le processus du disque dur . J'ai soudainement pensé que ceph avait également formaté le disque dur via la clé lvm, puis j'ai vérifié le système. Comme prévu, lvm2 n'était pas installé , alors recommençons:
1kubectl delete -f cluster.yaml
2kubectl delete -f operator.yaml
3kubectl delete -f common.yaml
4在所有节点删除
5rm -rf /var/lib/rook/*
Installez lvm2
1yum install -y lvm2
Déployez à nouveau
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
Enfin vu rook-ceph-osd- * Pod en cours d'exécution. Si osd n'est pas en cours d'exécution, ceph ne peut pas fournir de capacité de stockage.
4. Créez un tableau de bord ceph
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. Installez l'outil ceph-tool, qui est un outil client ceph, vous pouvez utiliser la commande ceph pour gérer le cluster ceph
1[root@k8s-master001 rook]# kubectl apply -f toolbox.yaml
6. Créez une classe de stockage de cluster kubernetes, reclaimPolicy par défaut: modifiez la stratégie de Supprimer à Conserver, en fonction de vos besoins.
1[root@k8s-master001 rook]# kubectl apply -f storageclass.yaml
2cephblockpool.ceph.rook.io/k8spool created
3storageclass.storage.k8s.io/rook-ceph created
Utilisez ceph pour fournir du stockage pour Kubernetes
Vérifiez que la classe de stockage peut être utilisée. Ici, nodeSelector est utilisé pour attribuer un pod à une machine spécifique, ou n'est pas défini
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
Exécuter le déploiement 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
Comme on peut le voir à partir de la sortie ci-dessus, kubernetes a créé PV: pvc-e96e54cb-88bb-44b0-a07d-19cbb36fe739 en appelant la classe de stockage et l'a lié avec PVC: volume-demo001-0.
Maintenant, nous entrons dans le pod nginx pour afficher la situation du disque monté
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
Ici / dev / rbd0 est le stockage back-end fourni par le cluster ceph pour nginx, la taille est 1G et il est spécifié dans le fichier de déploiement demo.yaml.
Résumé pour éviter les fosses
1. Étant donné que ceph a besoin de l'outil système lvm2 lors de la création d'osd, il est préférable de l'installer à l'avance avant le déploiement.
2. Lorsque vous spécifiez les informations du disque dur dans cluster.yaml, il est préférable d'utiliser le nom d'hôte ou de vous assurer que le système DNS se résout correctement.
1nodes:
2 - name: "10.26.25.20" #这个地方最好写hostname
3 devices:
4 - name: "sdb"
3. Ne créez pas manuellement des partitions pour le disque dur utilisé par ceph.
4. Si vous redéployez, n'oubliez pas de supprimer le répertoire / var / lib / rook / avant de redéployer pour éviter de conserver les anciennes informations de cluster.
5. Il est préférable d'utiliser des étiquettes dans l'environnement de production pour installer ceph sur le nœud désigné tout en évitant l'installation sur le nœud maître.
Remarque: les images de l'article proviennent d'Internet. En cas d'infraction, veuillez me contacter pour la supprimer à temps.