背景
某程式有讀寫對象存儲檔案的業務邏輯,該程式一直正常運作,可正常讀寫對象存儲中的檔案。不過,該程式之前通路的對象存儲産品為AWS的S3、自建的對象存儲minio和Dell EMC的硬體對象存儲叢集。
該程式部署到阿裡雲并且使用阿裡雲對象存儲oss後,發現業務無法通過http方式正常讀取oss中的檔案了。檢查發現,原來對象存儲支援兩種風格的通路,分别是virtual-hosted–style和path-style。
以AWS S3為例,
virtual-hosted–style的
通路格式是這樣的:
https://bucket-name.s3.Region.amazonaws.com/keyname,
具體通路url舉例:
https://my-bucket.s3.us-west-2.amazonaws.com/puppy.pngpath-style的
https://s3.Region.amazonaws.com/bucket-name/keyname
https://s3.us-west-2.amazonaws.com/mybucket/puppy.jpg該程式使用的是path-style,而阿裡雲的對象存儲oss不支援path-style風格,是以原因找到了。
因為修改程式代碼工作量較大,我們所有的程式又都部署在kubernetes叢集中,為了快速解決問題,我們決定使用kubernetes ingress代理阿裡雲oss并進行重定向。
實施
1.先在kubernetes叢集中建立一個代理阿裡雲oss mybucket的service oss-mybucket
apiVersion: v1
kind: Service
metadata:
name: oss-mybucket
namespace: infra
spec:
type: ExternalName
externalName: mybucket.oss-cn-hangzhou.aliyuncs.com
2.建立一個對應的ingress指向建立好的service oss-mybucket
apiVersion: extensions/v1beta1
kind: Ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$2
labels:
app.kubernetes.io/component: oss-mybucket
app.kubernetes.io/instance: oss-mybucket
app.kubernetes.io/name: oss-mybucket
rules:
- host: oss-mybucket.mydomain.com
http:
paths:
- path: /mybucket(/|$)(.*)
pathType: Prefix
backend:
serviceName: oss-mybucket
servicePort: 80
ingress中需要注意的地方:
nginx.ingress.kubernetes.io/rewrite-target: /$2
上面這個配置保證重定向時去掉源通路url中的bucketname
- path: /mybucket(/|$)(.*)
上面這個配置保證使用path-style通路時,根據bucketname進行重定向;如果不是path-style風格,而是bucket中有該目錄,将會出錯
3.配置域名指向ingress(略)
4.測試通路
curl
http://mybucket.mydomain.com/mybucket/test.jpg-o test.jpg
出現報錯
SecondLevelDomainForbidden
The bucket you are attempting to access must be addressed using OSS third level domain.
6093333222AAFC30350BA527
mybucket.oss-cn-hangzhou.aliyuncs.com
需要為oss bucket綁定域名:登陸阿裡雲對象存儲控制台,選擇bucket,如mybucket,進入bucket詳情頁,選擇傳輸管理-域名管理,綁定域名,為bucket綁定一個域名,如
mybucket.mydomain.com等待約一分鐘,重新測試通路
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 203k 100 203k 0 0 682k 0 --:--:-- --:--:-- --:--:-- 682k
通路成功
5.修改程式配置
将程式配置中的oss endpoint位址由oss-cn-hangzhou.aliyuncs.com更改為mybucket.mydomain.com,程式功能恢複,可正常使用http方式讀取oss中的檔案
總結
aws s3對象存儲支援virtual-hosted–style和path-style兩種通路風格,而阿裡雲oss隻支援virtual-hosted–style風格。
使用kubernetes ingress代理阿裡雲oss并rewrite url後,程式可繼續使用path-style通路阿裡雲oss。
代理阿裡雲oss bucket後,需要在bucket的域名管理中綁定代理的域名。
此方案僅是換一種臨時解決問題的方法,可能不是最佳實踐。