存储类

  • 存储类(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、虚拟化环境搭建和系统安装参考:

安装部署

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有不同的参数

kubernetes 官方参数说明

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 作为持久存储(动态)的更多相关文章

  1. SUSE CaaS Platform 4 - 使用 Ceph RBD 作为持久存储 (静态)

    1.所有节点安装 # zypper -n in ceph-common 复制 ceph.conf 到 worker 节点上 # scp admin:/etc/ceph/ceph.conf /etc/c ...

  2. SUSE CaaS Platform 4 - Ceph RBD 作为 Pod 存储卷

    RBD存储卷 目前 CaaSP4 支持多种 Volume 类型,这里选择 Ceph RBD(Rados Block Device),主要有如下好处: Ceph 经过多年开发,已经非常熟,社区也很活跃: ...

  3. SUSE CaaS Platform 4 - 安装部署

    SUSE CaaS Platform 相关文章 (1)SUSE CaaS Platform 4 - 简介 (2)SUSE CaaS Platform 4 - 安装部署 (3)SUSE CaaS Pla ...

  4. SUSE CaaS Platform 4 - 简介

    SUSE CaaS Platform KUBERNETES - 面向企业 SUSE CaaS Platform 是一款企业级容器管理解决方案,可让 IT 和 DevOps 专业人士更轻松地部署.管理和 ...

  5. SUSE CaaS Platform 4 - 使用 NFS 作为持久存储

    SUSE CaaS Platform 4 - 持久存储使用 NFS

  6. SUSE CaaS Platform 4 - 安装技巧

    1.虚拟化环境搭建 -  网络 首先,虚拟机其中一块网卡桥接到 VMnet8 上,通过 VMnet8 地址转换出去访问互联网,如果我们直接桥接到 WIFI 网卡上,由于在不同的的网络环境,地址会时长会 ...

  7. SUSE Ceph RBD Mirror - Storage 6

    Ceph采用的是强一致性同步模型,所有副本都必须完成写操作才算一次写入成功,这就导致不能很好地支持跨域部署,因为如果副本在异地,网络延迟就会很大,拖垮整个集群的写性能.因此,Ceph集群很少有跨域部署 ...

  8. 理解 QEMU/KVM 和 Ceph(1):QEMU-KVM 和 Ceph RBD 的 缓存机制总结

    本系列文章会总结 QEMU/KVM 和 Ceph 之间的整合: (1)QEMU-KVM 和 Ceph RBD 的 缓存机制总结 (2)QEMU 的 RBD 块驱动(block driver) (3)存 ...

  9. 理解 OpenStack + Ceph (3):Ceph RBD 接口和工具 [Ceph RBD API and Tools]

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

随机推荐

  1. Oralce 触发器

    今天做了一个需要用到触发器实现的功能中间去到了各种问题,还好最后都解决了: 整个过程中真是遇到了不少错误: ORA-04091: 表 KPGO.T_ISSUER 发生了变化, 触发器/函数不能读它 O ...

  2. net start mysql提示:服务名无效

    1.win+R打开运行窗口,输入services.msc 2.在其中查看mysql的服务名,我的是MySQL55 3.以管理员身份打开cmd,输入net start MySQL55 出现下图,代表my ...

  3. 1 PY环境与变量

    一 环境与文件形式 1.环境搭建http://jingyan.baidu.com/article/eae07827f7f2d01fec5485f7.html 2. python 则进入交互模式  ex ...

  4. Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.apache.catalina.connector.CoyoteWriter and no properties discovered to create BeanSerializer

    一.什么是序列化In computer science, in the context of data storage, serialization is the process of transla ...

  5. 【3】Decision tree(决策树)

    前言 Decision tree is one of the most popular classification tools 它用一个训练数据集学到一个映射,该映射以未知类别的新实例作为输入,输出 ...

  6. 【Offer】[26] 【树的子结构】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入两棵二叉树A和B,判断B是不是A的子结构.图中右边的树是左边的子结构  思路分析 先对树A进行遍历,找到与树B的根结点值相同的节点 ...

  7. Django框架下的增强分页组件

    本文通过文章同步功能推送至博客园,显示排版可能会有所错误,请见谅! 描述:Django框架内置了分页功能,但其只能满足简单需求,难以实现复杂功能. 实现代码: #!/usr/bin/env pytho ...

  8. 使用ECMAScript 6 模块封装代码

    JavaScript 用"共享一切"的方法加载代码,这是该语言中最容易出错且最容易让人感到困惑的地方.其他语言使用诸如包这样的概念来定义代码作用域,但在 ECMAScript 6 ...

  9. Airflow: TypeError can't pickle memoryview objects

    apache-airflow1.9.0 + python3 + rabbitmq + librabbitmq2.0.0 相关配置如下: broker_url = amqp://cord:123456@ ...

  10. jar包部署到window系统服务器的办法

    1:把jar包和lib(如果打包出现有lib目录)放在同级目录 2:windows服务器安装jdk等 3:通过bat批处理命令或者 cmd命令启动jar包,其中之一就可以 3.1:bat命令如下: @ ...