Kubernetes中分布式存储Rook-Ceph部署快速演练
最近在項(xiàng)目中有涉及到Kubernetes的分布式存儲(chǔ)部分的內(nèi)容,也抽空多了解了一些。項(xiàng)目主要基于Rook-Ceph運(yùn)行,考慮到Rook-Ceph部署也不那么簡(jiǎn)單,官方文檔的步驟起點(diǎn)也不算低,因此,在整合官方文檔的某些步驟的基礎(chǔ)上,寫(xiě)篇文章簡(jiǎn)單總結(jié)一下。
Rook-Ceph是Kubernetes中分布式存儲(chǔ)的一種解決方案,Rook作為一種開(kāi)源的、云原生的存儲(chǔ)編排器,為各種存儲(chǔ)服務(wù)在云原生的環(huán)境中實(shí)現(xiàn)無(wú)縫整合,提供了所必須的平臺(tái)、框架和服務(wù);而Ceph則是Rook所支持的眾多存儲(chǔ)方案的一種,在Kubernetes環(huán)境里,Ceph基于Rook能夠?yàn)閼?yīng)用程序提供塊存儲(chǔ)(Block Storage),對(duì)象存儲(chǔ)(Object Storage)以及共享文件系統(tǒng)(SFS)服務(wù)。此處就不對(duì)Rook Ceph進(jìn)行太多的介紹,直接步入正題,一步一步地演練Rook-Ceph從安裝部署到使用的整個(gè)過(guò)程。
注意:本文所有的yaml文件都是為了配合整個(gè)演練過(guò)程而設(shè)計(jì)的,理論上不能直接用在生產(chǎn)環(huán)境。如有需要,在用在生產(chǎn)環(huán)境之前,請(qǐng)確保所需的參數(shù)都已正確配置。
安裝Kubernetes
安裝Kubernetes。安裝方法有很多,不怕麻煩可以徒手安裝,也可以直接使用云供應(yīng)商的托管服務(wù),比如Azure AKS,也可以使用Rancher RKE,在此就不贅述了。
安裝Rook Ceph Operator
這里我們基于Ceph來(lái)討論。事實(shí)上Rook支持Ceph、Cassandra、CockroachDB、EdgeFS、NFS以及YugabyteDB等多種存儲(chǔ)供應(yīng)商(Storage Provider),針對(duì)不同的存儲(chǔ)供應(yīng)商,Rook提供不同的Operator來(lái)進(jìn)行資源的部署和管理。使用下面的命令來(lái)安裝Rook Ceph Operator:
helm repo add rook-release https://charts.rook.io/release kubectl create namespace rook-ceph helm install --namespace rook-ceph rook-ceph rook-release/rook-ceph安裝Ceph集群(Ceph Cluster)
可以使用下面的yaml文件:
# ceph-cluster-deploy.yaml apiVersion: ceph.rook.io/v1 kind: CephCluster metadata:name: rook-cephnamespace: rook-ceph spec:cephVersion:image: ceph/ceph:v15.2.7allowUnsupported: falsedataDirHostPath: /var/lib/rookskipUpgradeChecks: falsecontinueUpgradeAfterChecksEvenIfNotHealthy: falsemon:count: 3allowMultiplePerNode: falsemgr:modules:- name: pg_autoscalerenabled: truedashboard:enabled: truessl: truemonitoring:enabled: falserulesNamespace: rook-cephnetwork:crashCollector:disable: falsecleanupPolicy:confirmation: ""sanitizeDisks:method: quickdataSource: zeroiteration: 1allowUninstallWithVolumes: falseannotations:labels:resources:removeOSDsIfOutAndSafeToRemove: falseuseAllNodes: trueuseAllDevices: falsedeviceFilter: nvme1n1config:osdsPerDevice: "1"disruptionManagement:managePodBudgets: falseosdMaintenanceTimeout: 30pgHealthCheckTimeout: 0manageMachineDisruptionBudgets: falsemachineDisruptionBudgetNamespace: openshift-machine-apihealthCheck:daemonHealth:mon:disabled: falseinterval: 45sosd:disabled: falseinterval: 60sstatus:disabled: falseinterval: 60slivenessProbe:mon:disabled: falsemgr:disabled: falseosd:disabled: false然后使用以下命令創(chuàng)建Ceph集群:
kubectl create -f ceph-cluster-deploy.yaml命令執(zhí)行成功之后,需要等待幾分鐘,以便OSD能夠成功啟動(dòng)。執(zhí)行下面的命令可以查看所有容器的狀態(tài):
kubectl -n rook-ceph get pod正常情況下,應(yīng)該可以看到類(lèi)似以下的結(jié)果:
NAME READY STATUS RESTARTS AGE csi-cephfsplugin-provisioner-d77bb49c6-n5tgs 5/5 Running 0 140s csi-cephfsplugin-provisioner-d77bb49c6-v9rvn 5/5 Running 0 140s csi-cephfsplugin-rthrp 3/3 Running 0 140s csi-rbdplugin-hbsm7 3/3 Running 0 140s csi-rbdplugin-provisioner-5b5cd64fd-nvk6c 6/6 Running 0 140s csi-rbdplugin-provisioner-5b5cd64fd-q7bxl 6/6 Running 0 140s rook-ceph-crashcollector-minikube-5b57b7c5d4-hfldl 1/1 Running 0 105s rook-ceph-mgr-a-64cd7cdf54-j8b5p 1/1 Running 0 77s rook-ceph-mon-a-694bb7987d-fp9w7 1/1 Running 0 105s rook-ceph-mon-b-856fdd5cb9-5h2qk 1/1 Running 0 94s rook-ceph-mon-c-57545897fc-j576h 1/1 Running 0 85s rook-ceph-operator-85f5b946bd-s8grz 1/1 Running 0 92m rook-ceph-osd-0-6bb747b6c5-lnvb6 1/1 Running 0 23s rook-ceph-osd-1-7f67f9646d-44p7v 1/1 Running 0 24s rook-ceph-osd-2-6cd4b776ff-v4d68 1/1 Running 0 25s rook-ceph-osd-prepare-node1-vx2rz 0/2 Completed 0 60s rook-ceph-osd-prepare-node2-ab3fd 0/2 Completed 0 60s rook-ceph-osd-prepare-node3-w4xyz 0/2 Completed 0 60s需要注意幾點(diǎn):
ceph-cluster-deploy.yaml并沒(méi)有包括所有的Ceph集群創(chuàng)建的參數(shù),可以參考https://rook.io/docs/rook/v1.5/ceph-cluster-crd.html 來(lái)了解所有的配置信息
這里的deviceFilter: nvme1n1是用來(lái)指定在每個(gè)Kubernetes節(jié)點(diǎn)上應(yīng)該使用的卷(Volume)的名稱(chēng)。這個(gè)Volume不能格式化成任何文件系統(tǒng),否則Ceph將不會(huì)使用它作為存儲(chǔ)卷。我在AWS上創(chuàng)建了獨(dú)立的EBS卷,然后直接Attach到Kubernetes節(jié)點(diǎn)的機(jī)器上,通過(guò)lsblk命令即可獲得卷的名稱(chēng),將這個(gè)名稱(chēng)填入deviceFilter設(shè)置即可
安裝Rook Toolbox
Rook Toolbox是一個(gè)運(yùn)行在rook-ceph命名空間下的容器,通過(guò)它可以執(zhí)行一些Ceph的管理任務(wù),建議安裝,還是挺實(shí)用的。創(chuàng)建一個(gè)yaml文件:
# rook-toolbox.yaml apiVersion: apps/v1 kind: Deployment metadata:name: rook-ceph-toolsnamespace: rook-cephlabels:app: rook-ceph-tools spec:replicas: 1selector:matchLabels:app: rook-ceph-toolstemplate:metadata:labels:app: rook-ceph-toolsspec:dnsPolicy: ClusterFirstWithHostNetcontainers:- name: rook-ceph-toolsimage: rook/ceph:v1.5.3command: ["/tini"]args: ["-g", "--", "/usr/local/bin/toolbox.sh"]imagePullPolicy: IfNotPresentenv:- name: ROOK_CEPH_USERNAMEvalueFrom:secretKeyRef:name: rook-ceph-monkey: ceph-username- name: ROOK_CEPH_SECRETvalueFrom:secretKeyRef:name: rook-ceph-monkey: ceph-secretvolumeMounts:- mountPath: /etc/cephname: ceph-config- name: mon-endpoint-volumemountPath: /etc/rookvolumes:- name: mon-endpoint-volumeconfigMap:name: rook-ceph-mon-endpointsitems:- key: datapath: mon-endpoints- name: ceph-configemptyDir: {}tolerations:- key: "node.kubernetes.io/unreachable"operator: "Exists"effect: "NoExecute"tolerationSeconds: 5然后:
kubectl create -f rook-toolbox.yaml接著可以執(zhí)行下面的命令,進(jìn)入Rook Toolbox容器:
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash然后使用ceph status命令來(lái)查看集群的狀態(tài)。正常的話(huà)應(yīng)該可以看到類(lèi)似下面的結(jié)果:
$ ceph statuscluster:id: a0452c76-30d9-4c1a-a948-5d8405f19a7chealth: HEALTH_OKservices:mon: 3 daemons, quorum a,b,c (age 3m)mgr: a(active, since 2m)osd: 3 osds: 3 up (since 1m), 3 in (since 1m)一定要確保health的狀態(tài)為HEALTH_OK,如果不是HEALTH_OK,則需要排查原因并解決。問(wèn)題排查指南:https://rook.io/docs/rook/v1.5/ceph-common-issues.html。
部署塊存儲(chǔ)(Provisioning Block Storage)
使用下面的yaml:
# ceph-block-deploy.yaml apiVersion: ceph.rook.io/v1 kind: CephBlockPool metadata:name: replicapoolnamespace: rook-ceph spec:failureDomain: hostreplicated:size: 3--- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata:name: rook-ceph-blockannotations:storageclass.kubernetes.io/is-default-class: "true" provisioner: rook-ceph.rbd.csi.ceph.com parameters:clusterID: rook-cephpool: replicapoolimageFormat: "2"imageFeatures: layeringcsi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisionercsi.storage.k8s.io/provisioner-secret-namespace: rook-cephcsi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisionercsi.storage.k8s.io/controller-expand-secret-namespace: rook-cephcsi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-nodecsi.storage.k8s.io/node-stage-secret-namespace: rook-cephcsi.storage.k8s.io/fstype: ext4 reclaimPolicy: Retain然后:
Kubectl create -f ceph-block-deploy.yaml在這個(gè)yaml中,同時(shí)定義了名為rook-ceph-block的StorageClass,用以在pods啟動(dòng)的時(shí)候能夠動(dòng)態(tài)創(chuàng)建基于Ceph的塊存儲(chǔ)(通過(guò)pool: replicapool的設(shè)置指定)。此外,在這個(gè)StorageClass中,設(shè)定了storageclass.kubernetes.io/is-default-class: "true"。因此,在PersistentVolumeClaim中即使沒(méi)有指定storageClassName,Kubernetes也會(huì)默認(rèn)使用Ceph塊存儲(chǔ)來(lái)保存app的數(shù)據(jù)。
部署塊存儲(chǔ)的詳細(xì)內(nèi)容可以參考:https://rook.io/docs/rook/v1.5/ceph-block.html。
部署對(duì)象存儲(chǔ)(Provisioning Object Storage)
使用下面的yaml:
# ceph-s3-deploy.yaml apiVersion: ceph.rook.io/v1 kind: CephObjectStore metadata:name: my-storenamespace: rook-ceph spec:metadataPool:failureDomain: hostreplicated:size: 3dataPool:failureDomain: hosterasureCoded:dataChunks: 2codingChunks: 1preservePoolsOnDelete: truegateway:type: s3sslCertificateRef:port: 80# securePort: 443instances: 3healthCheck:bucket:disabled: falseinterval: 60s然后:
kubectl create -f ceph-s3-deploy.yaml等待幾分鐘后,執(zhí)行下面的命令:
kubectl -n rook-ceph get pod -l app=rook-ceph-rgw此時(shí)應(yīng)該可以在pod的列表中看到名字包含有rgw的pod處于Running狀態(tài)。
接下來(lái)就是要在對(duì)象存儲(chǔ)上創(chuàng)建Bucket。官方提供了基于StorageClass的創(chuàng)建方式。這里介紹另一種方式,就是借用MINIO的管理工具來(lái)創(chuàng)建。使用下面的shell腳本:
在確保了當(dāng)前機(jī)器上安裝了jq后,執(zhí)行:
chmod +x setup-s3-storage.sh ./setup-s3-storage.sh此時(shí)會(huì)輸出S3的Access Key和Secret Key。創(chuàng)建的Bucket名為data。
驗(yàn)證Object Storage是否部署成功,首先執(zhí)行下面的命令進(jìn)入Rook Toolbox:
然后執(zhí)行:
export AWS_HOST=<host> export AWS_ENDPOINT=<endpoint> export AWS_ACCESS_KEY_ID=<accessKey> export AWS_SECRET_ACCESS_KEY=<secretKey>- 為rgw Service的DNS主機(jī)名。如果你的Object Storage名為my-store,那么主機(jī)名就是rook-ceph-rgw-my-store.rook-ceph
- 為rgw Service的端點(diǎn)。執(zhí)行kubectl -n rook-ceph get svc rook-ceph-rgw-my-store,然后將ClusterIP和端口號(hào)拼接起來(lái)作為endpoint的值
accessKey:上一步獲得的Access Key
secretKey:上一步獲得的Secret Key
以下是一個(gè)例子:
接下來(lái),安裝一個(gè)s3cmd的工具:
yum --assumeyes install s3cmd然后隨便寫(xiě)一些內(nèi)容到rookObj文件:
echo "Hello Rook" > /tmp/rookObj然后通過(guò)s3cmd,將這個(gè)文件保存到S3:
s3cmd put /tmp/rookObj --no-ssl --host=${AWS_HOST} --host-bucket= s3://data注意--host-bucket=后的空格。
然后,使用s3cmd從Bucket將文件下載并另存為另一個(gè)文件:
最后,通過(guò)cat命令,查看下載下來(lái)的文件的內(nèi)容是否正確:
cat /tmp/rookObj-download如果能夠看到Hello Rook的輸出字樣,表示一切正常。接下來(lái)就可以在app中使用Ceph Block Storage和Ceph Object Storage了。
部署對(duì)象存儲(chǔ)的詳細(xì)內(nèi)容可以參考:https://rook.io/docs/rook/v1.5/ceph-object.html。
下一步
之后我會(huì)使用Microsoft .NET 5,編寫(xiě)一個(gè)Web API應(yīng)用程序并部署到Kubernetes環(huán)境,演示如何在app中使用本文所部署的Ceph Block Storage和Ceph Object Storage。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Kubernetes中分布式存储Rook-Ceph部署快速演练的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 帮助阅读源码的8个技巧
- 下一篇: 如何在 WebAPI 中启用 CORS