存储的重要意义
存储资源是容器云平台中的一个核心基础设施,为不同的应用服务提供可靠的持久化服务。
大家都知道,容器运行过程中产生的数据是临时数据,并不可靠,一旦容器挂了,这些数据都会丢失。所以对数据可靠性有要求的应用就必须使用存储资源。
存储的方案有很多种,常用的有本地盘存储、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上部署的架构
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主机及目录/盘符,以下列出了三种配置方式,可任意搭配。
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
| 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
1 2 3
| $ oc create -f common.yaml $ oc create -f operator-openshift.yaml $ oc create -f cluster.yaml
|
完成部署好后,在rook-ceph Project下将会创建对应的资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| $ 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| $ 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 Block Pool及storageclass
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
| $ 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将会自动将它加入到集群,实现集群的扩容。
参考文章
Rook官网
Rook 文档OpenShift
Rook文档——Ceph存储
Rook文档-Ceph Block