网站模板哪个好用,seo技术网站建设,微信制作网站设计,网站实名认证功能怎么做在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中#xff0c;我快速介绍了Kubernetes中分布式存储Rook-Ceph的部署过程#xff0c;这里介绍如何在部署于Kubernetes的ASP.NET Core MVC的应用程序中使用Rook-Ceph所创建的存储对象。构建ASP.NET Core MVC (.NET 5)应用… 在《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.S3和MongoDB.Driver这两个NuGet Package的引用。然后修改Startup.cs的ConfigureServices方法public void ConfigureServices(IServiceCollection services)
{services.AddControllersWithViews();services.ConfigureFormOptions(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.AddTransientIAmazonS3(sp new AmazonS3Client(s3AccessKey, s3SecretKey, s3Configuration));var mongoConnectionString Configuration[mongo:connectionString];var mongoDatabase Configuration[mongo:database];services.AddTransientIDataAccessObject(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 FileUploadModeldiv classtext-centerh1 classdisplay-4Welcome/h1pLearn about a hrefhttps://docs.microsoft.com/aspnet/corebuilding Web apps with ASP.NET Core/a./pform methodpost enctypemultipart/form-data asp-controllerHome asp-actionIndexdiv classform-groupdiv classcol-md-10pUpload one or more files using this form:/pinput typefile namefile //div/divdiv classform-groupdiv classcol-md-10input typesubmit valueSave //div/div/form
/div
修改HomeControllerpublic class HomeController : Controller
{private readonly ILoggerHomeController _logger;private readonly IDataAccessObject _dao;private readonly IAmazonS3 _s3;public HomeController(ILoggerHomeController logger, IAmazonS3 s3, IDataAccessObject dao) (_logger, _s3, _dao) (logger, s3, dao);public IActionResult Index(){return View();}[HttpPost][ValidateAntiForgeryToken]public async TaskIActionResult 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.AddAsyncSavedFile(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__accessKey、s3__endpoint和s3__secretKey环境变量设置。它们的取值在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中已经介绍过了只是在Endpoint的Host名称上需要加上http://。详细可以参考values.yaml文件。使用Ceph Block Storage部署到Kubernetes的MongoDB会需要使用Ceph Block Storage。在mongodb-deployment.yaml中会指定容器的volumeMountvolumeMounts:
- mountPath: /data/dbname: mongo-data
然后在Volume的定义部分指定使用名为{{ .Release.Name }}-form-file-upload-mongo-data的PersistentVolumeClaimvolumes:
- name: mongo-datapersistentVolumeClaim:claimName: {{ .Release.Name }}-form-file-upload-mongo-data
这里的{{ .Release.Name }}表示HELM的release的名字。接下来在这个PersistentVolumeClaim中mongo-data-persistentvolumeclaim.yaml可以指定所需使用的StorageClassspec:accessModes:- ReadWriteOnceresources:requests:storage: 20GistorageClassName: {{ .Values.mongoStorageClassName }}
在这里storageClassName在values.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?gssapiServiceNamemongodb
Implicit session: session { id : UUID(85f7d362-13d6-41b9-90f9-9de86f711eb0) }
MongoDB server version: 3.6.21
{_id : BinData(3,NyKi5Q5N0O9B1bIddlk/g),Timestamp : ISODate(2020-12-21T11:47:01.853Z),FileName : abc.sldimport
}
可以看到数据记录已经成功保存到MongoDB。源代码和部署脚本一切的一切尽在https://github.com/daxnet/form-file-upload。Enjoy!