一、對象存儲基礎
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實現,單文件上傳