在Kubernetes中经常需要持久化的地方,很早之前都是使用nfs。但是nfs不支持rbd格式,不支持块存储级别。ceph目前是在kubernetes属于比较流行的存储引擎,支持rbd、cephfs等。本次我使用最新版kubernetes 1.24以及N版ceph进行演示
Ceph相关文档
Ceph-deploy 快速部署Ceph集群
新闻联播老司机
本次环境使用Kubernetes 1.24,相关搭建文档见下方
Kubeadm搭建高可用(k8s)Kubernetes v1.24.0集群
新闻联播老司机
Kubernetes 和Ceph集成提供了三种实现方式
目前Ceph支持Kubernetes存储有两种类型,一般来说用RBD比较多
本文章主要介绍Ceph RBD使用场景ß
目前StorageClass 驱动器(Provisioner),可以使用的卷类型, 该字段必须指定
当我们需要使用StorageClass来动态创建pv,pvc时,需要指定一个Provisioner,k8s支持Provisioner的服务有以下几种类型
AWSElasticBlockStore | ✓ | AWS EBS |
AzureFile | ✓ | Azure File |
AzureDisk | ✓ | Azure Disk |
CephFS | - | - |
Cinder | ✓ | OpenStack Cinder |
FC | - | - |
FlexVolume | - | - |
Flocker | ✓ | - |
GCEPersistentDisk | ✓ | GCE PD |
Glusterfs | ✓ | Glusterfs |
iSCSI | - | - |
Quobyte | ✓ | Quobyte |
NFS | - | NFS |
RBD | ✓ | Ceph RBD |
VsphereVolume | ✓ | vSphere |
PortworxVolume | ✓ | Portworx Volume |
ScaleIO | ✓ | ScaleIO |
StorageOS | ✓ | StorageOS |
Local | - | Local |
官方文档说明https://kubernetes.io/zh/docs/concepts/storage/storage-classes/
环境准备
Ceph环境信息
[root@ceph-01 ~]# ceph version ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable) #Ceph集群状态 [root@ceph-01 ~]# ceph -s cluster: id: c8ae7537-8693-40df-8943-733f82049642 health: HEALTH_OK services: mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 5h) mgr: ceph-02(active, since 5d), standbys: ceph-03, ceph-01 mds: cephfs-abcdocker:1 {0=ceph-01=up:active} 2 up:standby osd: 4 osds: 4 up (since 5h), 4 in (since 5h) rgw: 2 daemons active (ceph-01, ceph-02) task status: data: pools: 9 pools, 384 pgs objects: 3.16k objects, 11 GiB usage: 36 GiB used, 144 GiB / 180 GiB avail pgs: 384 active+clean
Kubernetes版本相关信息
☁ ~ kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s-01 Ready control-plane 11d v1.24.0 192.168.31.10 <none> CentOS Linux 7 (Core) 5.17.8-1.el7.elrepo.x86_64 containerd://1.6.4 k8s-02 Ready control-plane 11d v1.24.0 192.168.31.11 <none> CentOS Linux 7 (Core) 5.17.8-1.el7.elrepo.x86_64 containerd://1.6.4 k8s-03 Ready control-plane 11d v1.24.0 192.168.31.12 <none> CentOS Linux 7 (Core) 5.17.8-1.el7.elrepo.x86_64 containerd://1.6.4 k8s-04 Ready <none> 11d v1.24.0 192.168.31.13 <none> CentOS Linux 7 (Core) 5.17.8-1.el7.elrepo.x86_64 containerd://1.6.4 k8s-05 Ready <none> 11d v1.24.0 192.168.31.14 <none> CentOS Linux 7 (Core) 3.10.0-1160.62.1.el7.x86_64 containerd://1.6.4
Ceph Csi 驱动部署
CSI全称Container Storage Interface(容器存储接口)
CSI的目的是定义行业标准"容器存储接口",使存储供应商(SP)可以开发一个符合CSI标准的插件并使其能够在多个容器编排(CO)系统中工做。CO包括Cloud Foundry, Kubernetes, Mesos等
Ceph块设备rbd与Kubernetes v1.13以及更高版本通过 ceph -csi一起使用,它动态地提供 RBD 映像以支持 Kubernetes 卷并将这些 RBD 映像映射为工作节点上的块设备(可选地挂载映像中包含的文件系统)运行引用 RBD 支持的卷的pod 。
要将 Ceph 块设备与 Kubernetes v1.13 及更高版本一起使用,ceph-csi需要安装在Kubernetes 环境中
通过kubernetes sidecar部署provisioner, attacher, resizer, driver-registrar 和 snapshotter 组件,以支持CSI功能。
Ceph CSI插件实现了支持CSI的Container Orchestrator (CO)和Ceph集群之间的接口。它允许动态供应Ceph卷并将它们附加到工作负载
ceph-csi默认使用RBD内核模块,可能不支持所有 Ceph CRUSH 可调参数或RBD 映像特性。
安装ceph-csi驱动
#默认情况下,Ceph 块设备使用rbd池。为 Kubernetes 卷存储创建一个池。确保您的 Ceph 集群正在运行,然后创建池。 [root@ceph-01 ~]# ceph osd pool create kubernetes 128 128 pool 'kubernetes' created
新创建的池必须在使用前进行初始化。使用该rbd工具初始化池:
[root@ceph-01 ~]# rbd pool init kubernetes
配置CEPH-CSI
设置 CEPH 客户端身份验证
为 Kubernetes 和 ceph -csi创建一个新用户,当然也可以直接使用client.admin用户
[root@ceph-01 ~]# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd pool=kubernetes' [client.kubernetes] key = AQBYpZRiY/JmHRAAD6/jr3cE9E0B/7QjLGi8/w==
接下来我们执行 ceph auth list就可以看到
生成CEPH-CSI CONFIGMAP
ceph -csi需要一个存储在 Kubernetes 中的ConfigMap对象来定义Ceph集群的 Ceph mon地址
[root@ceph-01 ~]# ceph mon dump epoch 3 fsid c8ae7537-8693-40df-8943-733f82049642 #集群ID,后面需要使用 last_changed 2022-01-10 22:52:57.150281 created 2022-01-10 22:45:09.178972 min_mon_release 14 (nautilus) 0: [v2:192.168.31.20:3300/0,v1:192.168.31.20:6789/0] mon.ceph-01 #mon节点 1: [v2:192.168.31.21:3300/0,v1:192.168.31.21:6789/0] mon.ceph-02 2: [v2:192.168.31.80:3300/0,v1:192.168.31.80:6789/0] mon.ceph-03 dumped monmap epoch 3 ... #当然ceph -s也可以看到 [root@ceph-01 ~]# ceph -s |grep mon mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 16h) rgw: 2 daemons active (ceph-01, ceph-02)
修改ceph mon节点ip地址,修改集群clusterID。
[root@k8s-01 ~]# mkdir /root/ceph #将cpeh configmap存储在/root/ceph目录中 #clusterID需要和上面获取到的id保持一致,并且需要修改mon地址,多个地址后面需要使用逗号分隔。 cat <<EOF > /root/ceph/csi-config-map.yaml --- apiVersion: v1 kind: ConfigMap data: config.json: |- [ { "clusterID": "c8ae7537-8693-40df-8943-733f82049642", "monitors": [ "192.168.31.21:6789", "192.168.31.22:6789", "192.168.31.23:6789" ] } ] metadata: name: ceph-csi-config EOF
在Kubernetes中创建
[root@k8s-01 ceph]# cd /root/ceph [root@k8s-01 ceph]# kubectl apply -f csi-config-map.yaml configmap/ceph-csi-config created
在Kubernetes中就可以看到已经创建的configmap
最新版本的ceph-csi还需要一个额外的ConfigMap对象来定义密钥管理服务 (KMS) 提供者的详细信息。如果未设置 KMS,请将空配置放入csi-kms-config-map.yaml
必须填写,后面可以不使用,但是要有这个configmap,下面的pod会调用
cat <<EOF > /root/ceph/csi-kms-config-map.yaml --- apiVersion: v1 kind: ConfigMap data: config.json: |- {} metadata: name: ceph-csi-encryption-kms-config EOF #创建空配置文件即可 [root@k8s-01 ceph]# kubectl apply -f csi-kms-config-map.yaml
ceph-csi还需要创建一个configmap,用于读取ceph节点中的ceph.conf中的配置文件,csi容器会读取这个配置文件
cat <<EOF > /root/ceph/ceph-config-map.yaml --- apiVersion: v1 kind: ConfigMap data: ceph.conf: | [global] auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx # keyring is a required key and its value should be empty keyring: | metadata: name: ceph-config EOF
ceph-csi还需要另一个ConfigMap对象来定义 Ceph 配置以添加到 CSI 容器内的 ceph.conf 文件中
cat <<EOF > /root/ceph/ceph-config-map.yaml --- apiVersion: v1 kind: ConfigMap data: ceph.conf: | [global] auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx # keyring is a required key and its value should be empty keyring: | metadata: name: ceph-config EOF [root@k8s-01 ~]# kubectl apply -f ceph-config-map.yaml #请注意,所有的yaml文件都放在/root/ceph目录中
ceph -csi需要 cephx 凭据才能与 Ceph 集群通信。使用新创建的 Kubernetes 用户 id 和 cephx 密钥生成类似于以下示例的csi-rbd-secret.yaml文件
ceph auth list 获取ceph用户,找到admin用户,复制后面的Key
使用kubernetes用户会存在pvc创建失败的问题
cat <<EOF > /root/ceph/csi-rbd-secret.yaml --- apiVersion: v1 kind: Secret metadata: name: csi-rbd-secret namespace: default stringData: userID: admin userKey: JmHRAAD6/jr3cE9E0B/7QjLGi8/w== EOF #创建secret [root@k8s-01 ~]# kubectl apply -f csi-rbd-secret.yaml
到目前为止,ceph-csi的相关配置文件已经创建完毕
[root@k8s-01 ~]# kubectl get secret NAME TYPE DATA AGE csi-rbd-secret Opaque 2 79s [root@k8s-01 ~]# kubectl get cm NAME DATA AGE ceph-config 2 6m32s ceph-csi-config 1 28m ceph-csi-encryption-kms-config 1 20m
CEPH-CSI RBD 创建
ceph中不推荐在ceph rbd模式下使用RWX访问控制,如果应用层没有访问锁机制,可能会造成数据损坏。所以rbd模式我们只可以使用一个节点
部署CEPH-CSI RBAC
ceph-csi需要创建ServiceAccount和RBAC用于访问Kubernetes集群内部信息
#官方下载地址 kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml #abcdocker提供下载地址 kubectl apply -f https://d.frps.cn/file/tools/ceph-csi/csi-provisioner-rbac.yaml kubectl apply -f https://d.frps.cn/file/tools/ceph-csi/csi-nodeplugin-rbac.yaml
部署ceph-csi provisioner
默认情况下,provisioner和节点插件YAML将拉取ceph -csi容器的开发版本 (quay.io/cephcsi/cephcsi:canary)
这里需要我们提前导入镜像
#在k8s-01上下载,scp到其他节点 wget -P /tmp/ https://d.frps.cn/file/tools/ceph-csi/k8s_1.24_ceph-csi.tar #在k8s-01导入镜像 ctr -n k8s.io i import k8s_1.24_ceph-csi.tar #在其他节点导入镜像,根据需求修改for循环即可 for i in k8s-02 k8s-03 k8s-04 k8s-05; do scp /tmp/k8s_1.24_ceph-csi.tar root@$i:/tmp/ ssh root@$i ctr -n k8s.io i import /tmp/k8s_1.24_ceph-csi.tar done
导入完镜像就可以安装deployment
#官方下载地址 cd /root/ceph wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml #abcdocker提供下载地址 wget https://d.frps.cn/file/tools/ceph-csi/csi-rbdplugin.yaml wget https://d.frps.cn/file/tools/ceph-csi/csi-rbdplugin-provisioner.yaml
创建provisioner
[root@k8s-01 ~]# cd /root/ceph [root@k8s-01 ceph]# kubectl apply -f csi-rbdplugin.yaml [root@k8s-01 ceph]# kubectl apply -f csi-rbdplugin-provisioner.yaml
查看pod和deployment状态
Ceph Storageclass 动态存储
ceph-csi定义好之后,我们就可以定义storageClass
需要根据实际情况修改集群id
cat <<EOF > /root/ceph/csi-rbd-sc.yaml --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-rbd-sc #storageclass名称 provisioner: rbd.csi.ceph.com #驱动器 parameters: clusterID: c8ae7537-8693-40df-8943-733f82049642 #ceph集群id pool: kubernetes #pool空间 imageFeatures: layering #rbd特性 csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret csi.storage.k8s.io/provisioner-secret-namespace: default csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret csi.storage.k8s.io/controller-expand-secret-namespace: default csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret csi.storage.k8s.io/node-stage-secret-namespace: default reclaimPolicy: Delete #pvc回收机制 allowVolumeExpansion: true #对扩展卷进行扩展 mountOptions: #StorageClass 动态创建的 PersistentVolume 将使用类中 mountOptions 字段指定的挂载选项 - discard EOF kubectl apply -f /root/ceph/csi-rbd-sc.yaml
layering特性使得克隆image的时候,父子image之间采用COW,他们之间的对象文件存在依赖关系,flatten操作的目的是解除父子image的依赖关系,但是子image的快照并没有解除依赖,deep-flatten特性使得快照的依赖也解除。
ceph支持 layering,striping exclusive lock, object map,fast diff ,deep-flatten 等新的new features
layering | image的克隆操作。可以对image创建快照并保护,然后从快照克隆出新的image出来,父子image之间采用COW技术,共享对象数据。 |
striping v2 | 条带化对象数据,类似raid 0,可改善顺序读写场景较多情况下的性能。 |
exclusive lock | 保护image数据一致性,对image做修改时,需要持有此锁。这个可以看做是一个分布式锁,在开启的时候,确保只有一个客户端在访问image,否则锁的竞争会导致io急剧下降。 主要应用场景是qemu live-migration。 |
object map | 此特性依赖于exclusive lock。因为image的对象分配是thin-provisioning,此特性开启的时候,会记录image所有对象的一个位图,用以标记对象是否真的存在,在一些场景下可以加速io。 |
fast diff | 此特性依赖于object map和exlcusive lock。快速比较image的snapshot之间的差异。 |
deep-flatten | layering特性使得克隆image的时候,父子image之间采用COW,他们之间的对象文件存在依赖关系,flatten操作的目的是解除父子image的依赖关系,但是子image的快照并没有解除依赖,deep-flatten特性使得快照的依赖也解除。 |
journaling | 依赖于exclusive lock。将image的所有修改操作进行日志化,并且复制到另外一个集群(mirror),可以做到块存储的异地灾备。这个特性在部署的时候需要新部署一个daemon进程,目前还在试验阶段,不过这个特性很重要,可以做跨集群/机房容灾。 |
Exclusive Lock | 从上面可以看出,很多特性都依赖于exclusive lock,重点介绍一下。 |
exclusive lock | 是分布式锁,实现的时候默认是客户端在第一次写的时候获取锁,并且在收到其他客户端的锁请求时自动释放锁。这个特性在jewel默认开启后,本身没什么问题, 客户端可以自动获取和释放锁,在客户端crash后也能够正确处理。 |
查看StorageClass状态
[root@k8s-01 ~]# kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE csi-rbd-sc rbd.csi.ceph.com Delete Immediate true 3m26s
创建pvc测试
cat <<EOF > /root/ceph/raw-block-pvc.yaml --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: raw-block-pvc #pvc名称 spec: accessModes: - ReadWriteOnce #访问模式 volumeMode: Block #数据卷类型 resources: requests: storage: 1Gi #存储空间 storageClassName: csi-rbd-sc #后端storageclass名称 EOF kubectl apply -f /root/ceph/raw-block-pvc.yaml
查看pvc创建情况
当我们创建pvc后,pv会自动帮我们创建好
[root@k8s-01 ~]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE raw-block-pvc Bound pvc-20bc551a-2e28-44f1-94f4-7025a0e01aa5 1Gi RWO csi-rbd-sc 82s [root@k8s-01 ~]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-20bc551a-2e28-44f1-94f4-7025a0e01aa5 1Gi RWO Delete Bound default/raw-block-pvc csi-rbd-sc 84s
我ceph中的pool里,就可以看到新创建的rbd
[root@ceph-01 ~]# rbd ls kubernetes csi-vol-88e24aae-e279-11ec-867c-562ca7dbc101 [root@ceph-01 ~]# ceph df RAW STORAGE: CLASS SIZE AVAIL USED RAW USED %RAW USED hdd 180 GiB 144 GiB 32 GiB 36 GiB 20.06 TOTAL 180 GiB 144 GiB 32 GiB 36 GiB 20.06 POOLS: POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL abcdocker 1 64 618 MiB 350 1.8 GiB 1.39 43 GiB .rgw.root 2 32 1.2 KiB 4 768 KiB 0 43 GiB default.rgw.control 3 32 0 B 8 0 B 0 43 GiB default.rgw.meta 4 32 1.7 KiB 7 1.1 MiB 0 43 GiB default.rgw.log 5 32 0 B 207 0 B 0 43 GiB default.rgw.buckets.index 6 32 0 B 2 0 B 0 43 GiB default.rgw.buckets.data 7 32 0 B 0 0 B 0 43 GiB cephfs_data 8 64 10 GiB 2.56k 30 GiB 18.87 43 GiB cephfs_metadata 9 64 671 KiB 23 3.6 MiB 0 43 GiB kubernetes 11 128 36 B 8 384 KiB 0 43 GiB
我们可以详细的看一下ceph rbd中的镜像使用情况
[root@ceph-01 ~]# rbd info kubernetes/csi-vol-88e24aae-e279-11ec-867c-562ca7dbc101 rbd image 'csi-vol-88e24aae-e279-11ec-867c-562ca7dbc101': size 1 GiB in 256 objects order 22 (4 MiB objects) snapshot_count: 0 id: 4565b1a1dbd46 block_name_prefix: rbd_data.4565b1a1dbd46 format: 2 features: layering op_features: flags: create_timestamp: Thu Jun 2 21:40:15 2022 access_timestamp: Thu Jun 2 21:40:15 2022 modify_timestamp: Thu Jun 2 21:40:15 2022
在ceph中不推荐在ceph rbd模式下使用RWX访问控制,如果应用层没有访问锁机制,可能会造成数据损坏。所以rbd模式我们只可以使用一个节点
首先创建一个pvc
[root@k8s-01 nginx]# cat pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nginx-pvc-abcdocker labels: app: abcdocker-test spec: storageClassName: csi-rbd-sc #这里的storageclass是我们之前申请的 accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
创建nginx配置文件
[root@k8s-01 nginx]# cat nginx-pvc.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-frontend-abcdocker name: nginx-frontend-abcdocker spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: nginx-frontend-abcdocker strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: nginx-frontend-abcdocker spec: containers: - image: nginx:latest imagePullPolicy: IfNotPresent name: nginx-frontend-abcdocker ports: - containerPort: 80 protocol: TCP volumeMounts: - mountPath: /usr/share/nginx/html name: abcdocker-volume restartPolicy: Always volumes: - name: abcdocker-volume persistentVolumeClaim: claimName: nginx-pvc-abcdocker readOnly: false --- apiVersion: v1 kind: Service metadata: name: nginx-frontend-abcdocker spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx-frontend-abcdocker sessionAffinity: None type: NodePort
kubectl apply -f .当我们创建好pvc和deployment的时候,我们就可以访问看一下
[root@k8s-01 ~]# kubectl exec -it nginx-frontend-abcdocker-6d797446f4-djjgb bash kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. root@nginx-frontend-abcdocker-6d797446f4-djjgb:/# df -h Filesystem Size Used Avail Use% Mounted on overlay 79G 11G 69G 14% / tmpfs 64M 0 64M 0% /dev tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup shm 64M 0 64M 0% /dev/shm /dev/sda3 79G 11G 69G 14% /etc/hosts /dev/rbd0 974M 28K 958M 1% /usr/share/nginx/html tmpfs 7.7G 12K 7.7G 1% /run/secrets/kubernetes.io/serviceaccount tmpfs 3.9G 0 3.9G 0% /proc/acpi tmpfs 3.9G 0 3.9G 0% /proc/scsi tmpfs 3.9G 0 3.9G 0% /sys/firmware #我们可以看到已经挂载好的/dev/rbd0目录
容器events没有报错以及异常
StatefulSet使用StorageClass生产实践
生产环境中,StatefulSet一般直接在Kubernetes使用volumeClaimTemplates来申请存储空间,用而减少pvc的创建步骤
cat >/root/ceph/nginx-st.yaml <<EOF apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: replicas: 3 revisionHistoryLimit: 10 serviceName: nginx selector: matchLabels: app: nginx template: metadata: #name没写,会默认生成的 labels: app: nginx spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80 volumeMounts: - name: web #填vcp名字 mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: web spec: accessModes: ["ReadWriteOnce"] storageClassName: csi-rbd-sc volumeMode: Filesystem resources: requests: storage: 512M EOF #创建持久化存储 [root@k8s-01 nginx]# kubectl apply -f /root/ceph/nginx-st.yaml
默认会创建3个pod,为有序
[root@k8s-01 nginx]# kubectl get pod|grep web web-0 1/1 Running 0 101m web-1 1/1 Running 0 101m web-2 1/1 Running 0 100m
并且会为每一个pod创建一个rbd文件
[root@k8s-01 nginx]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nginx-pvc-abcdocker Bound pvc-5e314f99-c0c4-45b7-9c08-3a3a39ea9bb3 1Gi RWO csi-rbd-sc 135m raw-block-pvc Bound pvc-be023d3f-af00-4207-b804-d531ffcaa421 1Gi RWO csi-rbd-sc 151m web-web-0 Bound pvc-332a937f-f97d-4270-9115-081cb3d60a44 489Mi RWO csi-rbd-sc 102m web-web-1 Bound pvc-ea192941-fc9b-4e3e-8142-b531e7ead8da 489Mi RWO csi-rbd-sc 102m web-web-2 Bound pvc-09ad9cae-9207-4e68-8c58-5cfe38c40dc3 489Mi RWO csi-rbd-sc 101m [root@k8s-01 nginx]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-09ad9cae-9207-4e68-8c58-5cfe38c40dc3 489Mi RWO Delete Bound default/web-web-2 csi-rbd-sc 101m pvc-332a937f-f97d-4270-9115-081cb3d60a44 489Mi RWO Delete Bound default/web-web-0 csi-rbd-sc 102m pvc-5e314f99-c0c4-45b7-9c08-3a3a39ea9bb3 1Gi RWO Delete Bound default/nginx-pvc-abcdocker csi-rbd-sc 135m pvc-be023d3f-af00-4207-b804-d531ffcaa421 1Gi RWO Delete Bound default/raw-block-pvc csi-rbd-sc 151m pvc-ea192941-fc9b-4e3e-8142-b531e7ead8da 489Mi RWO Delete Bound default/web-web-1 csi-rbd-sc 102m
查看容器挂载情况
[root@k8s-01 nginx]# kubectl exec -it web-1 bash kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. root@web-1:/# df -h Filesystem Size Used Avail Use% Mounted on overlay 50G 20G 31G 40% / tmpfs 64M 0 64M 0% /dev tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup shm 64M 0 64M 0% /dev/shm /dev/sda3 50G 20G 31G 40% /etc/hosts /dev/rbd0 466M 2.3M 460M 1% /usr/share/nginx/html #默认挂载点 tmpfs 3.7G 12K 3.7G 1% /run/secrets/kubernetes.io/serviceaccount tmpfs 1.9G 0 1.9G 0% /proc/acpi tmpfs 1.9G 0 1.9G 0% /proc/scsi tmpfs 1.9G 0 1.9G 0% /sys/firmware
并且我们查看rbd文件,也可以看到对应的镜像
StatefulSet常用于Redis、Mysql、ES做集群的时候,数据相互隔离,互相主备的关系
相关文章:
- Ceph-deploy 快速部署Ceph集群
- Ceph OSD扩容与缩容
- Ceph集群日常使用命令
- Ceph RBD 备份与恢复