cephadm部署ceph集群以及k8s对接

Ceph的介绍

Ceph 是一个开源、统一、分布式存储系统 ,核心是去中心化架构 + CRUSH 算法 ,同时提供对象、块、文件三种存储服务,具备高可靠、高扩展、高性能特点。

统一性

统一的:一套集群同时提供三种接口:

  • 对象存储(RGW):兼容 S3/Swift,适合非结构化数据(图片、视频、日志)
  • 块存储(RBD):虚拟磁盘,用于虚拟机、数据库
  • 文件存储(CephFS):标准 POSIX 文件系统,适合共享目录

核心优势

去中心化:无单点瓶颈,客户端直接计算数据位置

高可靠:多副本(默认 3 副本)、自动故障恢复

强扩展:从几台到数千台服务器,容量与性能线性增长

低成本:基于通用 x86 服务器,无需专用存储硬件

ceph架构图

核心组件

组件 中文名称 核心功能
RADOS 可靠自动化分布式对象存储 Ceph 的底层核心,所有上层存储服务(RBD/RGW/CephFS)均基于它构建,提供对象存储、数据分布、副本管理、自愈能力
MON(Monitor) 集群监视器 集群 "大脑",维护集群状态地图(Cluster Map,含 OSD/PG/CRUSH 拓扑),通过 Paxos 协议保证多 MON 节点数据一致,判定节点故障
OSD(Object Storage Daemon) 对象存储守护进程 数据 "存储引擎",负责实际数据的读写、副本同步、数据校验、故障恢复,一个磁盘通常对应一个 OSD 进程
MDS(Metadata Server) 元数据服务器 仅为 CephFS 服务,管理文件目录结构、权限、inode 等元数据,块 / 对象存储无需此组件
MGR(Manager) 集群管理器 集群 "大管家",收集监控指标(IOPS / 带宽 / 使用率)、提供 Web Dashboard/REST API/Prometheus 接口、自动化运维(PG 均衡)
上层接口 - RBD(块存储)、RGW(对象存储)、CephFS(文件存储),对接不同业务场景

工作原理

Ceph 的核心是 "三层映射 + CRUSH 算法",全程由客户端直接计算数据位置,无需中心节点转发:

  1. 文件→Object(切分):文件按固定大小(默认 4MB)切分为多个 Object,每个 Object 生成唯一 OID(文件 ID + 块序号);

  2. Object→PG(哈希分组):对 OID 做哈希并与 PG 总数取模,映射到某个 PG(PG 是 Object 的逻辑分组,简化数据管理);

  3. PG→OSD(CRUSH 算法):客户端从 MON 获取集群拓扑(CRUSH Map),通过 CRUSH 算法计算出 PG 对应的一组 OSD(默认 3 副本:主 OSD+2 副本 OSD);

  4. 数据读写:

    • 写入:客户端直接向主 OSD 发数据,主 OSD 同步到副本 OSD,所有副本确认后返回写入成功;
    • 读取:客户端直接向主 OSD 读数据,故障时自动切换到副本 OSD,读取后由客户端将多个 Object 拼接为完整文件;
  5. 故障自愈:OSD 故障时,MON 标记其为 down,集群自动将故障 OSD 上的 PG 副本迁移到健康 OSD,全程无需人工干预。

OSD的各个状态

极简口诀(背会就懂 Ceph 核心)

  • OSD 存数据
  • MON 管地图
  • Cluster Map 是全部信息
  • CRUSH 决定数据放哪
  • PG 是数据分组,方便管理
  • MGR 是集群管家,收集集群指标
  • MDS 处理元数据服务,cephfs才用

部署ceph集群

配置域名解析

bash 复制代码
cat >> /etc/hosts << EOF
172.25.254.91 ceph1
172.25.254.92 ceph2
172.25.254.93 ceph3
EOF

配置时间同步

全部主机

bash 复制代码
dnf install chrony -y
sed -i '/^pool/ c server ntp.aliyun.com iburst' /etc/chrony.conf
systemctl enable --now chronyd
systemctl restart chronyd
chronyc sources -v

cephadm工具安装

bash 复制代码
cat >> /etc/yum.repos.d/ceph.repo <<EOF
[ceph]
name=Ceph 
baseurl=https://mirrors.aliyun.com/ceph/rpm-squid/el9/x86_64
gpgcheck=0

