背景
某程序有讀寫對象存儲文件的業務邏輯,該程序一直正常運行,可正常讀寫對象存儲中的文件。不過,該程序之前訪問的對象存儲產品為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.png
path-style的
訪問格式是這樣的:https://s3.Region.amazonaws.com/bucket-name/keyname
具體訪問url舉例: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
metadata:
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
name: oss-mybucket
namespace: infra
spec:
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
等待約一分鐘,重新測試訪問
curl http://mybucket.mydomain.com/mybucket/test.jpg -o test.jpg
% 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的域名管理中綁定代理的域名。
此方案僅是換一種臨時解決問題的方法,可能不是最佳實踐。