Оптимизация WordPress сайта установленного в Kubernetes (несколько реплик/копий)?
Всем привет!
Есть WordPress сайт который ранее был просто на виртуальном хостинге, а теперь, с декабря, крутится в контейнере Kubernetes, у которого есть несколько копий/реплик.
Для оптимизации всегда использовали какой-либо плагин, по типу: "LiteSpeed Cache", "WP Fastest Cache" и проч., которые позволяют настроить кэширование, минифицировать CSS, JS, объединить их в один файл, создание оптимизированных копий изображений (/wp-content/), и многое другое.
После того как перешли на k8s столкнулся с проблемой: если через админку плагина почистить кэш, или что-то изменить, то файлы кэша, а также все минифицированные и объединенные файлы создаются/обновляются только на одной из копий/реплик сайта, таким образом, случайных пользователь при каждой загрузки сайта видит то поломанный сайт, то работающий.
Какое есть решение (если нужно продолжить использование нескольких реплик/копий)? Так как я ранее с этим не сталкивался, буду рад любым вариантам/предложениям!
PS
Разрабатывать какое-то полностью кастомное решение для замены всего функционала плагина(ов) - не вариант.
Готовые решения не знаю, варианты на вскидку:
- общий файловый кэш на все поды
- решение например на базе redis который будет источником кэшированных данных
ну т.е. хранение кэша вне подов, в вашем случае способ стандартный, искать какой-то плагин для работы в кубере, в официальных плагинах ворпдпресса.
Извиняюсь, но, похоже, я не совсем понимаю идею.
Redis даст объектный кэш (содержимое основной базы данных), или даже настроить кэш страниц, если например использовать в связке с плагином W3TC, это хорошо.
Но как это использовать для решения описанной проблемы, когда WP плагин автоматически создает файлы где хранит весь JS и CSS код в минифицированном и объединенном виде, файлы которые периодически будут обновляться, например по клику кнопки из админки, но этот файл будет сохранен/обновлен только она одной из реплик в кубере?
sheldon_coop, я далёк от WP и как он работает, по этому это просто общая идея чтоб хранить состояние кэша вне подов, будь то редис, файловый кэш или что либо иное.
Я вижу два варианта
1) простой - вернуться на хостинг на одном сервере линукс. Я не вижу преимуществ в K8S для Wordpress.
2) сложный и ненужный ИМХО - искать документы по правильному деплою в Кубернетисе
Возможно сработает workaround - убрать autoscaling, запускать на одном поде.
sheldon_coop,
Понимаю.
Увы, проблема не решится без помощи тех, кто ответственен за инфраструктуру.
Я бы начал с просьбы запускать на одном инстансе, если не поможет - эскалировать проблему, пускай ломают голову сами.
Проще всего будет определить в какую папку всё это складывается и вынести её в PersistentVolume (PV). Ваш k8s конечно же должен иметь возможность создания PV с типом ReadWriteMany - это когда поды на разных машинах могут подключать к себе один и тот же PV. Проще всего выделить в инфраструктуре NFS сервер и настроить кубер работать с ним.
В результате в манифесте деплоймента будет что-то типа
Запуская веб-приложение в нескольких экземплярах на разных машинах/контейнерах, необходимо позаботиться о том чтобы некоторые его части шарились (share) между всеми экземплярами.
Обычно речь про
- папку загрузок
- сессии пользователя
- кэш
В идеале для всего этого стоит использовать отдельные сервисы, например сессии и кэш можно хранить в memcached или redis, а загрузки хранить не файлами на диске, а в S3.
Но можно делать проще. Те же загрузки - это файлы на диске, значит папку с этими файлами можно расшарить между экземплярами через nfs.
Немного отдельно стоит кэш кода. Это когда приложение может скопилировать шаблоны, минифицировать скрипты, сохранять байткод. Обычно это не шарится между контейнерами, а выполняется при старте контейнера, либо при сборке образа.