Kubernetes中分布式存储Rook-Ceph的使用:一个ASP.NET Core MVC的案例

在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中,我快速介绍了Kubernetes中分布式存储Rook-Ceph的部署过程,这里介绍如何在部署于Kubernetes的ASP.NET Core MVC的应用程序中使用Rook-Ceph所创建的存储对象。

构建ASP.NET Core MVC (.NET 5)应用程序

这个程序的基本功能就是用户可以通过主页上传一个文件并保存到由Rook-Ceph创建的S3对象存储,同时将文件信息和上传时间保存为一个MongoDB的文档。MongoDB使用Rook-Ceph创建的块存储(Block Storage)。
首先,新建一个基于.NET 5的ASP.NET Core MVC应用程序,添加AWSSDK.S3MongoDB.Driver这两个NuGet Package的引用。
然后,修改Startup.csConfigureServices方法:

public void ConfigureServices(IServiceCollection services)
{services.AddControllersWithViews();services.Configure<FormOptions>(options =>{options.MultipartBodyLengthLimit = 268435456;});var s3Endpoint = Configuration["s3:endpoint"];var s3AccessKey = Configuration["s3:accessKey"];var s3SecretKey = Configuration["s3:secretKey"];var s3Configuration = new AmazonS3Config{RegionEndpoint = RegionEndpoint.USEast1,ServiceURL = s3Endpoint,ForcePathStyle = true};services.AddTransient<IAmazonS3>(sp => new AmazonS3Client(s3AccessKey, s3SecretKey, s3Configuration));var mongoConnectionString = Configuration["mongo:connectionString"];var mongoDatabase = Configuration["mongo:database"];services.AddTransient<IDataAccessObject>(sp => new MongoDataAccessObject(new MongoUrl(mongoConnectionString), mongoDatabase));
}

这里用到了配置信息,为了调试方便,可以修改appsettings.json文件,添加对于S3和MongoDB的配置信息:

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"s3": {"endpoint": "http://localhost:9000","accessKey": "AKIAIOSFODNN7EXAMPLE","secretKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"},"mongo": {"connectionString": "mongodb://localhost:27017","database": "form-file-upload"},"AllowedHosts": "*"
}

之后,修改Index.cshtml文件,将界面元素准备好:

@{ViewData["Title"] = "Home Page";
}
@model FileUploadModel<div class="text-center"><h1 class="display-4">Welcome</h1><p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p><form method="post" enctype="multipart/form-data" asp-controller="Home" asp-action="Index"><div class="form-group"><div class="col-md-10"><p>Upload one or more files using this form:</p><input type="file" name="file" /></div></div><div class="form-group"><div class="col-md-10"><input type="submit" value="Save" /></div></div></form>
</div>

修改HomeController:

public class HomeController : Controller
{private readonly ILogger<HomeController> _logger;private readonly IDataAccessObject _dao;private readonly IAmazonS3 _s3;public HomeController(ILogger<HomeController> logger, IAmazonS3 s3, IDataAccessObject dao)=> (_logger, _s3, _dao) = (logger, s3, dao);public IActionResult Index(){return View();}[HttpPost][ValidateAntiForgeryToken]public async Task<IActionResult> Index(FileUploadModel model){if (model.File != null){var fileName = Path.GetFileName(model.File.FileName);var fileTransUtility = new TransferUtility(_s3);using var stream = model.File.OpenReadStream();await fileTransUtility.UploadAsync(stream, "data", $"FormFileUpload/{fileName}");await _dao.AddAsync<SavedFile>(new SavedFile{Timestamp = DateTime.UtcNow,FileName = fileName});return View();}else{}return View();}public IActionResult Privacy(){return View();}[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]public IActionResult Error(){return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });}
}

其它相关代码这里就不全部贴出来了,可以直接参考本案例的源代码。
在开发模式下,我使用运行于Docker的MongoDB以及MINIO分别作为数据库后端和S3服务后端。在按下F5进行Debug之前,请先确保MongoDB和MINIO已经运行。可以参考https://github.com/daxnet/form-file-upload/blob/main/docker-compose.yml。

生成用于部署应用程序的HELM Chart

仍然使用上面提到的docker-compose.yml文件,然后使用下面的命令来生成HELM Chart:

kompose convert -f docker-compose.yml -c -o k8s

执行成功后会在k8s的目录下产生用于部署到Kubernetes的HELM Chart。完整内容可以参考:https://github.com/daxnet/form-file-upload/tree/main/k8s
需要注意几个内容:

使用Ceph Object Store (S3)

