K8s 进入 DigitalOcean Bucket 中的静态资产

K8s Ingress to Static Assets in DigitalOcean Bucket

我正在尝试使用 Kubernetes 中的 IngressExternalName 服务将流量路由到外部存储服务 (DigitalOcean Spaces) - 但无论我尝试什么,我都会得到某种形式http 错误。

我尝试过的事情:

如何配置 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