SUSE CaaS Platform 4 - 使用 Ceph RBD 作为持久存储(动态)
存储类
- 存储类(storage class)是kubernetes资源类型,它是由管理员为管理PV之便而按需创建的类别
- 存储类好处是支持 PV 的动态创建,系统按PVC的需求标准动态创建适配的PV会为存储管理带来极大的灵活性。
- PV的动态供给,其重点是在存储类的定义,其分类大概是对存储的性能进行分类的,如图1:金存储类、银存储类、铜存储类等。
图1 基于综合服务质量的存储系统分类
一、Provisioner(存储分配器)
Storage class 有一个分配器,用来决定使用哪个卷插件分配 PV。图2 中可以看到,目前 Ceph 只有 RBD 接口支持内部分配器。
图2 各存储插件对动态供给方式的支持状况
二、实验环境搭建 - 动态供给
图3 实验环境架构图
环境设置
1、搭建环境
- 操作系统版本: SLES15 SP1,无需安装 swap
- 内核版本:4.12.14-197.18-default
- Kubernetes版本:v1.15.2
- VMware Workstation 14
2、虚拟化环境搭建和系统安装参考:
- SUSE Storage6 环境搭建详细步骤 - Win10 + VMware WorkStation
- SUSE Linux Enterprise 15 SP1 系统安装
- SUSE Ceph 快速部署 - Storage6
- SUSE CaaS Platform 4 - 安装部署
安装部署
1、所有 CaaS Platform 节点安装
# zypper install ceph-common
复制 ceph.conf 到 worker 节点上
# scp admin:/etc/ceph/ceph.conf /etc/ceph/
2、创建池,并将应用名称与存储池关联
# ceph osd pool create caasp4-dynamic
# ceph osd pool application enable caasp4-dynamic rbd
3、创建 CaaSP4 client user
# cd /etc/ceph
# ceph auth get-or-create client.caasp4-dynamic mon 'allow r' \
osd 'allow class-read object_prefix rbd_children, allow rwx pool=caasp4-dynamic' \
-o ceph.client.dynamic.keyring
4、获取 client.admin 用户 key 信息,并生成基于 base64 编码 key
# ceph auth get client.admin
exported keyring for client.admin
[client.admin]
key = AQA9w4VdAAAAABAAHZr5bVwkALYo6aLVryt7YA==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *
# echo AQA9w4VdAAAAABAAHZr5bVwkALYo6aLVryt7YA== | base64
QVFBOXc0VmRBQUFBQUJBQUhacjViVndrQUxZbzZhTFZyeXQ3WUE9PQo=
5、在Master节点上,为 client.admin,创建 secret 资源
# vim ceph-secret-admin.yaml
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret-admin
namespace: kube-system
data:
key: QVFBOXc0VmRBQUFBQUJBQUhacjViVndrQUxZbzZhTFZyeXQ3WUE9PQo=
type: kubernetes.io/rbd
# kubectl get secrets -n kube-system
NAME TYPE DATA AGE
....
ceph-secret-admin kubernetes.io/rbd 24s
....
6、获取 client.caasp4-dynamic 用户 key 信息,并生成基于 base64编码的key
# ceph auth get client.caasp4-dynamic
exported keyring for client.caasp4-dynamic
[client.caasp4-dynamic]
key = AQA29ppdTDmzHhAAET2mSbvovrS67kspPlqmLA==
caps mon = "allow r"
caps osd = "allow class-read object_prefix rbd_children, allow rwx pool=caasp4-dynamic"
# echo AQA29ppdTDmzHhAAET2mSbvovrS67kspPlqmLA== | base64
QVFBMjlwcGRURG16SGhBQUVUMm1TYnZvdnJTNjdrc3BQbHFtTEE9PQo=
7、在Master节点上,为 client.caasp4-dynamic 创建 secret
# vim ceph-secret-user.yaml
apiVersion: v1
kind: Secret
metadata:
name: ceph-user-secret
namespace: default
data:
key: QVFBMjlwcGRURG16SGhBQUVUMm1TYnZvdnJTNjdrc3BQbHFtTEE9PQo=
type: kubernetes.io/rbd
# kubectl create -f ceph-secret-user.yaml
secret "ceph-user-secret" created
# kubectl get secrets
NAME TYPE DATA AGE
ceph-secret-test Opaque 20h
ceph-user-secret kubernetes.io/rbd 4s
default-token-4hslq kubernetes.io/service-account-token 24h
8、创建 storage class 存储类
# vim ceph-storageclass.yaml
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: dynamic
annotations:
storageclass.beta.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/rbd
parameters:
monitors: 192.168.2.40:,192.168.2.41:,192.168.2.42:
adminId: admin
adminSecretName: ceph-secret-admin
adminSecretNamespace: kube-system
pool: caasp4-dynamic
userId: caasp4-dynamic
userSecretName: ceph-user-secret
# kubectl create -f ceph-storageclass.yaml
storageclass "dynamic" created
# kubectl get storageclasses
NAME PROVISIONER AGE
dynamic (default) kubernetes.io/rbd 10m
StorageClass SPEC
(1)provisioner(供给方):即提供存储资源的存储系统,供给方名字都以“kubernetes.io”为前缀
(2)parameters(参数):使用参数描述要关联到的存储卷,不同的provisioner有不同的参数
9、创建 PVC
# vim ceph-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: ceph-claim-dynamic
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
# kubectl create -f ceph-pvc.yaml
persistentvolumeclaim "ceph-claim-dynamic" created
# kubectl get pvc -o wide
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
ceph-claim-dynamic Bound pvc-70b3b3ca---a898-c1f5524de008 3Gi RWO dynamic 10m Filesystem
10、创建 Pod
vim ceph-pod-dynamic.yaml
apiVersion: v1
kind: Pod
metadata:
name: ceph-pod1-dynamic
spec:
containers:
- name: ceph-busybox
image: busybox
command: ["sleep", ""]
volumeMounts:
- name: ceph-vol1-dynamic
mountPath: /usr/share/busybox
readOnly: false
volumes:
- name: ceph-vol1-dynamic
persistentVolumeClaim:
claimName: ceph-claim-dynamic
# kubectl create -f ceph-pod-dynamic.yaml
pod "ceph-pod1-dynamic" created # kubectl get pods
NAME READY STATUS RESTARTS AGE
ceph-pod1-dynamic / Running 24m # kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ceph-pod1-dynamic / Running 48m 10.244.2.194 worker02 <none> <none>
# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-70b3b3ca-5267-4417-a898-c1f5524de008 3Gi RWO Delete Bound default/ceph-claim-dynamic dynamic 169m
11、storage6 分布式存储上,查看是否创建了镜像
admin:/etc/ceph # rbd ls -p caasp4-dynamic
kubernetes-dynamic-pvc-e6d98bbf-50e1--a9fc-867d1db810c8
admin:/etc/ceph # rbd info kubernetes-dynamic-pvc-e6d98bbf-50e1--a9fc-867d1db810c8 -p caasp4-dynamic
rbd image 'kubernetes-dynamic-pvc-e6d98bbf-50e1-4488-a9fc-867d1db810c8':
size GiB in objects
order ( MiB objects)
snapshot_count:
id: cd53f75a03b15
block_name_prefix: rbd_data.cd53f75a03b15
format:
features:
op_features:
flags:
create_timestamp: Mon Oct ::
access_timestamp: Mon Oct ::
modify_timestamp: Mon Oct ::
12、worker02节点上,查看RBD映射
# rbd showmapped
id pool namespace image snap device
0 caasp4-dynamic kubernetes-dynamic-pvc-e6d98bbf-50e1-4488-a9fc-867d1db810c8 - /dev/rbd0
# df -h | grep dev/rbd0
/dev/rbd0 2.9G 9.0M 2.9G 1% /var/lib/kubelet/pods/e7c75785-4533-4fac-b4ab-368c75e16421/volumes/kubernetes.io~rbd/pvc-70b3b3ca-5267-4417-a898-c1f5524de008
排错
1、搭建的时候,发现创建PVC的时候 pending 状态。
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
ceph-claim-dynamic Pending dynamic 44s
2、通过 event 事件查看,由于忘记创建 admin secret 导致,重新创建 admin secret 即可。
# kubectl get events
LAST SEEN TYPE REASON OBJECT MESSAGE
60s Warning ProvisioningFailed persistentvolumeclaim/ceph-claim-dynamic Failed to provision volume with StorageClass "dynamic": failed to get admin secret from ["kube-system"/"ceph-secret-admin"]: failed to get secret from ["kube-system"/"ceph-secret-admin"]: secrets "ceph-secret-admin" not found
35s Warning FailedScheduling pod/ceph-pod1-dynamic pod has unbound immediate PersistentVolumeClaims (repeated 2 times)
SUSE CaaS Platform 4 - 使用 Ceph RBD 作为持久存储(动态)的更多相关文章
- SUSE CaaS Platform 4 - 使用 Ceph RBD 作为持久存储 (静态)
1.所有节点安装 # zypper -n in ceph-common 复制 ceph.conf 到 worker 节点上 # scp admin:/etc/ceph/ceph.conf /etc/c ...
- SUSE CaaS Platform 4 - Ceph RBD 作为 Pod 存储卷
RBD存储卷 目前 CaaSP4 支持多种 Volume 类型,这里选择 Ceph RBD(Rados Block Device),主要有如下好处: Ceph 经过多年开发,已经非常熟,社区也很活跃: ...
- SUSE CaaS Platform 4 - 安装部署
SUSE CaaS Platform 相关文章 (1)SUSE CaaS Platform 4 - 简介 (2)SUSE CaaS Platform 4 - 安装部署 (3)SUSE CaaS Pla ...
- SUSE CaaS Platform 4 - 简介
SUSE CaaS Platform KUBERNETES - 面向企业 SUSE CaaS Platform 是一款企业级容器管理解决方案,可让 IT 和 DevOps 专业人士更轻松地部署.管理和 ...
- SUSE CaaS Platform 4 - 使用 NFS 作为持久存储
SUSE CaaS Platform 4 - 持久存储使用 NFS
- SUSE CaaS Platform 4 - 安装技巧
1.虚拟化环境搭建 - 网络 首先,虚拟机其中一块网卡桥接到 VMnet8 上,通过 VMnet8 地址转换出去访问互联网,如果我们直接桥接到 WIFI 网卡上,由于在不同的的网络环境,地址会时长会 ...
- SUSE Ceph RBD Mirror - Storage 6
Ceph采用的是强一致性同步模型,所有副本都必须完成写操作才算一次写入成功,这就导致不能很好地支持跨域部署,因为如果副本在异地,网络延迟就会很大,拖垮整个集群的写性能.因此,Ceph集群很少有跨域部署 ...
- 理解 QEMU/KVM 和 Ceph(1):QEMU-KVM 和 Ceph RBD 的 缓存机制总结
本系列文章会总结 QEMU/KVM 和 Ceph 之间的整合: (1)QEMU-KVM 和 Ceph RBD 的 缓存机制总结 (2)QEMU 的 RBD 块驱动(block driver) (3)存 ...
- 理解 OpenStack + Ceph (3):Ceph RBD 接口和工具 [Ceph RBD API and Tools]
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...
随机推荐
- SpringBoot 2 快速整合 | 统一异常处理
统一异常处理相关注解介绍 @ControllerAdvice 声明在类上用于指定该类为控制增强器类,如果想声明返回的结果为 RESTFull 风格的数据,需要在声明 @ExceptionHandler ...
- CodeForces 464 B Restore Cube
Restore Cube 题解: x->yyy 其实就是把x代替成yyy这个值. 如果不好理解的话, 可以试想一下, 刚开始的话 0->0, 1->1, 2->2,...,9- ...
- codeforces E. Trains and Statistic(线段树+dp)
题目链接:http://codeforces.com/contest/675/problem/E 题意:你可以从第 i 个车站到 [i + 1, a[i]] 之间的车站花一张票.p[i][j]表示从 ...
- CSS3 03. 3D变换、坐标系、透视perspective、transformZ、transform-style添加3D效果、backface-visibility元素背面可见、动画animation、@keyfarmes、多列布局
1.左手坐标系 伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上,中指指向前方.这样我们就建立了一个左手坐标系,拇指.食指和中指分别代表X.Y.Z轴的正方向.如下图 CSS中的3D坐标系 CSS ...
- java中多线程执行时,为何调用的是start()方法而不是run()方法
Thead类中start()方法和run()方法的区别 1,start()用来启动一个线程,当调用start()方法时,系统才会开启一个线程,通过Thead类中start()方法来启动的线程处于就绪状 ...
- lambda表达式排序
lambda表达式排序简洁 1.给一个字符串数组: String[] atp = {"2016-06-28 08:00:00", "2017-12-05 19:17:32 ...
- MySQL的安装与配置——详细教程
免安装版的Mysql MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用的 标准化语言,其特点为体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,在 Web 应 ...
- C#中using的使用-以FileStream写入文件为例
场景 CS中FileStream的对比以及使用方法: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100396022 关注公众号 ...
- apache ignite系列(六): 服务网格
简介 服务网格本质上还是远程方法调用(RPC),而在ignite中注册的服务本质体现还是以cache的形式存在,集群中的节点可以相互调用部署在其它节点上的服务,而且ignite集群会负责部署服务的 ...
- Dagger2 探索记1——四大基本组件(一)
喝很多自主学习的人,我接触Dagger 2 框架的原因是刚进公司的时候导师给安排的学习任务,学习方式是组内培训. 听到这个消息的我,以为是部门的人轮流给我讲课. 后来导师跟我说,组内培训的意思是,我先 ...