【问题标题】:s3 proxy on kubernetes using Ingress使用 Ingress 的 Kubernetes 上的 s3 代理
【发布时间】:2019-02-21 15:26:21
【问题描述】:

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

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 pod 中设置后添加另一个 Host 标头。

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

另一个选择是在 ingress 后面有一个 nginx pod+service,负责设置正确的标头。所以流程是 request -> ingress-controller -> nginx -> s3。

有人知道如何代理 s3 吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    s3fs 有两种替代方案:

    • ObjectiveFS - 支持 Amazon S3 和 Google Cloud Storage 后端的商业 FUSE 插件
    • 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 进行设置。

    【讨论】:

    • 谢谢,我已经读过这方面的内容,但设置似乎相当复杂。我想我会在入口控制器后面放置其他东西(nginx 或其他路由服务器)。
    • @GismoRanas 如果你能解决它,你能更新一下你是如何解决这个问题的吗?
    【解决方案2】:

    如果您需要使用server-snippet 解决方案。类似于以下内容的内容将自定义 location 块添加到 Nginx 入口配置。如果您对 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/"
    

    【讨论】:

      猜你喜欢
      • 2019-07-02
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 2022-08-18
      • 2019-07-20
      • 2022-01-10
      相关资源
      最近更新 更多