【问题标题】:service in kubernetes does not pass through all the headersKubernetes 中的服务不会通过所有标头
【发布时间】:2020-02-05 17:56:36
【问题描述】:

我在公开班有以下服务

apiVersion: v1
kind: Service
metadata:
  annotations:
    getambassador.io/config: |
      ---
      apiVersion: ambassador/v1
      kind: Mapping
      name: _api_minio
      service: "http://minio-svc:9000"
      prefix: /api/minio/
      rewrite: /
      bypass_auth: true
      host: xxxx
      add_response_headers:
        Strict-Transport-Security: max-age=15552000; includeSubDomains
        X-Frame-Options: SAMEORIGIN
  creationTimestamp: '2020-01-09T15:10:34Z'
  labels:
    platform: xxx
  name: minio
  namespace: xxx
  resourceVersion: 'xxxxx'
  selfLink: /api/v1/namespaces/services/minio
  uid: 2f7619a0-32f2-11ea-9dcc-xxxxxxxx
spec:
  clusterIP:xxxxx
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

所以这是一项服务,它将外部请求代理到我们的对象存储的内部 minio,但是一旦我尝试访问我得到的对象的 url:

The request signature we calculated does not match the signature you provided. Check your key and signing method.

上面的服务似乎没有通过浏览器发送的所有标头。 谁能阐明我如何将所有进入服务的标头传递给内部服务,在这种情况下是 minio?

【问题讨论】:

  • 您使用的是大使吗?也许大使没有传递标题。
  • @ArghyaSadhu 是的,我正在使用大使,所以我怎样才能让大使传递标题?我对大使知之甚少

标签: kubernetes kubernetes-helm kubernetes-ingress kubernetes-pod kubernetes-service


【解决方案1】:

在最基本的配置中,Ambassador 路由基于请求的传入prefix。目前,您已将 Ambassador 配置为将带有 prefix: /api/minio/ 的请求通过端口 9000prefix: / 路由到名为 minio-svc 的服务。

使用此配置,对http(s)://{{IP}}/api/minio/ 的请求将正确命中minio-svc,并将前缀重写为/。但是,如果您检查网络日志,您会看到当 minio 收到带有 prefix: / 的请求时,它会发出 307 重定向到 /minio/,这不是 Ambassador 中的注册路由,这就是您看到失败的原因。

解决此问题的方法是编辑您的 Mapping 以基于 prefix: /minio/ 进行路由,并且在向下游发送请求时不重写该前缀:

apiVersion: v1
kind: Service
metadata:
  annotations:
    getambassador.io/config: |
      ---
      apiVersion: ambassador/v1
      kind: Mapping
      name: _api_minio
      service: "http://minio-svc:9000"
      prefix: /minio/
      rewrite: ""
      bypass_auth: true
      host: xxxx
      add_response_headers:
        Strict-Transport-Security: max-age=15552000; includeSubDomains
        X-Frame-Options: SAMEORIGIN
  creationTimestamp: '2020-01-09T15:10:34Z'
  labels:
    platform: xxx
  name: minio
  namespace: xxx
  resourceVersion: 'xxxxx'
  selfLink: /api/v1/namespaces/services/minio
  uid: 2f7619a0-32f2-11ea-9dcc-xxxxxxxx
spec:
  clusterIP:xxxxx
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
  sessionAffinity: None
  type: ClusterIP

现在对http(s)://{{IP}}/minio/ 的请求将被发送到端口9000 上的minio-svc 服务,prefix: /minio/ 应该可以解决。

在反向代理后面调试这类较大的 GUI 应用程序时,检查浏览器的网络日志以查看是否有资源请求失败是非常有用的。

【讨论】:

  • 感谢您的回答。现在我获得了对这个存储桶的所有访问权限已被禁用我不确定它是否更好。我确定存储桶存在,因为通过直接路由我可以下载对象
  • 这是另一个类似的情况,当我使用 ambasador 创建存储桶时:无法创建名称为 test-bucket-new-b3-hamed 的存储桶并出现错误:AllAccessDisabled - 对此存储桶的所有访问权限已被禁用。在 us-east-1 { 代码:400,响应:'无法创建名为 test-bucket-new-b3-hamed 的存储桶,错误:AllAccessDisabled - 已禁用对此存储桶的所有访问。在 us-east-1' }
【解决方案2】:

大使不应该从请求中删除任何标头,所以我怀疑这是问题所在。您可以通过创建一个 Mapping 来测试这一点,该 Mapping 仅指向一个服务,该服务回显它正在接收的标头。下面可以使用 httpbin.org 完成此操作

---
apiVersion: getambassador.io/v1
kind: Mapping
metadata:
  name: httpbin
spec:
  prefix: /httpbin/
  service: httpbin.org

现在向http(s)://{{LOAD_BALANCER_IP}}/httpbin/headers 发送一个请求,它会使用从请求中收到的所有标头进行响应。您应该会看到您发送的每个标头以及更多标头。

如果不了解您正在访问的服务和预期的标头的更多信息,很难准确地说出这里出了什么问题,因此我将首先验证是否存在标头被丢弃的问题。

【讨论】:

  • 但是当我使用直接路由而不使用大使时,一切正常
  • 如果我复制并粘贴您发布的代码,我可以检查标题吗?在 httpbin.org 中?
  • 对不起,我今天真的有时间看这个。问题在于您的Mapping。你有你的代理路由流量到minio prefix: /api/minio。然而,Minio 正在发送带有前缀 /minio/ 的后续请求,这意味着,虽然第一个请求正常,但 minio 发送的所有额外资源请求都失败了,因为与代理中的路由不匹配。尝试将您的Mapping 更改为prefix: /minio/rewrite: "",您的代理正在使用prefix: /minio/ 路由请求。也会将此作为格式化的答案发布
猜你喜欢
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 2021-02-17
  • 2020-05-14
相关资源
最近更新 更多