Zer0e's Blog

【架构之路4】k8s对接ceph-rbd

字数统计: 839阅读时长: 3 min
2024/07/12 Share

前言

上篇讲了cephfs对接k8s集群,体验不是很好,这篇接着体验ceph-rbd。

正文

安装rbd驱动

很简单,接着使用helm安装即可。

1
2
kubectl create namespace "ceph-csi-rbd"
helm install --namespace "ceph-csi-rbd" "ceph-csi-rbd" ceph-csi/ceph-csi-rbd

ceph pool secret创建

1
2
3
ceph osd pool create k8s_rbd 128 128
// 记得初始化
rbd pool init k8s_rbd

创建名为k8s的用户

1
2
ceph auth get-or-create client.k8s mon 'profile rbd' osd 'profile rbd pool=k8s_rbd'
// AQAx4JBm6BItDBAAQue62g4QOmdDD27/PFZmQQ==

修改k8s集群的rbd驱动配置文件

老样子,安装rbd驱动后,ceph-csi-rbd命名空间下会有ceph-csi-config的configMap,修改它。

这里我直接通过kubepi网页直接修改了,很方便,修改它的config.json,把下面的东西粘贴进去。

1
2
3
4
5
6
7
8
9
10
[
{
"clusterID": "ed91a6b4-3df6-11ef-9d94-000c29a7737d",
"monitors": [
"192.168.28.138:6789",
"192.168.28.139:6789",
"192.168.28.140:6789"
]
}
]

增加secret.yaml

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
userID: k8s
userKey: AQAx4JBm6BItDBAAQue62g4QOmdDD27/PFZmQQ==
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: ed91a6b4-3df6-11ef-9d94-000c29a7737d

pool: k8s_rbd

imageFeatures: "layering"

csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi-rbd
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi-rbd
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi-rbd

csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true

# If filesystem is xfs, nouuid will be automatically added to mountOptions
mountOptions:
- discard

创建pvc绑定容器

先创建pvc,vim ceph-rbd-pvc.yaml

1
2
3
4
5
6
7
8
9
10
11
12
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc

kubectl get pvc可以看到是Bound的状态。

绑定个容器试试,老熟人nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: mypvc
mountPath: /usr/share/nginx/html
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: csi-rbd-pvc
readOnly: false
---

apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx-pod
type: NodePort # service类型
ports:
- port: 80
targetPort: 80

试了下也是正常绑定了。

是否解决了cephfs的问题

先看看重新绑定好使不。

老套路,进容器往/usr/share/nginx/html/index.html写点东西。然后nginx删掉重新部署看看。

1
Multi-Attach error for volume "pvc-eb833c50-0acf-4b36-8b4e-b9e262f42406" Volume is already used by pod(s) nginx-deployment-697596746b-z9zwp

报了个错,但是问题不大,因为不支持ReadWriteMany,所以绑定有问题,稍等片刻等前一个容器停止后,重新访问容器发现文件都还在。

然后是自动释放.先把nginx停掉.然后删除pvc.

1
kubectl delete -f /ceph-pvc.yaml

可以看到pv也自动删除了,非常好。

扩容缩容也没啥问题。完美。

总结

rbd使用上相比fs果然好使,不知道是不是因为我把所有无关的pool都删除的原因,现在创建,绑定删除都没有任何问题。

至此ceph与k8s的对接就告一段落了。

后续应该是按照这个思路接着写我的部署系统了。但是有一点没想好就是volume应该在一个命名空间下去管理,还是说分散到各个应用中呢?PV属于集群级别,PVC有命名空间,那么volume数据存放到应用的命名空间就行了,只要把回收策略从Delete改为Retain应该就好了,删除时不影响数据即可。嗯就这么搞。

原文作者:Zer0e

原文链接:https://re0.top/2024/07/12/devops4/

发表日期:July 12th 2024, 9:30:00 pm

更新日期:July 12th 2024, 8:06:35 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 安装rbd驱动
    2. 2.2. ceph pool secret创建
    3. 2.3. 修改k8s集群的rbd驱动配置文件
    4. 2.4. 创建pvc绑定容器
    5. 2.5. 是否解决了cephfs的问题
  3. 3. 总结