Kubernetes中分布式存储Rook-Ceph部署快速演练

最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也抽空多了解了一些。项目主要基于Rook-Ceph运行,考虑到Rook-Ceph部署也不那么简单,官方文档的步骤起点也不算低,因此,在整合官方文档的某些步骤的基础上,写篇文章简单总结一下。

Rook-Ceph是Kubernetes中分布式存储的一种解决方案,Rook作为一种开源的、云原生的存储编排器,为各种存储服务在云原生的环境中实现无缝整合,提供了所必须的平台、框架和服务;而Ceph则是Rook所支持的众多存储方案的一种,在Kubernetes环境里,Ceph基于Rook能够为应用程序提供块存储(Block Storage),对象存储(Object Storage)以及共享文件系统(SFS)服务。此处就不对Rook Ceph进行太多的介绍,直接步入正题,一步一步地演练Rook-Ceph从安装部署到使用的整个过程。

注意:本文所有的yaml文件都是为了配合整个演练过程而设计的,理论上不能直接用在生产环境。如有需要,在用在生产环境之前,请确保所需的参数都已正确配置。

安装Kubernetes

安装Kubernetes。安装方法有很多,不怕麻烦可以徒手安装,也可以直接使用云供应商的托管服务,比如Azure AKS,也可以使用Rancher RKE,在此就不赘述了。

安装Rook Ceph Operator

这里我们基于Ceph来讨论。事实上Rook支持Ceph、Cassandra、CockroachDB、EdgeFS、NFS以及YugabyteDB等多种存储供应商(Storage Provider),针对不同的存储供应商,Rook提供不同的Operator来进行资源的部署和管理。使用下面的命令来安装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

然后使用以下命令创建Ceph集群:

kubectl create -f ceph-cluster-deploy.yaml

命令执行成功之后,需要等待几分钟,以便OSD能够成功启动。执行下面的命令可以查看所有容器的状态:

kubectl -n rook-ceph get pod

正常情况下,应该可以看到类似以下的结果:

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

需要注意几点:

  • ceph-cluster-deploy.yaml并没有包括所有的Ceph集群创建的参数,可以参考https://rook.io/docs/rook/v1.5/ceph-cluster-crd.html 来了解所有的配置信息

  • 这里的deviceFilter: nvme1n1是用来指定在每个Kubernetes节点上应该使用的卷(Volume)的名称。这个Volume不能格式化成任何文件系统,否则Ceph将不会使用它作为存储卷。我在AWS上创建了独立的EBS卷,然后直接Attach到Kubernetes节点的机器上,通过lsblk命令即可获得卷的名称,将这个名称填入deviceFilter设置即可

安装Rook Toolbox

Rook Toolbox是一个运行在rook-ceph命名空间下的容器,通过它可以执行一些Ceph的管理任务,建议安装,还是挺实用的。创建一个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

接着可以执行下面的命令,进入Rook Toolbox容器:

kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash

然后使用ceph status命令来查看集群的状态。正常的话应该可以看到类似下面的结果:

$ 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的状态为HEALTH_OK,如果不是HEALTH_OK,则需要排查原因并解决。问题排查指南:https://rook.io/docs/rook/v1.5/ceph-common-issues.html。

