雲計算

kubernetes ingress代理訪問阿里雲oss記

背景

某程序有讀寫對象存儲文件的業務邏輯,該程序一直正常運行,可正常讀寫對象存儲中的文件。不過,該程序之前訪問的對象存儲產品為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的域名管理中綁定代理的域名。

此方案僅是換一種臨時解決問題的方法,可能不是最佳實踐。


Leave a Reply

Your email address will not be published. Required fields are marked *