前言
上篇讲了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
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 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应该就好了,删除时不影响数据即可。嗯就这么搞。