操作系统:centos-7.9 x86_64,内核版本3.10.0,所有组件安装均在该操作系统
ceph版本:ceph version 14.2.22 nautilus (stable)
kubernetes版本:v1.17.4
ceph-csi版本:v3.0.0
docker版本:19.03.9
前置条件:docker、k8s、ceph均已部署完毕
ceph 集群开启安全模式
ceph config set mon auth_allow_insecure_global_id_reclaim true
默认应该是开启的
使用cephfs必须开启mds服务(元数据服务的守护进程),此进程管理与CephFS上存储的文件相关的元数据,并协调对Ceph存储集群的访问。因此,若要使用CephFS接口,需要在存储集群中至少部署一个MDS实例
# 在admin节点使用ceph-deploy命令开启mds服务,将mds服务运行在node1节点上
ceph-deploy mds create node1
查看是否启动成功systemctl status ceph-mds@node1
使用cephfs之前需要事先于集群中创建一个文件系统,并为其分别指定元数据和数据相关的存储池,本次测试创建名为k8s-cephfs
的文件系统,使用k8s-cephfs-metadata
作为元数据存储池,使用k8s-cephfs
为数据存储池
# 创建存储池
ceph osd pool create k8s-cephfs 16
ceph osd pool create k8s-cephfs-metadata 16
# 创建文件系统
ceph fs new k8s-cephfs k8s-cephfs-metadata k8s-cephfs
# 查看创建的cephfs
[root@node1 ~]# ceph fs ls
name: k8s-cephfs, metadata pool: k8s-cephfs-metadata, data pools: [k8s-cephfs ]
本次操作使用ceph的admin用户,不再另外创建用户,如有需要可自行另外创建
获取admin用户的key
[root@node1 ~]# ceph auth get client.admin
[client.admin]
key = AQCV4n5j60KACxAA0ZX1s/ABTrWFcJN5Tnun9w==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
exported keyring for client.admin
获取ceph集群monitor信息,主要是需要其中的fsid和mon的node信息
[root@node1 ~]# ceph mon dump
epoch 1
fsid f38a95d3-b932-480c-89bc-161a4f81c160 // 后续k8s使用的ceph的cluster id是这个
last_changed 2022-11-24 11:18:44.328712
created 2022-11-24 11:18:44.328712
min_mon_release 14 (nautilus)
0: [v2:192.168.221.141:3300/0,v1:192.168.221.141:6789/0] mon.node1 // 这里的3300和6789测试均可使用
dumped monmap epoch 1
命名空间直接使用default,如果有需要自行创建新的命名空间
本次是在master节点操作,其他节点未做尝试
git clone --branch v3.0.0 https://github.com/ceph/ceph-csi.git
cd ceph-csi/deploy/cephfs/kubernetes
---
apiVersion: v1
kind: ConfigMap
data:
config.json: |-
[
{
"clusterID": "f38a95d3-b932-480c-89bc-161a4f81c160", # 前面的fsid
"monitors": [
"192.168.221.141:6789"
]
}
]
metadata:
name: ceph-csi-config-fs # 加了fs目的是个rbd的操作做区分
csi-provisioner-rbac.yaml和csi-nodeplugin-rbac.yaml里面的命名空间,如果不适用default,需要自行修改为要使用的namespace
csi-provisioner-psp.yaml和csi-nodeplugin-psp.yaml这两个文件,因为集群没有开启PodSecurityPolicy ,因此也不设置,也不会部署
kubectl apply -f csi-config-map.yaml
kubectl apply -f csi-provisioner-rbac.yaml
kubectl apply -f csi-nodeplugin-rbac.yaml
kubectl apply -f csi-cephfsplugin-provisioner.yaml
kubectl apply -f csi-cephfsplugin.yaml
查看启动的pods是否正常kubectl get pods
k8s集群操作
[root@master cephfs]# cd ceph-csi/examples/cephfs
[root@master cephfs]# vim secret.yaml
// 内容如下,其中的userid和userkey都是ceph集群的用户和key,本文第一步已经获取得到了
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: default
stringData:
userID: admin
userKey: AQCV4n5j60KACxAA0ZX1s/ABTrWFcJN5Tnun9w==
adminID: admin
adminKey: AQCV4n5j60KACxAA0ZX1s/ABTrWFcJN5Tnun9w==
[root@master cephfs]# kubectl apply -f secret.yaml
vim storageclass.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
# (required) String representing a Ceph cluster to provision storage from.
# Should be unique across all Ceph clusters in use for provisioning,
# cannot be greater than 36 bytes in length, and should remain immutable for
# the lifetime of the StorageClass in use.
# Ensure to create an entry in the configmap named ceph-csi-config, based on
# csi-config-map-sample.yaml, to accompany the string chosen to
# represent the Ceph cluster in clusterID below
clusterID: f38a95d3-b932-480c-89bc-161a4f81c160 # 此处就是填写上面的clusterID
# (required) CephFS filesystem name into which the volume shall be created
# eg: fsName: myfs
fsName: k8s-cephfs # 填写上面的文件系统
# (optional) Ceph pool into which volume data shall be stored
# pool:
# (optional) Comma separated string of Ceph-fuse mount options.
# For eg:
# fuseMountOptions: debug
# (optional) Comma separated string of Cephfs kernel mount options.
# Check man mount.ceph for mount options. For eg:
# kernelMountOptions: readdir_max_bytes=1048576,norbytes
# The secrets have to contain user and/or Ceph admin credentials.
# 注意,这里的命名空间如有修改,请做修改
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/node-stage-secret-name: csi-cephfs-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
# (optional) The driver can use either ceph-fuse (fuse) or
# ceph kernelclient (kernel).
# If omitted, default volume mounter will be used - this is
# determined by probing for ceph-fuse and mount.ceph
# mounter: kernel
# (optional) Prefix to use for naming subvolumes.
# If omitted, defaults to "csi-vol-".
# volumeNamePrefix: "foo-bar-"
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
kubectl apply -f storageclass.yaml
kubectl get sc
kubectl apply -f pvc.yaml
kubectl get pvc
kubectl apply -f pod.yaml
kubectl get pods
验证成功
先获取pods信息
上图中的几个pod,不一定log在哪个pod中,可以试试,因为对k8s还不是很熟悉,暂时不知道更多方式
kubectl logs csi-cephfsplugin-provisioner-7c46d589d9-7m5b4 -c csi-cephfsplugin
在安装pvc时,pod一直是pending状态,日志内提示pvc-31c28f95-cf1e-4746-81ce-51d24f34a5b2 an operation with the given Volume ID pvc-31c28f95-cf1e-4746-81ce-51d24f34a5b2 already exists
,根据网上教程设置monitor端口为3300后还是不可以。
后来发现是没有启动ceph集群没有开启mds
服务,开启之后,pod状态直接转为bound了,后续操作完成。