使用Ingress在kubernetes上使用s3代理

时间:2018-09-17 16:33:40

标签: amazon-web-services nginx amazon-s3 kubernetes

我正在使用this ingress controller,并且想为某个存储桶设置s3代理。如果我在浏览器中调用网址

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

我希望通过

查看/下载图片
https://s3.eu-central-1.amazonaws.com/mybucket123/pictures/dog.jpg

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

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服务定义中也不能在入口规则中设置此标头(configuration-snippet不起作用,因为它已经在nginx.conf窗格中设置了另一个主机标头。

我的解决方案是将整个位置块都用作该进入规则,并将其包括为server-snippet,这是蛮力的。

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

有人知道如何代理s3吗?

2 个答案:

答案 0 :(得分:1)

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

  

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

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

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

{或者您也可以使用s3fs工具创建自定义代理服务器映像,然后将S3存储桶直接安装到Pod中。有关详细信息,请查看thisthis文章。
UPD:(由于Kubernetes中对FUSE的支持有限,该解决方案仍无法使用-FUSE volumes #7890) 有workaround要求运行特权容器}

有s3fs的两种替代方法:

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

或者,您可以尝试Traefik ingress controller

  • 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 设置。

答案 1 :(得分:0)

如果您需要使用 server-snippet 解决方案。类似于以下内容的内容将向 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 mirror 功能可以帮助调试正在发送的请求。向 Ingress 控制器添加额外的注解,并指定一个可以监控请求的系统。

nginx.ingress.kubernetes.io/mirror-target: "http://my-debug-target/"
相关问题