[ceph-noarch]
name=Ceph noarch 
baseurl=https://mirrors.aliyun.com/ceph/rpm-squid/el9/noarch
gpgcheck=0

[ceph-source]
name=Ceph source 
baseurl=https://mirrors.aliyun.com/ceph/rpm-squid/el9/SRPMS
gpgcheck=0
EOF

dnf install cephadm -y

安装docker

全部主机

bash 复制代码
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

dnf install docker-ce -y
systemctl enable --now docker

cephadm初始化集群

bash 复制代码
cephadm --docker bootstrap \
--mon-ip 172.25.254.91 \
--initial-dashboard-user admin \
--initial-dashboard-password redhat \
--dashboard-password-noupdate \
--allow-fqdn-hostname

显示以下信息为初始化完成

集群扩容

拷贝ceph配置文件的公钥给要加入的节点

bash 复制代码
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph2
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph3

添加节点到集群

bash 复制代码
cephadm shell ceph orch host add ceph2
cephadm shell ceph orch host add ceph3

安装ceph-common客户端管理

ceph集群全部节点安装

bash 复制代码
#要安装epel源
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm
sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*

dnf install ceph-common -y

添加osd

bash 复制代码
ceph orch apply osd --all-available-devices
或者一个一个加
ceph orch daemon add osd ceph1:/dev/nvme0n2
ceph orch daemon add osd ceph1:/dev/nvme0n3
ceph orch daemon add osd ceph2:/dev/nvme0n2
ceph orch daemon add osd ceph2:/dev/nvme0n3
ceph orch daemon add osd ceph3:/dev/nvme0n2
ceph orch daemon add osd ceph3:/dev/nvme0n3
......

添加管理节点

bash 复制代码
ceph orch host label add ceph1 _admin

部署mon与mgr

bash 复制代码
ceph orch apply mon "ceph1 ceph2 ceph3"
ceph orch apply mgr --placement "ceph1 ceph2 ceph3"

查看ceph集群状态

bash 复制代码
ceph -s 
ceph -w 实时查看ceph状态

k8s对接ceph资源说明

项目网址:https://github.com/ceph/ceph-csi

bash 复制代码
#把软件拉取下来后cd到要对接的rbd或者cephfs上
cd ceph-csi-3.16.2/deploy/rbd或者cephfs/kubernetes/
#目录下有认证与授权,控制器与插件,配置文件与secret以及csidriver的yaml文件

https://github.com/ceph/ceph-csi/tree/devel/examples

bash 复制代码
#examples下有rbd或者ceph的PVC,storageclsss,以及测试pod的yaml文件

k8s对接ceph rbd

k8s安装ceph客户端

bash 复制代码
cat >> /etc/yum.repos.d/ceph.repo <<EOF
[ceph]
name=Ceph 
baseurl=https://mirrors.aliyun.com/ceph/rpm-squid/el9/x86_64
gpgcheck=0

[ceph-noarch]
name=Ceph noarch 
baseurl=https://mirrors.aliyun.com/ceph/rpm-squid/el9/noarch
gpgcheck=0

[ceph-source]
name=Ceph source 
baseurl=https://mirrors.aliyun.com/ceph/rpm-squid/el9/SRPMS
gpgcheck=0
EOF

yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm
sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*

dnf install ceph-common -y

配置本地解析

集群所有主机都要配置

bash 复制代码
cat > /etc/hosts <<EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.100 k8s-master
172.25.254.10  k8s-node1
172.25.254.20  k8s-node2
172.25.254.91	ceph1
172.25.254.92	ceph2
172.25.254.93	ceph3
EOF

获取ceph配置文件

只有获取了ceph配置文件才能通过ceph-common来管理ceph

bash 复制代码
scp -r /etc/ceph/ root@k8s-master:/etc/
scp -r /etc/ceph/ root@k8s-node1:/etc/
scp -r /etc/ceph/ root@k8s-node2:/etc/

创建数据池并初始化

ceph新建pool,user

bash 复制代码
[root@k8s-master ~]# ceph osd pool create kubernetes

[root@k8s-master ~]# rbd pool init kubernetes

如果创建错误可以删除用过以下命令
#查看存在的池
[root@k8s-master kubernetes]# ceph osd pool ls
#ceph默认是关闭了删除池的功能要开启,确保安全
[root@k8s-master kubernetes]# ceph config set mon mon_allow_pool_delete true
#要输入两次池的名称来确认要要删除
[root@k8s-master kubernetes]# ceph osd pool delete kubernets kubernets --yes-i-really-really-mean-it
#设置回关闭
[root@k8s-master kubernetes]# ceph config set mon mon_allow_pool_delete false