部署块存储(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

在这个yaml中,同时定义了名为rook-ceph-blockStorageClass,用以在pods启动的时候能够动态创建基于Ceph的块存储(通过pool: replicapool的设置指定)。此外,在这个StorageClass中,设定了storageclass.kubernetes.io/is-default-class: "true"。因此,在PersistentVolumeClaim中即使没有指定storageClassName,Kubernetes也会默认使用Ceph块存储来保存app的数据。

部署块存储的详细内容可以参考:https://rook.io/docs/rook/v1.5/ceph-block.html。

部署对象存储(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

等待几分钟后,执行下面的命令:

kubectl -n rook-ceph get pod -l app=rook-ceph-rgw

此时应该可以在pod的列表中看到名字包含有rgw的pod处于Running状态。
接下来就是要在对象存储上创建Bucket。官方提供了基于StorageClass的创建方式。这里介绍另一种方式,就是借用MINIO的管理工具来创建。使用下面的shell脚本:

# setup-s3-storage.sh
#! /bin/bash
echo "Creating Ceph User"
CREATE_USER_OUTPUT=`kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') -- radosgw-admin user create --uid=system-user --display-name=system-user --system`
ACCESS_KEY=$(echo $CREATE_USER_OUTPUT | jq -r ".keys[0].access_key")
SECRET_KEY=$(echo $CREATE_USER_OUTPUT | jq -r ".keys[0].secret_key")
echo "User was created successfully"
echo "S3 ACCESS KEY = $ACCESS_KEY"
echo "S3 SECRET KEY = $SECRET_KEY"echo "Creating Ceph S3 Bucket"
kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') -- curl https://dl.min.io/client/mc/release/linux-amd64/mc --output mc
kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') -- chmod +x mc
kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') -- ./mc config host add mys3 http://rook-ceph-rgw-signals-store/ "$ACCESS_KEY" "$SECRET_KEY"
kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') -- ./mc mb mys3/data
echo "Ceph S3 Bucket created successfully"
echo "S3 ACCESS KEY = $ACCESS_KEY"
echo "S3 SECRET KEY = $SECRET_KEY"

在确保了当前机器上安装了jq后,执行:

chmod +x setup-s3-storage.sh
./setup-s3-storage.sh

此时会输出S3的Access Key和Secret Key。创建的Bucket名为data。
验证Object Storage是否部署成功,首先执行下面的命令进入Rook Toolbox:

kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash

然后执行:

export AWS_HOST=<host>
export AWS_ENDPOINT=<endpoint>
export AWS_ACCESS_KEY_ID=<accessKey>
export AWS_SECRET_ACCESS_KEY=<secretKey>
  • 为rgw Service的DNS主机名。如果你的Object Storage名为my-store,那么主机名就是rook-ceph-rgw-my-store.rook-ceph
  • 为rgw Service的端点。执行kubectl -n rook-ceph get svc rook-ceph-rgw-my-store,然后将ClusterIP和端口号拼接起来作为endpoint的值
  • accessKey:上一步获得的Access Key

  • secretKey:上一步获得的Secret Key
    以下是一个例子:

export AWS_HOST=rook-ceph-rgw-my-store.rook-ceph
export AWS_ENDPOINT=10.104.35.31:80
export AWS_ACCESS_KEY_ID=XEZDB3UJ6X7HVBE7X7MA
export AWS_SECRET_ACCESS_KEY=7yGIZON7EhFORz0I40BFniML36D2rl8CQQ5kXU6l

接下来,安装一个s3cmd的工具:

yum --assumeyes install s3cmd

然后随便写一些内容到rookObj文件:

echo "Hello Rook" > /tmp/rookObj

然后通过s3cmd,将这个文件保存到S3:

s3cmd put /tmp/rookObj --no-ssl --host=${AWS_HOST} --host-bucket=  s3://data

注意--host-bucket=后的空格。
然后,使用s3cmd从Bucket将文件下载并另存为另一个文件:

s3cmd get s3://data/rookObj /tmp/rookObj-download --no-ssl --host=${AWS_HOST} --host-bucket=

最后,通过cat命令,查看下载下来的文件的内容是否正确:

cat /tmp/rookObj-download

如果能够看到Hello Rook的输出字样,表示一切正常。接下来就可以在app中使用Ceph Block Storage和Ceph Object Storage了。

部署对象存储的详细内容可以参考:https://rook.io/docs/rook/v1.5/ceph-object.html。

下一步

之后我会使用Microsoft .NET 5,编写一个Web API应用程序并部署到Kubernetes环境,演示如何在app中使用本文所部署的Ceph Block Storage和Ceph Object Storage。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB向量化函数 举例,MatLab-向量化技巧

《MatLab-向量化技巧》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《MatLab-向量化技巧(10页珍藏版)》请在人人文库网上搜索。1、MatLab 向量化技巧家家 2007-05-17 13:53大家都知道MatLab是一种解释性语言&#xff0c;它的长处在矩阵运算。因此需要将问题尽量用矩阵…

IT人的八大修炼神器

看到2018年的KPI&#xff0c;你是否感到崩溃&#xff1f;在这个充满竞争的时代&#xff0c;你需要用最有效的方式&#xff0c;学习最有用的知识&#xff0c;来提高自身技能。小编特意为大家准备IT人的八大修炼神器&#xff0c;推荐能帮助我们提升技术的公众号&#xff0c;欢迎大…

hotelling t2 matlab,pca主成份分析方法

1.应用pca的前提应用pca的前提是&#xff0c;连续信号具有相关性。相关性是什么&#xff0c;是冗余。就是要利用pca去除冗余。2.pca的定义pca是一种去除随机变量间相关性的线性变换。是一种常用的多元数据分析方法。pca将互相关的输入数据转换成统计上不相干的主成分(或者特征)…

如何在 WebAPI 中启用 CORS

浏览器安全策略上的安全限制可以有效的阻止 Ajax 向另外一个域server发起请求&#xff0c;这就是著名的 同源策略&#xff0c;那如何突破这种限制呢&#xff1f;可以使用 CORS &#xff08;Cross-Origin Resource Sharing&#xff09; 跨域资源共享来解决此类问题&#xff0c;它…

Kappa信息化谋局电子商务与传统渠道的全面管理

近日&#xff0c;Kappa中国总经理任轶先生与淘宝网首席财务官兼淘宝商城负责人张勇先生会晤于杭州淘宝总部&#xff0c;就淘宝网与Kappa的电子商务战略合作达成全面共识。非常注重企业信息化建设的Kappa在积极推进电子商务的同时&#xff0c;也早早的把电子商务模式下的信息化建…

druid字段级_Druid的数据结构

Druid的数据结构Druid数据存储结构可以分为三层&#xff1a; 1. DataSource 2. Chunk 3. SegmentDataSource相当于传统数据库的按时间分区的表&#xff0c;Chunk相当于MySQL中的按时间分区的表一个分区&#xff0c;但是Chunk不是一个实体&#xff0c;只是一个虚拟的概念&#x…

数据分析师+做过名企项目+懂运营+985毕业=跳槽失败?

数据已经成为很多企业的重要资源&#xff0c;数据分析已经成为了各行业的指导军事&#xff0c;但是数据分析师的工作从来都不是容易的。如今&#xff0c;数据分析师是一个互联网从业人士转型最快捷的入门职位&#xff0c;人工智能、大数据都要依附于数据分析。很多人也因为前途…

matlab 如何画二维图形,Matlab 学习 画图篇 一 二维图形

matlab给绘制二维图形提供了很多的函数&#xff0c;把一些绘制二维图形的基本函数做成一张表&#xff0c;如下图所示&#xff1a;我就按照表的顺序一一记录一些个函数的简略用法。首先是1.plot函数plot函数有很多重载方法&#xff0c;这里只做简单的介绍1.1 plot(Y)1.1 若Y是向…

Newbe.Claptrap 框架入门,第二步 —— 创建项目

接上一篇 《Newbe.Claptrap 框架入门&#xff0c;第一步 —— 开发环境准备》&#xff0c;我们继续了解如何创建一个 Newbe.Claptrap 项目。安装项目模板 打开控制台运行以下命令来安装最新的项目模板&#xff1a;dotnet new --install Newbe.Claptrap.Template安装完毕后&…

TTL expired in transit--问题篇~

今天在做东航事件处理时&#xff0c;发现远程登陆DMS服务器后&#xff0c;ping所有三层交换机<cisco 3550> 都发现一个现象:TTL expired in transit&#xff1b;如图1所示:之后用tracert -d IP 后&#xff0c;如图2所示:如图可见&#xff0c;可以清楚的发现&#xff0c…

生成drl文件_我如何通过编程方式生成.drl文件。任何示例对我都将有所帮助

我搜索了很多站点&#xff0c;但找不到有关.drl文件生成的任何特定相关示例。 .drl文件生成方面的文档也不值得。解决方案//- ---- package部分-------PackageDescr pkg new PackageDescr();pkg.setName(" com.demo.model");// -------此处的导入部分-------ImportD…

【干货】机器学习中样本比例不平衡的处理方法

推荐阅读时间&#xff1a;5min~12min主要内容&#xff1a;机器学习中样本比例不平衡的处理方法在机器学习中&#xff0c;常常会遇到样本比例不平衡的问题&#xff0c;如对于一个二分类问题&#xff0c;正负样本的比例是 10:1。这种现象往往是由于本身数据来源决定的&#xff0c…

Newbe.Claptrap 框架入门,第一步 —— 开发环境准备

Newbe.Claptrap 框架依托于一些关键性的基础组件和一些可选的辅助组件。本篇我们来介绍一下如何准备一个开发环境。必要组件 这些组件是使用本框架进行开发是必须要安装的组件。Docker DesktopDocker Desktop 是以下所有组件运行的基础。开发可以通过以下链接下载对应操作系统的…

php sequelize,node,express_sequelize 联合查询,node,express,mysql,sequelize - phpStudy

sequelize 联合查询我用sequelize 联合查询db.user.hasMany(db.bbsuser,{foreignKey:userId});db.bbsuser.belongsTo(db.user);db.user.findAll({include:[db.bbsuser]})&#xff1b;得到结果格式以下&#xff1a;{"id": 9,"username": "CallMeSoul&q…

vs中断点不能设置

确保你的exe和pdb文件是从当前源代码里编译出来的。或者在 Tool -> options -> debug. 从中找到并取消掉“源代码必须和调试文件的版本一致”。 转载于:https://blog.51cto.com/ustcer/265179

android 弹窗有边框_Android 多种简单的弹出框样式设置代码

简介这是一个基于AlertDialog和Dialog这两个类封装的多种弹出框样式&#xff0c;其中提供各种简单样式的弹出框使用说明。同时也可自定义弹出框。特性1.使用链式开发代码简洁明了2.所有的弹出框样式都在DialogUIUtils这个类中完成&#xff0c;方便查阅方法3.可以自定义弹出框字…

网易10万+课程迅速刷屏又迅速被封:“违规”背后的思考

从16号晚上8点前后上线到17号早上&#xff0c;不到16小时&#xff0c;网易云课堂的“年度运营大课”&#xff0c;已售出超10万份&#xff08;售价39元&#xff09;&#xff0c;可以说是非常现象级了。而取得如此现象级成果的背后&#xff0c;至少一个核心驱动力源自于一个“一级…

一起学习设计模式--03.工厂方法模式

简单工厂模式虽然简单&#xff0c;但是存在一个很严重的问题&#xff1a;由于静态工厂方法是根据传入的参数不同来创建不同的产品的&#xff0c;所以当系统中需要引入新产品时&#xff0c;就需要修改工厂类的源代码&#xff0c;这将违背开闭原则。为了实现增加新产品而不修改原…

php restful规范,RESTFul API规范 详细指南

RESTFul规范RESTFul是一种HTTP API接口规范&#xff0c;只要满足的RESTFul规范&#xff0c;即可称为RESTFul API。既然是接口&#xff0c;我们先来了解一下&#xff0c;他和传统的API接口有何不同吧。本文以尽量简单明了的文字来介绍、描述&#xff0c;只讲核心内容&#xff0c…

求对一组数据进行排名的算法

为什么80%的码农都做不了架构师&#xff1f;>>> 我现在有一组数据&#xff0c;比如&#xff1a;25&#xff0c;19&#xff0c;29&#xff0c;3 怎么用java获得这组数据的排名&#xff0c;获得排名的结果应该是3&#xff0c;2&#xff0c;4&#xff0c;1 如果有相等…