【问题标题】:How to specify Proxy Pass in kubernetes如何在 kubernetes 中指定代理通行证
【发布时间】:2019-05-03 16:22:38
【问题描述】:

我的资产在 s3 上,我的服务部署在 kubernetes 上。是否可以在 nginx-ingress 中定义代理传递。我当前的 nginx proxy_pass 资产到 s3,我想在 kubernetes 中复制。

location /assets/ {
          proxy_pass https://s3.ap-south-1.amazonaws.com;
   }

我试过了,但它不起作用

nginx.ingress.kubernetes.io/server-snippet: |
      location /assets/ {
              proxy_pass https://s3.ap-south-1.amazonaws.com/assets/;
      }

【问题讨论】:

    标签: nginx kubernetes nginx-ingress


    【解决方案1】:

    您可以在这里尝试使用 ExternalName 类型的服务:

    kind: Service
    apiVersion: v1
    metadata:
      name: s3-ap-south
    spec:
      type: ExternalName
      externalName: s3.ap-south-1.amazonaws.com
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: s3-ingress
      annotations:
        kubernetes.io/ingress.class: "nginx"
        nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
        nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    spec:
      rules:
      - host: YOUR_HOSTNAME
        http:
          paths:
          - backend:
              serviceName: s3-ap-south
              servicePort: 443
    

    【讨论】:

    • 是的,我知道这会起作用,但问题是为什么 proxy_pass 不起作用?
    • 您实际上可以查看 Nginx-ingress-controller pod 内部生成的 Nginx 配置。我猜你提供的配置 sn-p 包含在已经存在的位置节中。
    • 哦,我明白这意味着已经包含位置哈希优先于我编写的 sn-p。
    • 这意味着我们永远无法在 sn-p 中使用 proxy_pass 因为位置块将始终由 spec.rules.host.paths 引入
    【解决方案2】:

    您可以像在普通 Nginx 中一样在 Ingress 中使用 proxy_pass

    因此,如果您有一些位于 Kubernetes 集群之外的本地或公共 HTTP/HTTPS 服务,并且您想通过 Ingress 提供服务,您只需要:

    kind: Ingress
    apiVersion: extensions/v1beta1
    metadata:
      name: owncloud
      namespace: default
      annotations:
        kubernetes.io/ingress.class: nginx
        ingress.kubernetes.io/ssl-redirect: "true"
        ingress.kubernetes.io/secure-backends: "true"
        ingress.kubernetes.io/force-ssl-redirect: "true"
        nginx.ingress.kubernetes.io/rewrite-target: /
        nginx.ingress.kubernetes.io/server-snippet: |
          location ~ "^/(.*)" {
            proxy_pass http://192.168.250.100:8260;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-Proto https;
          }
    spec:
      rules:
      - host: owncloud.example.com
      tls:
      - hosts:
        - owncloud.example.com
        secretName: owncloud-example-tls
    
    • 如果您不需要 HTTPS,请删除 sslsecureX-Forwarded-Prototls

    • 您可以添加更多位置块,例如~ "^/api/(.*)",使其像普通 Nginx 一样工作

    • 它将保留域名,例如在浏览器的地址栏中,您将拥有原始域名。如果您需要进行完全重定向,请开始尝试删除proxy_set_header Host $host;

    希望对某人有所帮助

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2020-01-09
      相关资源
      最近更新 更多