使用 Ingress 的 Kubernetes 上的 S3 代理



我正在使用这个入口控制器,并希望为某个存储桶设置一个 s3 代理。如果我在浏览器中调用网址

https://my-kube-server.org/img/dog.jpg 

我希望在以下位置查看/下载图像

https://s3.eu-central-1.amazonaws.com/mybucket123/pictures/dog.jpg

我可以设置重写规则并指向外部服务,如以下示例中所述:

kind: Service
apiVersion: v1
metadata:
name: s3-proxy
spec:
type: ExternalName
externalName: s3.eu-central-1.amazonaws.com
headers:
- host: s3.eu-central-1.amazonaws.com

但是我从 aws 收到错误,因为它需要在标题中包含"Host:s3.eu-central-1.amazonaws.com"。我无法在 s3-proxy 服务定义和入口规则中设置此标头(配置片段不起作用,因为它将在 nginx.conf pod 中设置后添加另一个 Host 标头。

我的解决方案是获取此入口规则的整个位置块,并将其作为服务器片段包含在内,这是非常蛮力的。

另一种选择是在入口后面有一个nginx pod+服务,负责设置正确的标头。因此,流将是请求 ->入口控制器 -> nginx -> s3。

有人知道如何代理s3吗?

如果您需要使用服务器代码段解决方案。类似于以下内容的内容将向 Nginx 入口配置添加自定义location块。如果您对 Nginx 入口有其他自定义要求,这将特别有用。

metadata:
annotations:
<other annotations>
nginx.ingress.kubernetes.io/server-snippet: |
location "/img/" {
proxy_pass http://s3.eu-central-1.amazonaws.com/mybucket123/pictures/;
proxy_set_header Host s3.eu-central-1.amazonaws.com;
}

此外,如果您要反向代理到提供有限日志记录的终端节点 (AWS S3(。Nginx 镜像功能可以帮助调试正在发送的请求。向入口控制器添加其他注释,并指定可在其中监视请求的系统。

nginx.ingress.kubernetes.io/mirror-target: "http://my-debug-target/"

可能的解决方案之一是使用 DaemonSet 在每个集群节点上启动 Pod,该守护程序使用 s3fs 将 S3 存储连接到本地目录。

S3FS-FUSE:这是一个免费的开源FUSE插件,也是一个易于使用的实用程序,支持主要的Linux发行版和MacOS。 S3FS 还负责在本地缓存文件以提高性能。 此插件仅将 Amazon S3 存储桶显示为您 系统。

这是一篇很好的文章,为您提供了有关如何执行此操作的分步说明。

  • 与 S3 后端共享存储的 Kubernetes

然后,您可以将此目录用作 Pod 中的卷,例如,作为代理服务器的静态内容的目录。

{ 或者,您可以使用 s3fs 工具创建自定义代理服务器映像,并将 S3 存储桶直接挂载到 Pod 中。 有关详细信息,请查看此文章和本文。
UPD:(由于 Kubernetes 中对 FUSE 的支持有限,此解决方案尚不起作用 - FUSE 卷 #7890( 有一种解决方法需要运行特权容器 }

s3fs 有两种替代方法:

  • ObjectiveFS - 支持Amazon S3和Google Cloud Storage后端的商业FUSE插件
  • RioFs - 使用 C 语言编写的轻量级实用程序。不支持追加到文件,不支持完全兼容 POSIX 的文件系统接口,并且无法重命名文件夹。

或者,您可以尝试Traefik 入口控制器

  • traefik.ingress.kubernetes.io/redirect-regex: ^http://localhost/(.*(- 重定向到该前端的另一个 URL。必须使用traefik.ingress.kubernetes.io/redirect-replacement进行设置。
  • traefik.ingress.kubernetes.io/redirect-replacement:http://mydomain/$1- 重定向到该前端的另一个 URL。必须使用traefik.ingress.kubernetes.io/redirect-regex进行设置。

最新更新