去除master的污点

bash 复制代码
[root@k8s-master kubernetes]# kubectl describe nodes k8s-master | grep -i taint
[root@k8s-master kubernetes]# kubectl taint node k8s-master node-role.kubernetes.io/control-plane:NoSchedule-
node/k8s-master untainted

部署csi控制器与插件的认证用户与授权

bash 复制代码
#部署用户认证与授权
[root@k8s-master kubernetes]# kubectl apply -f csi-provisioner-rbac.yaml
[root@k8s-master kubernetes]# kubectl apply -f csi-nodeplugin-rbac.yaml

部署csi的驱动

bash 复制代码
[root@k8s-master kubernetes]# cat csidriver.yaml
---
apiVersion: storage.k8s.io/v1
kind: CSIDriver
metadata:
  name: "rbd.csi.ceph.com"
spec:
  attachRequired: true
  podInfoOnMount: false
  seLinuxMount: true
  fsGroupPolicy: File


#创建部署csi驱动,允许csi能创建和挂载存储卷
[root@k8s-master kubernetes]# kubectl apply -f csidriver.yaml

部署csi控制器与插件

bash 复制代码
#此处如果没有访问外网能力需要更改镜像地址为国内
[root@k8s-master kubernetes]# sed -i 's#registry.k8s.io/sig-storage#registry.cn-hangzhou.aliyuncs.com/google-containers#' csi-nodeplugin-rbac.yaml
[root@k8s-master kubernetes]# sed -i 's#registry.k8s.io/sig-storage#registry.cn-hangzhou.aliyuncs.com/google-containers#' csi-nodeplugin-rbac.yaml

#部署csi控制器与csi节点插件
[root@k8s-master kubernetes]# kubectl apply -f csi-rbdplugin-provisioner.yaml
[root@k8s-master kubernetes]# kubectl apply -f csi-rbdplugin.yaml

创建配置文件cm

bash 复制代码
#查看集群信息
[root@k8s-master ~]# ceph mon dump
epoch 3
fsid 297a3e0c-22ca-11f1-aee2-000c29785bd5		#配置文件要指定
last_changed 2026-03-18T13:27:47.857110+0000
created 2026-03-18T12:58:35.103687+0000
min_mon_release 19 (squid)
election_strategy: 1
0: [v2:172.25.254.91:3300/0,v1:172.25.254.91:6789/0] mon.ceph1
1: [v2:172.25.254.92:3300/0,v1:172.25.254.92:6789/0] mon.ceph2
2: [v2:172.25.254.93:3300/0,v1:172.25.254.93:6789/0] mon.ceph3
dumped monmap epoch 3

[root@k8s-master kubernetes]# vim csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: "ceph-csi-config"
data:
  config.json: |-
    [
      {
        "clusterID":"297a3e0c-22ca-11f1-aee2-000c29785bd5",
        "monitors":[
          "172.25.254.91:6789",
          "172.25.254.92:6789",
          "172.25.254.93:6789"
        ]
      }
    ]

[root@k8s-master kubernetes]# kubectl apply -f csi-config-map.yaml

[root@k8s-master kubernetes]# cat 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: |
metadata:
  name: ceph-config

[root@k8s-master kubernetes]# kubectl apply -f ceph-config-map.yaml

[root@k8s-master kubernetes]# cat csi-kms-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    {}
metadata:
  name: ceph-csi-encryption-kms-config

[root@k8s-master kubernetes]# kubectl apply -f csi-kms-config-map.yaml

创建认证文件secret

bash 复制代码
#为kubernets与ceph-csi创建用户
[root@k8s-master ~]# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd pool=kubernetes'
[client.kubernetes]
        key = AQBui7tpyXcLNxAAfRIyG39SG4ogbTpUx5Knvw==     

#查看用户        
[root@k8s-master ~]# ceph auth ls | grep -A 4 client.kubernetes
client.kubernetes
        key: AQBui7tpyXcLNxAAfRIyG39SG4ogbTpUx5Knvw==
        caps: [mgr] profile rbd pool=kubernetes
        caps: [mon] profile rbd
        caps: [osd] profile rbd pool=kubernetes


