天天看點

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/key

name,

具體通路url舉例:

https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png

path-style的

https://s3.Region.amazonaws.com/bucket-name/key

name

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的域名管理中綁定代理的域名。

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

繼續閱讀