使用 Ingress 在 kubernetes 上的 s3 代理

Gis*_*nas 6 nginx amazon-s3 amazon-web-services kubernetes

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

https://my-kube-server.org/img/dog.jpg 
Run Code Online (Sandbox Code Playgroud)

我希望看到/下载图像

https://s3.eu-central-1.amazonaws.com/mybucket123/pictures/dog.jpg
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

我的解决方案是获取此入口规则的整个位置块并将其包含为server-snippet,这非常暴力。

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

有人知道如何代理s3吗?

Ste*_* E. 5

如果您需要使用服务器片段解决方案。类似于以下内容将向locationNginx 入口配置添加自定义块。如果您对 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;
      }
Run Code Online (Sandbox Code Playgroud)

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

nginx.ingress.kubernetes.io/mirror-target: "http://my-debug-target/"
Run Code Online (Sandbox Code Playgroud)


VAS*_*VAS 3

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

\n\n
\n

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

\n
\n\n

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

\n\n\n\n

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

\n\n

{ 或者,您可以使用内部 s3fs 工具创建自定义代理服务器映像,并将 S3 存储桶直接安装到 Pod 中。查看这篇文章和这篇文章了解详细信息。
\n UPD:(由于 Kubernetes 中对 FUSE 的支持有限,该解决方案尚无法工作 - FUSE 卷 #7890)\n有一个解决方法,需要运行特权容器}

\n\n

s3fs 有两种替代方案:

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

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

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