要使用Ceph Object Store,只需要正确配置app中S3的Access Key、Secret Key以及Endpoint即可。对应的就是form-file-upload-service-deployment.yaml中的s3__accessKeys3__endpoints3__secretKey环境变量设置。它们的取值在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中已经介绍过了,只是在Endpoint的Host名称上需要加上http://。详细可以参考values.yaml文件。

使用Ceph Block Storage

部署到Kubernetes的MongoDB会需要使用Ceph Block Storage。在mongodb-deployment.yaml中,会指定容器的volumeMount:

volumeMounts:
- mountPath: /data/dbname: mongo-data

然后在Volume的定义部分,指定使用名为{{ .Release.Name }}-form-file-upload-mongo-data的PersistentVolumeClaim:

volumes:
- name: mongo-datapersistentVolumeClaim:claimName: {{ .Release.Name }}-form-file-upload-mongo-data

这里的{{ .Release.Name }}表示HELM的release的名字。接下来,在这个PersistentVolumeClaim中(mongo-data-persistentvolumeclaim.yaml),可以指定所需使用的StorageClass:

spec:accessModes:- ReadWriteOnceresources:requests:storage: 20GistorageClassName: {{ .Values.mongoStorageClassName }}

在这里,storageClassNamevalues.yaml中设置:

mongoStorageClassName: "rook-ceph-block"

rook-ceph-block就是我们在前文中创建的Block Storage的名字。

部署并运行程序

使用git将https://github.com/daxnet/form-file-upload.git克隆到本地,进入k8s目录,然后:

helm install ffu .

安装成功后,查看pods:

$ kubectl get po
NAME                                            READY   STATUS    RESTARTS   AGE
dnsutils                                        1/1     Running   2          160m
ffu-form-file-upload-mongo-8c46f48fc-vm76k      1/1     Running   0          23m
ffu-form-file-upload-service-7c5c679b96-rxl5s   1/1     Running   0          23m

查看PersistentVolumeClaims:

$ kubectl get pvc
NAME                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
ffu-form-file-upload-mongo-data   Bound    pvc-8e681be4-4378-11eb-8a9b-0ac973bf1e37   20Gi       RWO            rook-ceph-block   64m

可以看到,ffu-form-file-upload-mongo-data这个PVC使用的StorageClass就是rook-ceph-block。
查看Services:

$ kubectl get svc
NAME                           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
ffu-form-file-upload-mongo     ClusterIP   10.43.83.79    <none>        27017/TCP   65m
ffu-form-file-upload-service   ClusterIP   10.43.57.233   <none>        8080/TCP    65m
kubernetes                     ClusterIP   10.43.0.1      <none>        443/TCP     3d10h

通过port-forward来访问应用程序:

$ kubectl port-forward svc/ffu-form-file-upload-service 8081:8080
Forwarding from 127.0.0.1:8081 -> 80
Forwarding from [::1]:8081 -> 80

打开浏览器,访问http://localhost:8081

点击Choose File按钮,选择一个文件(测试方便尽量选择小一点的文件)点击Save。成功后没有任何信息提示,会返回到没有上传文件时的状态。

验证结果

使用下面的命令查看S3中已经保存的文件:

$ kubectl exec -it -n rook-ceph deploy/rook-ceph-tools -- s3cmd ls s3://data/FormFileUpload/
2020-12-21 11:47         1260  s3://data/FormFileUpload/abc.sldimport

可以看到,文件已经成功上传到S3。
使用下面的命令查看MongoDB中的数据:

$ kubectl exec -it deploy/ffu-form-file-upload-mongo -- mongo --eval "db.SavedFile.find().pretty()" form-file-upload
MongoDB shell version v3.6.21
connecting to: mongodb://127.0.0.1:27017/form-file-upload?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("85f7d362-13d6-41b9-90f9-9de86f711eb0") }
MongoDB server version: 3.6.21
{"_id" : BinData(3,"NyKi+5Q5N0O9B1bIddlk/g=="),"Timestamp" : ISODate("2020-12-21T11:47:01.853Z"),"FileName" : "abc.sldimport"
}

可以看到,数据记录已经成功保存到MongoDB。

源代码和部署脚本

一切的一切,尽在https://github.com/daxnet/form-file-upload。
Enjoy!

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

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

相关文章

php super和parent,parent()、parents()的用法区别

parent():所有匹配元素的父元素的组合parents()&#xff1a;所有匹配元素的祖先元素(包括父元素)的组合关键代码如下&#xff1a;第1层DIV第2层DIV第3层DIVbbb$(function(){$("input[typebutton]").click(function(){$("div >b").parent("div"…

android 开启一个定时线程_Android 定时任务刷新的多种实现方式