[root@k8s-master kubernetes]# cat csi-rbd-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
stringData:
  userID: kubernetes
  userKey: AQBui7tpyXcLNxAAfRIyG39SG4ogbTpUx5Knvw==

[root@k8s-master kubernetes]# kubectl apply -f csi-rbd-secret.yaml

创建存储类

bash 复制代码
$ cat <<EOF > csi-rbd-sc.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
   clusterID: b9127830-b0cc-4e34-aa47-9d1a2e9949a8
   pool: kubernetes
   imageFeatures: layering
   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
allowVolumeExpansion: true
mountOptions:
   - discard
EOF

$ kubectl apply -f csi-rbd-sc.yaml

创建PVC测试

  • 由于filesystem禁止多节点挂载即使设置RWX也会被自动降级为RWO,多节点同时挂载会导致文件系统元数据(inode、目录项)损坏,数据丢失且无法恢复。
  • block允许多节点挂载,适用于数据库集群等自带并发控制的场景
bash 复制代码
$ cat <<EOF > raw-block-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: raw-block-pvc
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Block				#将rbd作为块设备来挂载使用
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-rbd-sc
EOF
$ kubectl apply -f raw-block-pvc.yaml

#创建两个pod来测试
$ cat <<EOF > raw-block-pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-raw-block-volume-1
spec:
  nodeName:k8s-node1		#调度到node1
  containers:
    - name: fc-container
      image: fedora:26
      command: ["/bin/sh", "-c"]
      args: ["tail -f /dev/null"]
      volumeDevices:				#使用此参数来调用pvc
        - name: data
          devicePath: /dev/xvda
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: raw-block-pvc
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-raw-block-volume-2
spec:
  nodeName:k8s-node2		#调度到node2
  containers:
    - name: fc-container
      image: fedora:26
      command: ["/bin/sh", "-c"]
      args: ["tail -f /dev/null"]
      volumeDevices:				#使用此参数来调用pvc
        - name: data
          devicePath: /dev/xvda
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: raw-block-pvc
EOF
$ kubectl apply -f raw-block-pod.yaml

# 1. 检查两个 Pod 均运行成功
kubectl get pods -o wide

# 2. 在 Ceph 集群验证多节点映射
ceph osd pool ls  # 确认 rbd 池存在
rbd showmapped   # 能看到同一个 RBD 镜像被 node-1 和 node-2 同时映射
bash 复制代码
$ cat <<EOF > pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rbd-pvc
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem			#rbd作为filesystem来挂载使用
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-rbd-sc
EOF
$ kubectl apply -f pvc.yaml

#创建pod测试
$ cat <<EOF > pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: csi-rbd-demo-pod
spec:
  containers:
    - name: web-server
      image: nginx
      volumeMounts:					#使用此参数来调用pvc
        - name: mypvc
          mountPath: /var/lib/www/html
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        claimName: rbd-pvc
        readOnly: false
EOF
$ kubectl apply -f pod.yaml

k8s对接cephfs

准备工作

以下操作与对接ceph rbd一致

  • k8s安装ceph客户端
  • 配置本地解析
  • 获取ceph配置文件

创建数据池与元数据池,fs

bash 复制代码
cephfs要创建元数据池
#创建数据池与元数据池
ceph osd pool create k8s_cephfs_data 64
ceph osd pool create k8s_cephfs_metadata 64

#根据数据池与元数据池创建fs
ceph fs new <名称> <元数据池> <数据池>
ceph fs new k8s_cephfs k8s_cephfs_metadata k8s_cephfs_data

#查看命令
ceph osd pool ls	#查看pool的个数
ceph fs ls          #查看文件系统的个数

部署MDS

MDS是ceph作为cephfs时必须要的组件用于处理文件系统的元数据

bash 复制代码
#创建mds(处理元数据组件) --placemenet 3 ceph1 ceph2 ceph3指定部署在节点
ceph orch apply mds k8s_cephfs --placement="3 ceph1 ceph2 ceph3"

创建子卷

bash 复制代码
#在cephfs文件系统中创建一个子卷,不创建的话pvc显示pending,因为volume不能挂载到cephfs文件系统的根目录(k8s_cephfs_data)只能挂载到子目录上
[root@k8s-master kubernetes]# ceph fs subvolumegroup create k8s_cephfs csi
[root@k8s-master kubernetes]# ceph fs subvolumegroup ls k8s_cephfs
[
    {
        "name": "csi"		#查看创建的子卷
    }
]

