我正在使用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吗?
答案 0 :(得分:1)
可能的解决方案之一是使用DaemonSet在每个群集节点上启动Pod,该Pod使用s3fs将S3存储连接到本地目录。
S3FS-FUSE :这是一个免费的开源FUSE插件,并且是易于使用的实用程序,支持主要的Linux发行版和MacOS。 S3FS还负责本地缓存文件以提高性能。 该插件只是将Amazon S3存储桶显示为您的驱动器 系统。
这是一篇很好的文章,为您提供有关如何执行操作的分步说明。
然后,您可以将此目录用作Pod中的卷,例如,用作代理服务器具有静态内容的目录。
{或者您也可以使用s3fs工具创建自定义代理服务器映像,然后将S3存储桶直接安装到Pod中。有关详细信息,请查看this和this文章。
UPD:(由于Kubernetes中对FUSE的支持有限,该解决方案仍无法使用-FUSE volumes #7890)
有workaround要求运行特权容器}
有s3fs的两种替代方法:
或者,您可以尝试Traefik ingress controller:
答案 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/"