Container Cloud Platform No.6 ~ Enterprise Distributed Storage Ceph ~ v14.2.10
Charla de operación y mantenimiento para principiantes de Scofield
Introducción
Como sistema de almacenamiento distribuido unificado, ceph proporciona alto rendimiento, alta disponibilidad y alta escalabilidad. La unificación de ceph es que puede proporcionar sistemas de archivos, almacenamiento de bloques y almacenamiento de objetos. En un entorno de nube, ceph se usa generalmente como almacenamiento de back-end para garantizar una alta disponibilidad de datos.
ceph se publicó en 2004 y luego se abrió a la comunidad. Después de más de diez años de desarrollo, actualmente es compatible y ampliamente utilizado por muchos proveedores de nube. Por ejemplo, openstack \ kubernetes \ sistema de máquina virtual, etc. . .
Diagrama de arquitectura:
Características
- El alto rendimiento
adopta el algoritmo CRUSH, la distribución de datos está equilibrada y el paralelismo es alto.
El aislamiento del dominio de recuperación ante desastres puede implementar las reglas de colocación de copias de varias cargas, como sala de máquinas cruzadas, reconocimiento de racks, etc.
Puede admitir la escala de miles de nodos de almacenamiento y admitir terabytes a petabytes de datos. - El
número de réplicas de alta disponibilidad se puede controlar de forma flexible.
Admite la separación de dominios de fallas y una sólida coherencia de datos.
Una variedad de escenarios de falla se reparan y curan automáticamente.
Sin un solo punto de falla, gestión automática. - Alta escalabilidad y
descentralización.
Expansión flexible.
Crece linealmente a medida que aumenta el número de nodos.
Admite tres interfaces de almacenamiento: almacenamiento en bloque, almacenamiento de archivos, almacenamiento de objetos,
interfaces personalizadas y controladores en varios idiomasMétodo de implementación
1. Implementar en bare metal como un clúster de almacenamiento independiente para proporcionar servicios de almacenamiento para kubernetes (recomendado para entornos en línea)
2. Implementar en el clúster de kubernetes y usar Rook para administrar ceph. Rook es un operador que puede proporcionar capacidades de administración de clústeres de Ceph. Utiliza el controlador CRD para implementar y administrar los recursos de ceph. En comparación con la implementación en bare metal. Está más cerca de kubernetes, pero es algo nuevo. La estabilidad y la dificultad de la resolución de problemas son inciertas, y el entorno de generación debe evaluarse por sí mismo.
3. Como prueba, este artículo usa rook para implementar el clúster ceph.
Primer vistazo al diagrama de arquitectura
Como se puede ver en los dos diagramas oficiales anteriores,
Rook Operator es el componente principal. Se utiliza principalmente para administrar el clúster de almacenamiento y monitorear el demonio de almacenamiento para garantizar el estado del clúster de almacenamiento.
Rook Agent se ejecuta en cada nodo de almacenamiento y está configurado con el complemento FlexVolume y el marco de control de volumen de almacenamiento (CSI) de Kubernetes para la integración.
Rook usa la forma de Kubernetes Pod para implementar los demonios MON, OSD y MGR de Ceph.
4. Antes de implementar ceph, debe asegurarse de que su servidor tenga discos duros libres para que los use el clúster de ceph, generalmente tres o más, si solo prueba al menos uno.
Como se muestra a continuación, sdb es para 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
Implementar rook-ceph
Instale root-operator, implemente este artículo en el espacio de nombres: torre
1, implemente recursos comunes
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. Implementar los recursos del operador
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. Cree un clúster ceph.
Aquí debe modificar el archivo cluster.yaml para
configurar el nodo de almacenamiento ceph y el disco duro utilizado de acuerdo con la situación real . De lo contrario, se formatearán todos los discos disponibles para el sistema. Aquí necesita para configurar lo siguiente
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"
Modifique la situación del nodo y el sexo, instale ceph en el nodo con una etiqueta fija, aquí use la etiqueta 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
Para ejecutar el comando de implementación, este enlace necesita descargar algunas imágenes de ceph. Dependiendo de la situación de la red, puede llevar mucho tiempo. . .
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
Como puede ver en el resultado anterior, no se está ejecutando ningún módulo OSD.
Vea el descubrimiento de registros de rook-discover-kxmdx. Pude encontrar el sdb del disco duro, pero no
realicé ninguna operación en el proceso del disco duro . De repente pensé que ceph también formateó el disco duro a través de la clave lvm, y luego verifiqué el sistema. Como era de esperar, lvm2 no estaba instalado , así que comencemos de nuevo:
1kubectl delete -f cluster.yaml
2kubectl delete -f operator.yaml
3kubectl delete -f common.yaml
4在所有节点删除
5rm -rf /var/lib/rook/*
Instalar lvm2
1yum install -y lvm2
Implementar de nuevo
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
Finalmente vi rook-ceph-osd- * Pod corriendo. Si osd no se está ejecutando, ceph no puede proporcionar capacidad de almacenamiento.
4. Cree un panel de control de 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. Instale la herramienta ceph-tool, que es una herramienta cliente de ceph, puede usar el comando ceph para administrar el clúster de ceph
1[root@k8s-master001 rook]# kubectl apply -f toolbox.yaml
6. Cree una clase de almacenamiento de clúster de Kubernetes, la reclamación predeterminada: cambie la política de Eliminar a Retener, según sus necesidades.
1[root@k8s-master001 rook]# kubectl apply -f storageclass.yaml
2cephblockpool.ceph.rook.io/k8spool created
3storageclass.storage.k8s.io/rook-ceph created
Utilice ceph para proporcionar almacenamiento para kubernetes
Verifique que se pueda usar la clase de almacenamiento. Aquí, nodeSelector se usa para asignar el pod a una máquina específica, o no se establece
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
Ejecute la implementación 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
Como se puede ver en el resultado anterior, kubernetes creó PV: pvc-e96e54cb-88bb-44b0-a07d-19cbb36fe739 llamando a la clase de almacenamiento y lo vinculó con PVC: volume-demo001-0.
Ahora ingresamos al pod nginx para ver la situación del disco montado
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
Aquí / dev / rbd0 es el almacenamiento de back-end proporcionado por el clúster ceph para nginx, el tamaño es 1G y se especifica en el archivo de implementación demo.yaml.
Resumen de evitar hoyos
1. Debido a que ceph necesita la herramienta del sistema lvm2 al crear osd, es mejor instalarla antes de la implementación.
2. Al especificar la información del disco duro en cluster.yaml, es mejor usar el nombre de host o asegurarse de que el sistema DNS se resuelva correctamente.
1nodes:
2 - name: "10.26.25.20" #这个地方最好写hostname
3 devices:
4 - name: "sdb"
3. No cree particiones manualmente para el disco duro que utiliza ceph.
4. Si vuelve a implementar, recuerde eliminar el directorio / var / lib / rook / antes de volver a implementar para evitar que quede información antigua del clúster.
5. Es mejor utilizar etiquetas en el entorno de producción para instalar ceph en el nodo designado y evitar la instalación en el nodo principal.
Nota: Las imágenes del artículo son de Internet. Si hay alguna infracción, comuníquese conmigo para eliminarla a tiempo.