创建用户(可选)

bash 复制代码
这个用户是csi管理ceph集群的用户,可以设定对应用户权限
#创建ceph用户,使用用户进行挂载(可选)
[root@k8s-master kubernetes]# ceph fs authorize fs client.user01 / rwps -o /etc/ceph/ceph.client.user01.keyring client:/etc/ceph/
[root@k8s-master kubernetes]# ceph fs authorize fs client.user02 / r -o /etc/ceph/ceph.client.user02.keyring
ceph权限包括:
r:仅读,如果未指定其他限制,则会向其子目录授予r权限
w:写入,如果未指定其他限制,则会向其子目录授予w权限
p:使用配额权限
s:创建快照权限

#复制用户文件到客户端
scp /etc/ceph/ceph.client.user01.keyring client1:/etc/ceph/
scp /etc/ceph/ceph.client.user02.keyring client2:/etc/ceph/

创建控制csi控制器的认证与授权

bash 复制代码
#创建认证用户与授权
[root@k8s-master kubernetes]# kubectl apply -f csi-nodeplugin-rbac.yaml -f csi-provisioner-rbac.yaml

部署csi驱动

bash 复制代码
[root@k8s-master kubernetes]# cat csidriver.yaml
---
apiVersion: storage.k8s.io/v1
kind: CSIDriver
metadata:
  name: "cephfs.csi.ceph.com"
spec:
  attachRequired: true
  podInfoOnMount: false
  fsGroupPolicy: File
  seLinuxMount: true


#创建部署csi驱动,允许csi能创建和挂载存储卷
[root@k8s-master kubernetes]# kubectl apply -f csidriver.yaml

去除master的污点

bash 复制代码
[root@k8s-master kubernetes]# kubectl describe nodes k8s-master | grep -i taint
[root@k8s-master kubernetes]# kubectl taint node k8s-master node-role.kubernetes.io/control-plane:NoSchedule-
node/k8s-master untainted

部署csi控制器与插件

bash 复制代码
#此处如果没有访问外网能力需要更改镜像地址为国内
[root@k8s-master kubernetes]# sed -i 's#registry.k8s.io/sig-storage#registry.cn-hangzhou.aliyuncs.com/google-containers#' csi-nodeplugin-rbac.yaml
[root@k8s-master kubernetes]# sed -i 's#registry.k8s.io/sig-storage#registry.cn-hangzhou.aliyuncs.com/google-containers#' csi-nodeplugin-rbac.yaml

部署csi驱动与csi节点插件
[root@k8s-master kubernetes]# kubectl apply -f csi-cephfsplugin-provisioner.yaml -f csi-cephfsplugin.yaml

创建配置文件cm

bash 复制代码
[root@k8s-master kubernetes]# vim csi-cephfs-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: "ceph-csi-config"
data:
  config.json: |-
    [
      {
        "clusterID":"297a3e0c-22ca-11f1-aee2-000c29785bd5",
        "monitors":[
          "172.25.254.91:6789",
          "172.25.254.92:6789",
          "172.25.254.93:6789"
        ],
        "cephFS": {
          "subvolumeGroup": "csi"
        }
      }
    ]
[root@k8s-master kubernetes]# kubectl apply -f csi-config-map.yaml

创建secret认证文件

bash 复制代码
#csi直接使用管理员用户来管理ceph集群
[root@k8s-master kubernetes]# ceph auth get client.admin
[client.admin]
        key = AQB5obppMzDDNRAAd5QM5eCYI3syzYr1tIdfYQ==
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow *"
        caps osd = "allow *"
  
[root@k8s-master kubernetes]# vim csi-cephfs-secret
---
apiVersion: v1
kind: Secret
metadata:
  name: csi-cephfs-secret
stringData:
  userID: admin
  userKey: AQB5obppMzDDNRAAd5QM5eCYI3syzYr1tIdfYQ==

  adminID: admin
  adminKey: AQB5obppMzDDNRAAd5QM5eCYI3syzYr1tIdfYQ==

  encryptionPassphrase: test_passphrase

[root@k8s-master kubernetes]# kubectl apply -f csi-cephfs-secret

创建存储类