1.采用Handle与线程的sleep(long)方法1) 定义一个Handler类&#xff0c;用于处理接受到的Message。Handler handler new Handler() {public void handleMessage(Message msg) {// 要做的事情super.handleMessage(msg);}};2) 新建一个实现Runnable接口的线程类&#xff0c;如下…

系统安全防护之UNIX下***检测方法

因为UNIX系统经常承当着关键任务,所以它经常是***者***的首选目标。于是检测***、保护系统安全是管理员的最为重要的任务之一。那么&#xff0c;在没有其它工具帮助的情况下&#xff0c;如何去判断系统当前的安全性&#xff1f;如何去发现***呢&#xff1f;下面给大家介绍一些常…

在Windows上安装Docker

背景Windows的Docker桌面是Microsoft Windows的Docker的社区版本。您可以从Docker Hub下载适用于Windows的Docker桌面。该页面包含有关在Windows 10 Pro&#xff0c;Enterprise和Education上安装Docker Desktop的信息。如果要查找有关在Windows 10 Home上安装Docker桌面的信息.…

全景图解高铁数据,谁是最有潜力的高铁城市?

经过十年的快速发展&#xff0c;高铁已成为人们日常出行的重要交通工具&#xff0c;“千里江陵一日还”早已变成现实&#xff0c;高铁改变的不仅是不断刷新的“中国速度”&#xff0c;更为区域与城市发展带来新的模式与机遇。高铁以高速、大容量、集约型、通勤化的特征&#xf…

对MATLAB课程教程的建议,关于MATLAB课程教学的几点探讨

练习。另一方面&#xff0c;对于如解线性方程组、求函数的极限、导数和数值积分等大量Matlab函数和指令的运用&#xff0c;不需要花过多的时间跟学生讲解&#xff0c;可以让学生自己查看Matlab的帮助文档&#xff0c;并上机练习。Matlab提供了几乎包含其所有内容和功能的在线帮…

原型链的理解_javascript之快速理解(原型链)

希望通过比较通俗易懂的讲解和简短的文字&#xff0c;让大家能快速理解什么是原型链&#xff0c;如果有不对的地方也请各位大佬快速纠正&#xff0c;一起共勉&#xff0c;使我们初学者快速进阶&#xff01;话不多说&#xff0c;我们切入正题&#xff0c;按着我的步骤一步一步往…

VMware的网卡设置模式

Bridge:这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,和linux下一个网卡 绑定两个不同地址类似,实际上是将网卡设置为混杂模式,从而达到侦听多个IP的能力. 在此种模式下,虚拟机内部的网卡(例如linux下的eth0)直接连到了物理网卡所在的网络上,可以想象为虚拟机和host机…

如何轻松将上亿的数据玩弄于股掌之中?

在日常生活中&#xff0c;我们经常会遇到排序问题&#xff1a;在打扑克牌的时候&#xff0c;原本拿到手上的牌是乱序的&#xff0c;我们会按照自己喜好的顺序一张一张排好手上的牌&#xff0c;最后看起来是顺眼的。比如小智打扑克牌会将自己手上的牌排成这样&#xff1a;小智排…

帮助阅读源码的8个技巧

大家好&#xff0c;我是Z哥。之前写了一篇关于阅读源码到底有多少价值的文章《阅读源码的真正价值》&#xff0c;反响还不错。在文中我向你阐明了阅读源码5个价值。面试在工作中更快地上手新项目给自己创造用新技术的机会完善知识体系学习别人的设计思路那么今天我就和你来聊聊…

php webshell开源,[github开源]webshell连接器--Jeshell

前言&#xff1a;以前连接webshell都是用一个好朋友写的Webshellsniper&#xff0c;但是昨天使用webshellsniper测试的时候&#xff0c;发现不能支持shell_exec()这个php函数&#xff0c;问了一下才知道&#xff0c;他写的默认是只用eval()和assert()函数的webshell。于是&…

robcad和catia是什么关系_proe/CATIA/UG/SolidWorks软件区别与联系

proe/CATIA/UG/SolidWorks软件区别与联系相信你一定清楚proe软件的用途&#xff0c;其实它在机械设计上面的应用也是非常广泛&#xff0c;与CATIA、UG、SolidWorks软件一样&#xff0c;这四大软件可谓是在机械设计应用非常广泛的软件&#xff0c;几乎在这个行业里的设计师无外乎…

活动目录组策略统一管理桌面

使用组策略实现企业统一桌面 在企业中为了实现企业形象的统一性&#xff0c;会要求在企业所有计算机上实现标准的桌面化配置环境。1、统一桌面壁纸在域控上建立存放背景图片的文件夹&#xff0c;将其设置为共享文件夹&#xff1b; 然后在开始—运行中GPedit.msc命令进入…

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

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

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…