一、对象存储基础
1、Amazon S3
Amazon S3(即Amazon Simple Storage Service) 是一种面向 Internet 的存储服务,Amazon还提供了S3 REST API可随时在 Web 上的任何位置存储和检索的任意大小的数据,同时提供Java、Python、Golang等各种语言的的SDK。 而Ceph RGW兼容绝大部分S3 Api,我们先熟悉一下S3服务的一些基本概念。
S3 术语 |
解释 |
AccessKey和SecretKey |
AccessKey用于标识客户端身份; SecretKey作为私钥保存在客户端服务器,不会在网络中传输,通常用于作为计算请求签名的密钥。 使用AccessKey进行身份识别,使用SecretKey进行签名,完成客户端的接入、认证和授权。 |
Object |
Object即对象,Object包含key和data; key为Object的名字,UTF-8编码后不能超过1024个字节; data是Object的数据。 Object的key中可以带有斜杠,自动会在控制台里组织成目录结构。 |
Bucket |
Bucket是S3的存储桶,S3是对象存储服务,Bucket就是存放Object的容器,每个Object必须存放在特定的Bucket中。 在Ceph RGW中每个用户最多创建1000个Bucket,每个Bucket中可以存放无数个Object。 |
Service |
Service即服务,是S3提供给用户的虚拟存储空间,在这个虚拟空间里,一个用户可以拥有多个Bucket。 |
Region |
在创建S3的Bucket时需要选择Region(区域),一般用于标识存储的物理位置,如华东区、华北区。Region的外网域名具体指明该区的外网接入地址。 CEPH OBJECT GATEWAY S3 API FEATURES SUPPORT中给出了RGW和S3 API的兼容列表。 |
ACL |
访问控制权限ACL是对Bucket和Object相关的访问控制策略,支持READ, READ, FULL_CONTROL三种权限,具体内容可以参考Managing Access with ACLs。 |
二、装机镜像流程
1、装机时获取镜像流程
公有和私有镜像地址由后端服务获取镜像列表时返回正确的镜像下载地址,镜像下载地址存储在数据库中。
装机选择镜像公有/私有镜像流程租户或运维人员租户或运维控制台evm-srvDB创建虚机获取公有和用户的私有镜像列表查询公有和用户的私有镜像列表,带完整的镜像下载地址返回列表返回列表返回列表选择其中一个镜像安装使用选择的镜像创建虚机
2、边缘Nginx设置
image-cache服务需要配置Nginx反向代理到EECDN提供的下载URL,Nginx配置文件如下
server { listen 80; server_name image-cache.ecf-cluster.svc; root /home/share;
# 公有和私有镜像下载地址 location ^~/ecx/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Nginx-Proxy true;
proxy_pass <s3url>; }
location / { autoindex on; autoindex_exact_size on; autoindex_localtime on; } } |
三、镜像上传到S3
1、通过手动上传到S3
支持的镜像格式:RAW QCOW2 ISO导出Linux镜像
- qemu-img镜像格式转换工具支持vhd、vmdk、qcow2、raw、vhdx、qcow、vdi或qed社区格式的镜像的相互转换。
- vhd格式镜像在执行命令转换格式时请使用vpc代替,否则可能造成qemu-img工具无法识别镜像格式。
例如,将CentOS 6.9镜像的vhd格式转换为qcow2格式,请执行如下命令:
qemu-img convert -p -f vpc -O qcow2 centos6.9.vhd centos6.9.qcow2
Bucket:名称定为evm, 所有租户共用一个对象桶和相同的AccessKey和SecretKey
Object: Key用目录来区分不同用户,格式:<userId>/镜像文件名称。 比如 /1006/Centos7.qcow2 1006是用户ID
1.1、使用s3 Brower客户端上传
1.2、 使用命令行上传
# 1.安装客户端工具,以下以awscli举例,也可以用s3cmd $ sudo yum -y install python-pip $ sudo pip install --upgrade pip $ sudo pip install awscli --upgrade
# 2.配置AccessKey和SecretKey $ aws configure --profile=ceph AWS Access Key ID [None]: <ceph rgw的AccessKey> AWS Secret Access Key [None]: <ceph rgw的SecretKey> Default region name [None]: Default output format [None]: json
# 3.创建对象桶(bucket) $ aws --profile=ceph --endpoint=<ceph_rgw_host> s3 mb s3://evm $ aws --profile=ceph --endpoint=<ceph_rgw_host> s3 ls
# 4.上传到对象桶(bucket) $ aws --profile=ceph --endpoint=<ceph_rgw_host> s3 cp Ceont7.6.qcow2 s3://evm/ |
2、通过浏览器JS分段上传到S3
要支持多租户的AccessKey和SecretKey,开放租户创建Bucket,支持租户上传任意文件,此时能做到对象存储独立收费是理想情况。
大文件避免传输失败,对于虚机镜像这种,建议都使用分段上传的方法
1、上传流程
1.1 创建Bucket
创建Bucket用户frontobs-srvCeph RGW创建Bucket传递用户的创建Bucket请求使用Golang AWS SDK调用S3 API接口创建Bucket如果第一次创建就先创建AccessKey和SecretKeyokokok
1.2 为上传提供带对象桶并签名的临时URL
前端获取临时上传的URL用户frontobs-srvCeph RGW申请上传对象到Bucket传递申请上传请求使用Golang AWS SDK调用S3 API接口请求Bucket的临时上传URLURL带Bucket信息和签名信息,该URL有效期设置为24小时返回临时URL返回临时URL返回临时URL用户使用临时URL开始上传文件
2、s3分段上传限制
|
规范 |
最大对象大小 |
5 TB |
每次上传的分段的最大数量 |
10000 |
分段编号 |
1 到 10000 (含) |
分段大小 |
5 MB 到 5 GB,上一个分段可以 <5 MB |
列出分段请求返回的分段的最大数量 |
1000 |
在列出分段上传请求中返回的分段的最大数量 |
1000 |
3、分段上传步骤
3.1、发送请求获取初始化预签名url,发送请求post请求到初始化url获取uploadId,初始化分段上传
3.2、根据文件大小、分段大小计算分段数,向后台请求获取所有分段上传的预签名url,js计算分段对象的MD5值,发送put请求进行文件上传,上传完成后取etag值进行MD5校验,如果校验不通过,重新上传。(为保证js可以取到响应头中的etag值,需要设置cors)
3.3、获取完成分段预签名url,所有分段上传完成后,发送post请求完成分段上传,分段上传必须手动发送请求完成或终止,完成上传文件所有分段需包含在请求中。
实现:依赖aws-js-sdk实现,单文件上传