bash 复制代码
#创建存储类
[root@k8s-master kubernetes]# vim csi-cephfs-sc.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
  clusterID: 297a3e0c-22ca-11f1-aee2-000c29785bd5
  fsName: k8s_cephfs
  pool: k8s_cephfs_data
  csi.storage.k8s.io/provisioner-secret-name: csi-cephfs-secret
  csi.storage.k8s.io/provisioner-secret-namespace: default
  csi.storage.k8s.io/controller-expand-secret-name: csi-cephfs-secret
  csi.storage.k8s.io/controller-expand-secret-namespace: default
  csi.storage.k8s.io/controller-publish-secret-name: csi-cephfs-secret
  csi.storage.k8s.io/controller-publish-secret-namespace: default
  csi.storage.k8s.io/node-stage-secret-name: csi-cephfs-secret
  csi.storage.k8s.io/node-stage-secret-namespace: default
  mounter: kernel
reclaimPolicy: Delete
allowVolumeExpansion: true

[root@k8s-master kubernetes]# kubectl apply -f csi-cephfs-sc.yaml

创建PVC

bash 复制代码
[root@k8s-master kubernetes]# vim csi-cephfs-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-cephfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-cephfs-sc
  
[root@k8s-master kubernetes]# kubectl apply -f csi-cephfs-pvc.yaml

#验证是否bound,bound则对接成功
[root@k8s-master kubernetes]# kubectl get pvc

测试

bash 复制代码
#创建pod测试是否能挂载使用
[root@k8s-master kubernetes]# vim csi-cephfs-pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: csi-cephfs-demo-pod
spec:
  containers:
    - name: web-server
      image: docker.io/library/nginx:latest
      volumeMounts:
        - name: mypvc
          mountPath: /usr/share/nginx/html/ #将默认发布目录挂载上去
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        claimName: csi-cephfs-pvc
        readOnly: false

[root@k8s-master kubernetes]# kubectl apply -f csi-cephfs-pod.yaml

由于ceph作为cephfs文件系统可以给多pod以及不同节点挂载使用,所以再创一个pod挂载验证
[root@k8s-master kubernetes]# cp csi-cephfs-pod.yaml csi-cephfs-pod2.yaml
[root@k8s-master kubernetes]# cat csi-cephfs-pod2.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: csi-cephfs-demo-pod2
spec:
  containers:
    - name: web-server
      image: docker.io/library/nginx:latest
      volumeMounts:
        - name: mypvc
          mountPath: /usr/share/nginx/html/	#同理
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        claimName: csi-cephfs-pvc
        readOnly: false
        
[root@k8s-master kubernetes]# kubectl apply -f csi-cephfs-pod2.yaml

kubectl exec -it csi-cephfs-demo-pod -- /bin/sh -c "echo 'hello test page' > /usr/share/nginx/html/index.html

由于默认发布目录被作为挂载路径,目录的文件都被清空覆盖,在集群访问pod的IP会显示403资源不存在

bash 复制代码
[root@k8s-node1 ~]# curl 10.244.169.154
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.29.6</center>
</body>
</html>

[root@k8s-node1 ~]# curl 10.244.169.155
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.29.6</center>
</body>
</html>

#添加默认发布文件
[root@k8s-master kubernetes]# kubectl exec -it csi-cephfs-demo-pod -- /bin/sh -c "echo 'hello test page' > /usr/share/nginx/html/index.html"

#再次访问
[root@k8s-master kubernetes]# curl 10.244.169.154
hello test page
[root@k8s-master kubernetes]# curl 10.244.169.155
hello test page
#由于访问的内容是一致可以证明cephfs可以被多个节点同时挂载
相关推荐
vpk1122 小时前
Docker Compose 常用命令大全
docker·容器·eureka
last demo2 小时前
docker容器监控
运维·docker·容器
CSH0563 小时前
k8s生产集群主机批量重启后,大量Pod启动失败故障排查复盘
docker·容器·kubernetes
匀泪3 小时前
云原生(docker网络)
docker·云原生·容器
飞火流星020273 小时前
常见的k8s平台功能对比、界面一览及KubeSphere安装、Rancher‌安装
云原生·容器·kubernetes·主流k8s平台·主流k8s平台功能对比·k8s在线安装·k8s离线安装
糟糕喔3 小时前
k8s运维-RBAC(6)
运维·容器·kubernetes
Uncertainty!!4 小时前
docker打包本地conda虚拟环境并远程部署
docker·容器·conda
一点事4 小时前
windows:安装docker
windows·docker·容器
moxiaoran57534 小时前
使用docker创建flowable容器
运维·docker·容器