存儲的重要意義
存儲資源是容器云平臺中的一個核心基礎設施,為不同的應用服務提供可靠的持久化服務通熄。
大家都知道耙旦,容器運行過程中產生的數(shù)據(jù)是臨時數(shù)據(jù)脱羡,并不可靠,一旦容器掛了免都,這些數(shù)據(jù)都會丟失锉罐。所以對數(shù)據(jù)可靠性有要求的應用就必須使用存儲資源。
存儲的方案有很多種绕娘,常用的有本地盤存儲脓规、NFS、Ceph险领、Gluster FS等等侨舆。其中Ceph是一個開源的分布式文件系統(tǒng),同時支持對象存儲绢陌、塊存儲态罪、文件存儲,為云計算平臺提供了最全面的存儲方案。它以可靠下面、高性能等特性得到了很多企業(yè)的認可复颈,并使用它來作為生產環(huán)境的存儲。
但是運維Ceph存儲集群是一件較復雜工作沥割,通過Rook項目耗啦,我們可以非常方便簡單地實施Ceph存儲方案,并且已有企業(yè)使用Rook來運維生產級別的存儲方案机杜。
Rook:CNCF云原生存儲項目
Rook于2018年1月加入了CNCF帜讲,成為了CNCF第15個項目,同時它也是CNCF首個云原生存儲項目椒拗。Rook并不是自己開發(fā)一套存儲方案似将,而是將現(xiàn)有的分布式存儲系統(tǒng)云原生化获黔,讓它們能夠實現(xiàn)自我管理,自我擴展在验,自我修復玷氏。 它使存儲管理員的任務自動化:部署,引導腋舌,配置盏触,配置,擴展块饺,升級赞辩,遷移,災難恢復授艰,監(jiān)視和資源管理辨嗽。大大降低了存儲系統(tǒng)的運維門檻,大大減少了維護成本淮腾。
Rook支持多種存儲系統(tǒng)服務
- Ceph(v1)
- EdgeFS(v1)
- Minio(Alpha)
- CockroachDB(Alpha)
- Cassandra(Alpha)
- NFS(Alpha)
- Yugabyte DB(Alpha)
Rook的特性
- 簡單可靠的自動化資源管理
- 超大規(guī)脑阈瑁或超融合存儲集群
- 高效地分發(fā)和復制數(shù)據(jù)以最大程度地減少損失
- 通過多個存儲提供程序配置,文件来破,阻止和對象
- 管理開源存儲技術
- 輕松地在數(shù)據(jù)中心中啟用彈性存儲
- 根據(jù)Apache 2.0許可發(fā)布的開源軟件
- 優(yōu)化商品硬件上的工作負載
以下是Rook在Kubernetes上部署的架構
OpenShift 容器平臺部署Rook
OpenShift是紅帽開發(fā)的K8S的企業(yè)級方案,它為原生K8S增加了許多安全及其他特性忘古,特別是約束了運行中的Pod的權限徘禁。在部署與使用Rook時,需要允許應用擁有這些權限髓堪。
- 下載部署需要的代碼
代碼所在地址:https://github.com/rook/rook/blob/release-1.1/cluster/examples/kubernetes/ceph
- common.yaml:創(chuàng)建Namespace送朱、CRD、Role干旁、RoleBinding驶沼、ClusterRole、ClusterRoleBinding争群、PodSecurityPolicy回怜、ServiceAccount
- operator-openshift.yaml: 創(chuàng)建SCC以及完成Rook Operator部署
- cluster.yaml:創(chuàng)建CephCluster
- object-openshift.yaml: 使用rgw創(chuàng)建對象存儲,并設置對象存儲服務對外的端口
- 修改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下將會創(chuàng)建對應的資源
$ 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創(chuàng)建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集群狀態(tài)
- 創(chuàng)建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
# 文件系統(tǒng),默認是ext4
fstype: xfs
# reclaimPolicy冲泥,默認是"Delete"驹碍,可以設置為"Retain","Recycle"
reclaimPolicy: Retain
# Kubernetes 1.14+支持Resize功能壁涎,只支持ext3, ext4, xfs類型
allowVolumeExpansion: true
EOF
至此完成了通過Rook部署Ceph集群,并創(chuàng)建了相應的StorageClass志秃,該StorageClass便可以為應用提供使用怔球。
如果需要對Ceph集群擴容,只需要更新CephCluster的配置洽损,在storage
項中添加新加入的目錄或磁盤(生產上建議不要使用目錄)庞溜,Rook Operator將會自動將它加入到集群,實現(xiàn)集群的擴容碑定。