OpenShift存储管理方案——Rook
存储的重要意义
存储资源是容器云平台中的一个核心基础设施,为不同的应用服务提供可靠的持久化服务。
大家都知道,容器运行过程中产生的数据是临时数据,并不可靠,一旦容器挂了,这些数据都会丢失。所以对数据可靠性有要求的应用就必须使用存储资源。
存储的方案有很多种,常用的有本地盘存储、NFS、Ceph、Gluster FS等等。其中Ceph是一个开源的分布式文件系统,同时支持对象存储、块存储、文件存储,为云计算平台提供了最全面的存储方案。它以可靠、高性能等特性得到了很多企业的认可,并使用它来作为生产环境的存储。
但是运维Ceph存储集群是一件较复杂工作,通过Rook项目,我们可以非常方便简单地实施Ceph存储方案,并且已有企业使用Rook来运维生产级别的存储方案。
Rook:CNCF云原生存储项目
Rook于2018年1月加入了CNCF,成为了CNCF第15个项目,同时它也是CNCF首个云原生存储项目。Rook并不是自己开发一套存储方案,而是将现有的分布式存储系统云原生化,让它们能够实现自我管理,自我扩展,自我修复。 它使存储管理员的任务自动化:部署,引导,配置,配置,扩展,升级,迁移,灾难恢复,监视和资源管理。大大降低了存储系统的运维门槛,大大减少了维护成本。
Rook支持多种存储系统服务
- Ceph(v1)
- EdgeFS(v1)
- Minio(Alpha)
- CockroachDB(Alpha)
- Cassandra(Alpha)
- NFS(Alpha)
- Yugabyte DB(Alpha)
Rook的特性
- 简单可靠的自动化资源管理
- 超大规模或超融合存储集群
- 高效地分发和复制数据以最大程度地减少损失
- 通过多个存储提供程序配置,文件,阻止和对象
- 管理开源存储技术
- 轻松地在数据中心中启用弹性存储
- 根据Apache 2.0许可发布的开源软件
- 优化商品硬件上的工作负载
以下是Rook在Kubernetes上部署的架构
Rook与K8S
OpenShift 容器平台部署Rook
OpenShift是红帽开发的K8S的企业级方案,它为原生K8S增加了许多安全及其他特性,特别是约束了运行中的Pod的权限。在部署与使用Rook时,需要允许应用拥有这些权限。
- 下载部署需要的代码
代码所在地址:https://github.com/rook/rook/blob/release-1.1/cluster/examples/kubernetes/ceph
- common.yaml:创建Namespace、CRD、Role、RoleBinding、ClusterRole、ClusterRoleBinding、PodSecurityPolicy、ServiceAccount
- operator-openshift.yaml: 创建SCC以及完成Rook Operator部署
- cluster.yaml:创建CephCluster
- object-openshift.yaml: 使用rgw创建对象存储,并设置对象存储服务对外的端口
- 修改operator-openshift.yaml文件
- 将ROOK_ENABLE_FLEX_DRIVER设置为true
- 将FLEXVOLUME_DIR_PATH值设置为/usr/libexec/kubernetes/kubelet-plugins/volume/exec
- 修改cluster.yaml指定OSD主机及目录/盘符,以下列出了三种配置方式,可任意搭配。
storage:
useAllNodes: false
useAllDevices: false
topologyAware: true
deviceFilter:
location:
config:
nodes:
- name: "172.17.4.101"
directories:
- path: "/rook/storage-dir"
resources:
limits:
cpu: "500m"
memory: "1024Mi"
requests:
cpu: "500m"
memory: "1024Mi"
- name: "172.17.4.201"
devices:
- name: "sdb"
- name: "nvme01"
config:
osdsPerDevice: "5"
config:
storeType: filestore
- name: "172.17.4.301"
deviceFilter: "^sd."
- 部署安装rook
$ oc create -f common.yaml
$ oc create -f operator-openshift.yaml
$ oc create -f cluster.yaml
完成部署好后,在rook-ceph Project下将会创建对应的资源
$ oc get all -n rook-ceph
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/rook-ceph-mgr ClusterIP 172.30.21.61 <none> 9283/TCP 17h
service/rook-ceph-mgr-dashboard ClusterIP 172.30.243.194 <none> 8443/TCP 17h
service/rook-ceph-mon-a ClusterIP 172.30.61.7 <none> 6789/TCP,3300/TCP 17h
service/rook-ceph-mon-b ClusterIP 172.30.22.104 <none> 6789/TCP,3300/TCP 17h
service/rook-ceph-mon-c ClusterIP 172.30.29.27 <none> 6789/TCP,3300/TCP 17h
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/rook-ceph-agent 9 6 6 6 6 <none> 14h
daemonset.apps/rook-discover 9 6 6 6 6 <none> 14h
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/rook-ceph-mgr-a 1 1 1 1 17h
deployment.apps/rook-ceph-mon-a 1 1 1 1 17h
deployment.apps/rook-ceph-mon-b 1 1 1 1 17h
deployment.apps/rook-ceph-mon-c 1 1 1 1 17h
deployment.apps/rook-ceph-operator 1 1 1 1 1d
deployment.apps/rook-ceph-osd-0 1 1 1 1 17h
deployment.apps/rook-ceph-osd-1 1 1 1 1 15h
- 为Ceph Dashboard创建Route
$ cat <<EOF | oc create -f -
apiVersion: route.openshift.io/v1
kind: Route
metadata:
labels:
app: rook-ceph-mgr
rook_cluster: rook-ceph
name: rook-ceph-mgr-dashboard
namespace: rook-ceph
spec:
host: dashboard-rook.apps.example.com
port:
targetPort: https-dashboard
tls:
termination: passthrough
to:
kind: Service
name: rook-ceph-mgr-dashboard
weight: 100
wildcardPolicy: None
EOF
$ oc get route
NAME HOST/PORT SERVICES PORT TERMINATION
rook-ceph-mgr-dashboard dashboard-rook.apps.ceshi.fenhang.com rook-ceph-mgr-dashboard https-dashboard passthrough
此时便可通过浏览器访问Ceph Dashboard页面,查看Ceph集群状态
ceph-dashboard
- 创建Ceph Block Pool及storageclass
$ cat <<EOF | oc create -f -
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
name: replicapool
namespace: rook-ceph
spec:
failureDomain: host
replicated:
size: 3
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-ceph-block
provisioner: ceph.rook.io/block
parameters:
blockPool: replicapool
# 设置为rook cluster operator所在的namespace
clusterNamespace: rook-ceph
# 文件系统,默认是ext4
fstype: xfs
# reclaimPolicy,默认是"Delete",可以设置为"Retain","Recycle"
reclaimPolicy: Retain
# Kubernetes 1.14+支持Resize功能,只支持ext3, ext4, xfs类型
allowVolumeExpansion: true
EOF
至此完成了通过Rook部署Ceph集群,并创建了相应的StorageClass,该StorageClass便可以为应用提供使用。
如果需要对Ceph集群扩容,只需要更新CephCluster的配置,在storage
项中添加新加入的目录或磁盘(生产上建议不要使用目录),Rook Operator将会自动将它加入到集群,实现集群的扩容。