kubernetes ingress代理访问阿里云oss记

本文涉及的产品
对象存储 OSS,OSS 加速器 50 GB 1个月
简介: 对象存储支持virtual-hosted–style和path-style两种访问风格,而阿里云oss只支持virtual-hosted–style风格。使用kubernetes ingress代理阿里云oss并rewrite url后,程序可继续使用path-style访问阿里云oss。代理阿里云oss bucket后,需要在bucket的域名管理中绑定代理的域名。

背景

某程序有读写对象存储文件的业务逻辑,该程序一直正常运行,可正常读写对象存储中的文件。不过,该程序之前访问的对象存储产品为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的域名管理中绑定代理的域名。

此方案仅是换一种临时解决问题的方法,可能不是最佳实践。



相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
8月前
|
存储 人工智能 Cloud Native
阿里云渠道商:OSS与传统存储系统的差异在哪里?
本文对比传统存储与云原生对象存储OSS的架构差异,涵盖性能、成本、扩展性等方面。OSS凭借高持久性、弹性扩容及与云服务深度集成,成为大数据与AI时代的优选方案。
|
10月前
|
存储 运维 安全
阿里云国际站OSS与自建存储的区别
阿里云国际站对象存储OSS提供海量、安全、低成本的云存储解决方案。相比自建存储,OSS具备易用性强、稳定性高、安全性好、成本更低等优势,支持无限扩展、自动冗余、多层防护及丰富增值服务,助力企业高效管理数据。
|
10月前
|
存储 域名解析 前端开发
震惊!不买服务器,还可以用阿里云国际站 OSS 轻松搭建静态网站
在数字化时代,利用阿里云国际站OSS可低成本搭建静态网站。本文详解OSS优势及步骤:创建Bucket、上传文件、配置首页与404页面、绑定域名等,助你快速上线个人或小型业务网站,操作简单,成本低廉,适合初学者与中小企业。
|
9月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
981 3
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
489 10
|
边缘计算 调度 对象存储
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
介绍如何使用ACK Edge与虚拟节点满足DeepSeek部署的弹性需求。
|
Kubernetes 监控 Serverless
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
|
Kubernetes 持续交付 开发工具
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
1046 2
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
512 0
课时5:阿里云容器服务:最原生的集成Docker和云服务

推荐镜像

更多