сервис в kubernetes не проходит через все заголовки

У меня есть следующая служба в открытую смену

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: {}

Итак, это служба, которая проксирует внешний запрос на внутренний минио, который является нашим хранилищем объектов, но как только я пытаюсь получить URL-адрес объекта, я получаю:

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

кажется, что вышеуказанная служба не проходит через все заголовки, отправленные из браузера. Может ли кто-нибудь пролить свет на то, как я могу передать все заголовки, поступающие в службу, на внутреннюю службу, которая в данном случае является minio?


comment
Вы используете амбассадор? Возможно, посол не передает заголовок.   -  person Arghya Sadhu    schedule 05.02.2020
comment
@ArghyaSadhu Да, я использую послов, так как я могу заставить послов передавать заголовки? Я очень мало знаю о послах   -  person Learner    schedule 05.02.2020


Ответы (2)


В самой базовой конфигурации Ambassador маршрутизируется на основе входящего prefix запроса. В настоящее время у вас есть представитель, настроенный для маршрутизации запросов с prefix: /api/minio/ в службу с именем minio-svc через порт 9000 с prefix: /.

С этой конфигурацией запрос к 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/ будет отправлен службе minio-svc на порт 9000 с prefix: /minio/, который должен разрешиться.

При отладке таких больших приложений с графическим интерфейсом за обратным прокси-сервером очень полезно проверить сетевые журналы вашего браузера, чтобы увидеть, есть ли запросы ресурсов, которые не выполняются.

person Noah Krause    schedule 06.02.2020
comment
Спасибо за ответ. Теперь я получаю, что весь доступ к этому ведру отключен. Я не уверен, что это лучше. Я уверен, что ведро существует, потому что с прямым маршрутом к нему я могу загрузить объект - person Learner; 06.02.2020
comment
Вот еще один похожий случай, когда я использую ambasador для создания корзины: Невозможно создать корзину с именем test-bucket-new-b3-hamed с ошибкой: AllAccessDisabled — весь доступ к этой корзине отключен. in us-east-1 {код: 400, ответ: «Невозможно создать сегмент с именем test-bucket-new-b3-hamed с ошибкой: AllAccessDisabled — весь доступ к этому сегменту отключен. в сша-восток-1' } - person Learner; 06.02.2020

Посол не должен удалять какие-либо заголовки из запроса, поэтому я сомневаюсь, что проблема в этом. Вы можете проверить это, создав 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, и он ответит всеми заголовками, которые он получил от запроса. Вы должны увидеть все отправленные вами заголовки плюс еще пару.

Не зная больше о службе, к которой вы обращаетесь, и ожидаемых заголовках, трудно точно сказать, что здесь происходит не так, поэтому я бы начал с проверки того, что это проблема с отбрасыванием заголовков.

person Noah Krause    schedule 05.02.2020
comment
Но когда я использую прямой маршрут без использования ambasador, все работает - person Learner; 05.02.2020
comment
Итак, если я скопирую и вставлю код, который вы разместили, смогу ли я проверить заголовки? на httpbin.org? - person Learner; 06.02.2020
comment
Извините, у меня действительно было время, чтобы посмотреть на это сегодня. Проблема связана с вашим Mapping. У вас есть прокси-сервер, направляющий трафик на minio с помощью prefix: /api/minio. Minio, однако, отправляет последующие запросы с префиксом /minio/, что означает, что, хотя первый запрос проходит нормально, все запросы дополнительных ресурсов, которые отправляет minio, терпят неудачу, поскольку не соответствуют маршруту в вашем прокси. Попробуйте изменить Mapping, чтобы prefix: /minio/ и rewrite: "" ваш прокси-сервер перенаправлял запросы с prefix: /minio/. Опубликую это как ответ на форматирование - person Noah Krause; 06.02.2020