目的
ceph 作为独立的后端存储
利用 kubernets 连接该 ceph 存储
ceph 自行独立管理
kubernets 只需要获取连接 ceph 的 mon 地址, 只需要具备连接到该 ceph 的用户权限即可
优点
ceph 维护, 管理比较灵活
多个 kubernets 可以连接到相同的一个 ceph 集群中
概念
PV
persistentvolume(pv) 集群中由管理员提供的一块存储。PV 跟节点一样,是群集中的资源
pv 和 volumes 一样是 volume 插件,但其生命周期独立于使用 pv 的任何单个pod
此 API 对象捕获存储实现的详细信息,包括NFS、iSCSI或特定于云提供程序的存储系统
volume plugin | ReadWriteOnce | ReadOnlyMany | ReadWriteMany |
---|---|---|---|
CephFS | ✓ | ✓ | ✓ |
Cinder | ✓ | - | - |
Glusterfs | ✓ | ✓ | ✓ |
iSCSI | ✓ | ✓ | - |
NFS | ✓ | ✓ | ✓ |
RBD | ✓ | ✓ | - |
PVC
PersistentVolumeClaim(PVC)是用户对存储的请求
它类似于一个 pod, pods 消耗节点资源
pvc消耗pv资源
POD 可以请求特定级别的资源(CPU和内存)
POD 声明可以请求特定的 pvc 大小和访问模式(例如,可以装载一次读/写或多次只读)
读写模式
ReadWriteOnce – 卷可以由单个节点以读写方式挂载
ReadOnlyMany – 卷可以由多个节点以只读方式挂载
ReadWriteMany – 卷可以由多个节点以读写方式挂载
ceph 授权
准备 ceph 池
[root@ns-ceph-208183 ceph]# ceph osd pool create kubernets 256 256
pool 'kubernets' created
初始化 ceph 池
[root@ns-ceph-208183 ceph]# ceph osd pool application enable kubernets rbd
enabled application 'rbd' on pool 'kubernets'
[root@ns-ceph-208183 ceph]# rbd pool init kubernets
用户授权
[root@ns-ceph-208183 ceph]# ceph auth add client.terry mon 'allow r' osd 'allow rwx pool=kubernets'
导出用户信息
[root@ns-ceph-208183 ceph]# ceph auth get client.terry -o /etc/ceph/ceph.client.terry.keyring
exported keyring for client.terry
kubernets
软件包
所有节点都需要安装
yum install -y ceph-common
创建 namespace
[root@ns-yun-020065 ceph-storage]# cat ceph-namespace-ceph.yaml
apiVersion: v1
kind: Namespace
metadata:
name: ceph
[root@ns-yun-020065 ceph-storage]# kubectl apply -f ceph-namespace-ceph.yaml
创建用户授权
[root@ns-ceph-208183 ceph]# grep key /etc/ceph/ceph.client.terry.keyring |awk '{printf "%s", $NF}'|base64
QVFCaEI0SmNPZ3laREJBQXZxZHlMQ3RmbUFQd1JPWklaN1NCNVE9PQ==
[root@ns-yun-020065 ceph-storage]# cat ceph-terry-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: ceph-terry-secret
namespace: ceph
type: "kubernetes.io/rbd"
data:
key: QVFCaEI0SmNPZ3laREJBQXZxZHlMQ3RmbUFQd1JPWklaN1NCNVE9PQ==
[root@ns-yun-020065 ceph-storage]# kubectl apply -f ceph-terry-secret.yaml
查询授权
[root@ns-yun-020065 ceph-storage]# kubectl -n ceph get secret
NAME TYPE DATA AGE
ceph-terry-secret kubernetes.io/rbd 1 3d
default-token-hg6sl kubernetes.io/service-account-token 3 2h
创建 storageclass
[root@ns-yun-020065 ceph-storage]# cat ceph-volume-kubernets.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: "ceph-kubernets"
namespace: ceph
provisioner: kubernetes.io/rbd
parameters:
monitors: 10.189.208.183:6789,10.189.208.197:6789,10.189.208.192:6789
adminId: terry
adminSecretName: ceph-terry-secret
adminSecretNamespace: ceph
pool: kubernets
userId: terry
userSecretName: ceph-terry-secret
userSecretNamespace: ceph
fsType: xfs
imageFormat: "2"
imageFeatures: "layering"
reclaimPolicy: Delete
[root@ns-yun-020065 ceph-storage]# kubectl apply -f ceph-volume-kubernets.yaml
策略 (reclaimPolicy) 说明
常见策略三种:
Delete (默认) 删除 pvc 同时会删除 rbd 池中对应的 rbd 文件
Retain 删除 pvc 时并不会删除 rbd 池中对应 rbd 文件, 需要手动执行删除操作
Recycle (新版本已经弃用, 推荐使用 动态支持)删除 pod 时候,会自动清空 pvc 中的内容, 可以再次被其他 pod 调用(需要插件支持)
查询当前 storageclass
[root@ns-yun-020065 ceph-storage]# kubectl -n ceph get storageclass
NAME PROVISIONER AGE
ceph-kubernets kubernetes.io/rbd 3m
创建 PersistentVolumeClaim
[root@ns-yun-020065 ceph-storage]# cat create-volume-ceph.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: webdata
namespace: ceph
spec:
accessModes:
- ReadWriteOnce
storageClassName: ceph-kubernets
resources:
requests:
storage: 5Gi
[root@ns-yun-020065 ceph-storage]# kubectl apply -f create-volume-ceph.yaml
检测状态
[root@ns-yun-020065 ceph-storage]# kubectl -n ceph get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-190e4683-43c9-11e9-a778-ec388f792726 5Gi RWO Delete Bound ceph/webdata ceph-kubernets 12m
[root@ns-yun-020065 ceph-storage]# kubectl -n ceph get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
webdata Bound pvc-190e4683-43c9-11e9-a778-ec388f792726 5Gi RWO ceph-kubernets 12m
状态说明
Available – 资源尚未被 claim 使用
Bound – 卷已经被绑定到 claim
Released – claim 被删除,卷处于释放状态,但未被集群回收
Failed – 卷自动回收失败
ceph rbd 池中 rbd 文件对应如下
[root@ns-yun-020065 ceph-storage]# kubectl -n ceph get PersistentVolumeClaim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
webdata Bound pvc-190e4683-43c9-11e9-a778-ec388f792726 5Gi RWO ceph-kubernets 56m
[root@ns-yun-020065 ceph-storage]# rbd --user terry -p kubernets ls
kubernetes-dynamic-pvc-190fc9b6-43c9-11e9-b23f-ec388f792726
挂载 pvc 到 pod 方法
[root@ns-yun-020065 ceph-storage]# cat centos-test01.yaml
kind: Pod
apiVersion: v1
metadata:
name: centos7-test01
namespace: ceph
spec:
containers:
- name: cenotos7-test01
image: registry.aliyuncs.com/google_containers/centos7:7.5.1804
command:
- "sleep"
- "30000000"
volumeMounts:
- name: ceph-vol
mountPath: /media
readOnly: false
volumes:
- name: ceph-vol
persistentVolumeClaim:
claimName: webdata
nodeSelector:
node: kube-node
挂载说明
PVC 对应到 rbd 池中文件 kubernetes-dynamic-pvc-190fc9b6-43c9-11e9-b23f-ec388f792726
rbd 文件将会被 map 到物理机, 并命名为 /dev/rbd0 (第一个,第二个则为 rbd1 如此类推 )
物理机会把 /dev/rbd0 挂载到对应 pod 中
pod 会自动把 /dev/rbd0 挂载到 /media 目录中
pod 已经可以直接对 /media 挂载目录进行访问, 无需管理 /etc/fstab 文件
删除 pod
pod 删除后, 物理机 /dev/rbd0 自动 unmap
ceph rbd 池中文件 仍然存在
删除 pvc
当执行 kubectl delete -f create-volume-ceph.yaml 后
针对 delete 策略kubectl -n ceph get pvc 发现 pvc 文件已经被删除
ceph rbd 池中对应的 rbd 文件也会自动被删除针对 Retain 策略
kubectl -n ceph get pvc 发现 pvc 文件仍然存在, 需要手动执行 kubectl -n ceph delete pvc xxxx 进行删除
ceph rbd 池中对应 rbd 文件依旧存在, 就算执行 kubectl -n ceph delete pvc xxx 操作也不会自动删除
ceph rbd 池中对应 rbd 文件必须手动通过 rbd -p kubenetes remove xxxx 执行删除操作