Ceph对接K8S存储使用RBD
# Ceph对接K8S存储使用RBD
# 环境搭建
# 使用服务器规划
Master | node1 | node2 |
---|---|---|
192.168.0.61 | 192.168.0.2 | 192.168.0.53 |
Ceph1 | Ceph2 | Ceph3 | Ceph4 |
---|---|---|---|
192.168.0.130 | 192.168.0.141 | 192.168.0.249 | 192.168.0.47 |
硬盘10G*3 | 硬盘10G*3 | 硬盘10G*3 | 硬盘10G*3 |
# Ceph集群
使用ceph-deploy的方式将Ceph集群搭建完成。
[root@ceph1 ~]# ceph -s
cluster:
id: 1ca010d2-42d2-4ce8-b7da-4c2cf70ac697
health: HEALTH_OK
services:
mon: 4 daemons, quorum ceph4,ceph1,ceph2,ceph3 (age 90m)
mgr: ceph1(active, since 96m), standbys: ceph4, ceph3, ceph2
mds: cephfs:1 {0=ceph1=up:active} 2 up:standby
osd: 12 osds: 12 up (since 115m), 12 in (since 115m)
data:
pools: 3 pools, 320 pgs
objects: 133 objects, 273 MiB
usage: 13 GiB used, 107 GiB / 120 GiB avail
pgs: 320 active+clean
io:
client: 13 KiB/s rd, 15 op/s rd, 0 op/s wr
# k8s集群
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 153m v1.20.0
node1 Ready <none> 152m v1.20.0
node2 Ready <none> 152m v1.20.0
# k8s连接对接外部ceph集群
# 对接存储简介
一共 6 种方式对接ceph存储集群:
- 直接使用ceph的文件系统
- 直接使用ceph的块存储
- 使用社区提供的 cephfs 做持久数据卷
- 使用社区提供的 RBD 做 pod 的持久存储
- 使用 官方 ceph-csi 的 cephfs 方式
- 使用 官方 ceph-csi 的 rbd 方式
这里主要是动态基于 sc 创建 pvc,为 k8s提供动态申请 pv的功能,ceph提供底层存储功能。
1、社区
cephfs 做持久数据卷
RBD 做 pod 的持久存储
2、官方 ceph-csi
cephfs 方式
rbd 方式
k8s可以通过两种方式使用 ceph做 volume: cephfs和 rbd
- 一个 Ceph 集群仅支持一个 CephFS
- cephfs方式支持k8s的pv的3种访问模式
ReadWriteOnce、ReadOnlyMany 、ReadWriteMany
- RBD支持 ReadWriteOnce、ReadOnlyMany 两种模式
注意:访问模式只是能力描述,并不是强制执行的,对于没有按pvc声明的方式使用pv,存储提供者应该负责访问时的运行错误。例如如果设置pvc的访问模式为 ReadOnlyMany ,pod挂载后依然可写,如果需要真正的不可写,申请pvc是需要指定 readOnly: true 参数
k8s使用 volume的方法:
- 直接方式: Volume->backend
- 静态配备: Volume->PersistentVolumeClaim->PersistentVolume->Backend
- 动态配备: Volume->PersistentVolumeClaim->StorageClass->Backend
# rbd的方式
1、所有k8s节点
安装依赖组件,配置yum源安装ceph-common
[root@master ~]# cat /etc/yum.repos.d/ceph.repo
[ceph]
name=ceph
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64/
gpgcheck=0
enabled=1
[root@master ~]# for i in master node1 node2
> do
> scp /etc/yum.repos.d/ceph.repo $i:/etc/yum.repos.d/ceph.repo
> ssh $i "yum install -y ceph-common"
> done
2、查看当前的ceph集群
配置文件
[root@ceph1 my-cluster]# cat /etc/ceph/ceph.conf
[global]
fsid = 1ca010d2-42d2-4ce8-b7da-4c2cf70ac697
public_network = 192.168.0.0/24
cluster_network = 192.168.0.0/24
mon_initial_members = ceph1, ceph2, ceph3, ceph4
mon_host = 192.168.0.130,192.168.0.141,192.168.0.249,192.168.0.47
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
mon_allow_pool_delete = true
mon_max_pg_per_osd = 2000
3、在ceph1的控制节点
上面同步配置文件
将admin的ceph权限以及配置文件分发到k8s集群,发完权限可以在k8s集群上操作ceph集群,也可以在ceph集群中操作,以下是在k8s集群下操作ceph集群
[root@ceph1 ~]# ssh-copy-id master
[root@ceph1 ~]# ssh-copy-id node1
[root@ceph1 ~]# ssh-copy-id node2
[root@ceph1 my-cluster]# ceph-deploy --overwrite-conf admin ceph2 ceph3 ceph4 master node1 node2
4、创建存储池并开启rbd功能
创建kube池给k8s集群使用,在kube池下面创建一个20G的镜像
[root@master ~]# ceph osd pool create kube 128 128
[root@master ~]# rbd create -p kube -s 20G ceph-image
[root@master ~]# rbd info --image kube/ceph-image
rbd image 'ceph-image':
size 20 GiB in 5120 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: ac9857b1b5fd
block_name_prefix: rbd_data.ac9857b1b5fd
format: 2
features: layering, exclusive-lock
op_features:
flags:
create_timestamp: Sat Feb 5 14:48:37 2022
access_timestamp: Sat Feb 5 14:48:37 2022
modify_timestamp: Sat Feb 5 14:48:37 2022
5、创建ceph用户,提供给k8s使用
#查看ceph集群中的认证用户及相关的key
[root@master ~]# ceph auth list
[root@master ~]# ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd_children,allow rwx pool=kube'
6、创建secret资源
base64 单向加密一下,k8s不以明文方式存储账号密码
[root@master ~]# ceph auth get-key client.admin | base64
QVFERUVQNWhQbE96QnhBQWNyUkp1dVdrc2d1N2FJdGZneDltbHc9PQ==
[root@master ~]# ceph auth get-key client.kube | base64
QVFCd0cvNWg2cW9XRHhBQXM0ZkluZEFIMDZnVTdtcG9tTlF3UVE9PQ==
[root@master ~]# mkdir jtpv && cd jtpv
[root@master jtpv]# kubectl create secret generic ceph-admin-secret \
--from-literal=key=QVFERUVQNWhQbE96QnhBQWNyUkp1dVdrc2d1N2FJdGZneDltbHc9PQ== \
--dry-run -o yaml > ceph-adminsecret.yaml
[root@master jtpv]# kubectl create secret generic ceph-kube-secret \
--from-literal=key=QVFCd0cvNWg2cW9XRHhBQXM0ZkluZEFIMDZnVTdtcG9tTlF3UVE9PQ== \
--dry-run -o yaml > ceph-adminsecret.yaml
[root@master jtpv]# kubectl apply -f .
[root@master jtpv]# kubectl get secrets
NAME TYPE DATA AGE
ceph-admin-secret kubernetes.io/rbd 1 106m
ceph-kube-secret kubernetes.io/rbd 1 106m
default-token-2nnk5 kubernetes.io/service-account-token 3 3h3m
secret的两个yaml文件如下:
[root@master jtpv]# cat ceph-admin-secret.yaml
apiVersion: v1
data:
key: QVFERUVQNWhQbE96QnhBQWNyUkp1dVdrc2d1N2FJdGZneDltbHc9PQ==
kind: Secret
metadata:
creationTimestamp: null
name: ceph-admin-secret
[root@master jtpv]# cat ceph-kube-secret.yaml
apiVersion: v1
data:
key: QVFCd0cvNWg2cW9XRHhBQXM0ZkluZEFIMDZnVTdtcG9tTlF3UVE9PQ==
kind: Secret
metadata:
creationTimestamp: null
name: ceph-kube-secret
7、创建PV连接存储池
- PV的名称叫
ceph-pv-test
- 申请的PV是
10Gi
的大小 - 读写模式是
ReadWriteMany
- rbd的mon节点分别是
四个ceph的osd节点
- 存储池使用的是创建的
kube
,镜像使用ceph-image
,用户使用admin
,密钥使用创建好的secret
,文件格式使用ext4
,关闭只读
- pv的策略使用
Retain
[root@master jtpv]# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: ceph-pv-test
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
rbd:
monitors:
- 192.168.0.130:6789
- 192.168.0.141:6789
- 192.168.0.249:67889
- 192.168.0.47:6789
pool: kube
image: ceph-image
user: admin
secretRef:
name: ceph-admin-secret
fsType: ext4
readOnly: false
persistentVolumeReclaimPolicy: Retain
8、创建pvc
- 创建PVC的名称是pvc-test-claim
- 读写模式使用ReadWriteMany
- 一共申请的PV有10G的大小,PVC申请5Gi存储使用
[root@master jtpv]# cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-test-claim
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
查看当前的pv和pvc的状态
[root@master jtpv]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/ceph-pv-test 10Gi RWX Retain Bound default/pvc-test-claim 116m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/pvc-test-claim Terminating ceph-pv-test 10Gi RWX 114m
9、禁用image功能集
以下操作可以在第一个Pod挂载PVC报错里面找到,直接复制执行。
RBD图像功能集不匹配。您可以使用“rbd feature disable kube/ceph image object map fast diff deep flatten”禁用内核不支持的功能。
[root@master jtpv]# rbd feature disable kube/ceph-image object-map fast-diff deep-flatten
10、使用Pod测试PVC
[root@master jtpv]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: ceph-pod
spec:
containers:
- image: busybox:1.24
name: ceph-pod
command: ['sleep','60000']
volumeMounts:
- name: pvc
mountPath: /usr/share/busybox
volumes:
- name: pvc
persistentVolumeClaim:
claimName: pvc-test-claim
[root@master jtpv]# kubectl get pods
NAME READY STATUS RESTARTS AGE
ceph-pod 1/1 Running 0 113m
[root@master jtpv]# kubectl exec -it ceph-pod -- sh
/ # df | grep rbd
/dev/rbd0 20511312 45080 20449848 0% /usr/share/busybox