Невозможно использовать 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