Невозможно использовать Google Cloud CDN кеш с входным контроллером, заголовком Transfer-Encoding

Я пытаюсь настроить Google Cloud CDN для моего проекта контейнерного движка.

Следуя документации, он имеет либо заголовок Content-Length, либо заголовок Transfer-Encoding для кэширования.

Мой бэкэнд использует сжатие gzip, поэтому у меня есть Transfer-Encoding: chunked

Проблема в том, что балансировщик нагрузки на входе удаляет заголовок Transfer-encoding, поэтому у меня не может быть "попадания в кэш"

Я использовал "kubectl port-forward" для подключения direclty к бэкэнду экземпляра, и у меня есть заголовок Transfer-encoding.

Но когда я подключаюсь к внешнему IP, заголовок исчезает.

Здесь моя входная конфигурация

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gateway-preprod3-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: gateway-preprod2-static-ip
spec:
  tls:
  - secretName: gateway-preprod-secret-2018-with-ca-7
  backend:
    serviceName: gateway-preprod
    servicePort: 80

Здесь моя конфигурация развертывания

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: gateway-preprod
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
  minReadySeconds: 50
  template:
    metadata:
      labels:
        app: gateway-preprod
    spec:
      containers:
      - name: gateway-preprod
        image: eu.gcr.io/writecontrol-1055/gateway:v305
        env:
        - name: writecontrolEnv
          value: preprod
        ports:
        - containerPort: 80

Напротив, для определенных ресурсов, не сжатых GZIP, дается заголовок Content-length, и у меня есть успешное "попадание в кэш"

Версия kubernetes является 1.7.12-gke.1

Вот URL, чтобы проверить это: https://preprod-writecontrol.ovh/

1 ответ

Я не уверен, почему ваш ответ Transfer-Encoding заголовок. Этот заголовок не предназначен для источника (вашего приложения) и обычно добавляется другими переходами, такими как прокси, такие как Cloud HTTP Load Balancer (=Ingress).

Больше информации о Transfer-Encoding здесь: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding


Я смог заставить CDN работать с ответом GZIP самостоятельно, используя Content-Encoding заголовок вместо:

Сначала прочтите требования к кешированию на https://cloud.google.com/cdn/docs/caching. Тебе необходимо Content-Length и / или Cache-Control: public заголовок. Так что кодируйте эти заголовки на свой сервер приложений.

После включения CDN на балансировщике нагрузки, созданном Ingress, сделайте два запроса, и если вы видите Age заголовок для второго запроса (как я сделал ниже), это означает, что ваш запрос в настоящее время обслуживается из CDN.

curl -vH Accept-Encoding:gzip 35.186.195.233
> [...]
>
< HTTP/1.1 200 OK
< Content-Encoding: gzip
< Date: Tue, 27 Mar 2018 19:38:20 GMT
< Content-Length: 87
< Content-Type: application/x-gzip
< Via: 1.1 google
< Cache-Control: max-age=600,public

��H����Q(�/�IQ�
* Connection #0 to host 35.186.195.233 left intact
K-*��ϳR0�3�3���/.�K�M�R�)+OM�55575��L�4ѭ�N+L���K��4A

И второй запрос (обратите внимание на Age заголовок):

$ curl -vH Accept-Encoding:gzip 35.186.195.233
[...]
>
< HTTP/1.1 200 OK
< Cache-Control: max-age=600,public
< Content-Encoding: gzip
< Date: Tue, 27 Mar 2018 19:42:01 GMT
< Content-Length: 87
< Content-Type: application/x-gzip
< Via: 1.1 google
< Age: 314
<
��H����Q(�/�IQ�
* Connection #0 to host 35.186.195.233 left intact
K-*��ϳR0�3�3���/.�K�M�R�)+OM�55575��L�4ѭ�N+L���K��4A