K8s 进入 DigitalOcean Bucket 中的静态资产
K8s Ingress to Static Assets in DigitalOcean Bucket
我正在尝试使用 Kubernetes 中的 Ingress
和 ExternalName
服务将流量路由到外部存储服务 (DigitalOcean Spaces) - 但无论我尝试什么,我都会得到某种形式http 错误。
我尝试过的事情:
- https://github.com/kubernetes/ingress-nginx/pull/629#issue-116679227(错误:404 未找到,nginx)
- https://github.com/kubernetes/ingress-nginx/issues/1809(错误:502 错误网关,nginx)
- 相当多的其他修补工作已被时间遗忘。
如何配置 K8s Ingress/Service 以将入口请求从 example.com/static
定向到存储桶(例如 <zone>.digitaloceanspaces.com/<bucket-name>/<path>/<object>
)?
看来我能找到的一些资源已经过时了。以下解决方案适用于 Kubernetes v1.21.4。
重要提示:
- 所有
Ingress
注释都是 必需的 :
kubernetes.io/ingress.class: nginx
- 需要使用 Nginx 入口控制器。
nginx.ingress.kubernetes.io/backend-protocol: HTTPS
- 维护 HTTPS 服务流量所必需的 (this replaces /secure-backends
in older versions)。
nginx.ingress.kubernetes.io/upstream-vhost
- 必须匹配服务 externalName
,从请求路径中删除主机名(例如,如果缺少主机名并通过本地主机进行测试,可能会遇到错误:“没有这样的存储桶:本地主机”) .
nginx.ingress.kubernetes.io/rewrite-target
- 将匹配的资产 URL 路径传递给服务。
- Ingress 定义中的
path.service.port.number
必须匹配 ExternalName
服务期望的任何端口(在我们的 HTTPS 流量中为 443)。
apiVersion: v1
kind: Service
metadata:
name: do-bucket-service
spec:
type: ExternalName
externalName: <zone>.digitaloceanspaces.com
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: do-bucket-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/backend-protocol: HTTPS
nginx.ingress.kubernetes.io/rewrite-target: /<bucket>/
nginx.ingress.kubernetes.io/upstream-vhost: <zone>.digitaloceanspaces.com
spec:
rules:
- http:
paths:
- path: /path/to/static/assets(/|$)(.*)
pathType: Prefix
backend:
service:
name: do-bucket-service
port:
number: 443
我正在尝试使用 Kubernetes 中的 Ingress
和 ExternalName
服务将流量路由到外部存储服务 (DigitalOcean Spaces) - 但无论我尝试什么,我都会得到某种形式http 错误。
我尝试过的事情:
- https://github.com/kubernetes/ingress-nginx/pull/629#issue-116679227(错误:404 未找到,nginx)
- https://github.com/kubernetes/ingress-nginx/issues/1809(错误:502 错误网关,nginx)
- 相当多的其他修补工作已被时间遗忘。
如何配置 K8s Ingress/Service 以将入口请求从 example.com/static
定向到存储桶(例如 <zone>.digitaloceanspaces.com/<bucket-name>/<path>/<object>
)?
看来我能找到的一些资源已经过时了。以下解决方案适用于 Kubernetes v1.21.4。
重要提示:
- 所有
Ingress
注释都是 必需的 :kubernetes.io/ingress.class: nginx
- 需要使用 Nginx 入口控制器。nginx.ingress.kubernetes.io/backend-protocol: HTTPS
- 维护 HTTPS 服务流量所必需的 (this replaces/secure-backends
in older versions)。nginx.ingress.kubernetes.io/upstream-vhost
- 必须匹配服务externalName
,从请求路径中删除主机名(例如,如果缺少主机名并通过本地主机进行测试,可能会遇到错误:“没有这样的存储桶:本地主机”) .nginx.ingress.kubernetes.io/rewrite-target
- 将匹配的资产 URL 路径传递给服务。
- Ingress 定义中的
path.service.port.number
必须匹配ExternalName
服务期望的任何端口(在我们的 HTTPS 流量中为 443)。
apiVersion: v1
kind: Service
metadata:
name: do-bucket-service
spec:
type: ExternalName
externalName: <zone>.digitaloceanspaces.com
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: do-bucket-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/backend-protocol: HTTPS
nginx.ingress.kubernetes.io/rewrite-target: /<bucket>/
nginx.ingress.kubernetes.io/upstream-vhost: <zone>.digitaloceanspaces.com
spec:
rules:
- http:
paths:
- path: /path/to/static/assets(/|$)(.*)
pathType: Prefix
backend:
service:
name: do-bucket-service
port:
number: 443