I ran into the problem of scaling a Laravel application today. It scales well, but this is hampered by the session management plugin that stores data in files. If you do not share sessions between Pods after scaling the browser will show error 419, page expired.
First of all, I needed to create a Redis cluster that would store the sessions. You can do it however you want, I used the redis-operator which I wrote. For best results, I added balancing via haproxy and turned off persistent storage.
$ k get po -l instance=sessions-store NAME READY STATUS RESTARTS AGE sessions-store-haproxy-59b45854f4-48sfp 2/2 Running 0 5h16m sessions-store-redis-0 1/1 Running 0 5h16m sessions-store-redis-1 1/1 Running 0 5h15m sessions-store-redis-2 1/1 Running 0 5h15m sessions-store-sentinel-586f47d744-4kgqx 1/1 Running 0 5h16m sessions-store-sentinel-586f47d744-cfwng 1/1 Running 0 5h16m sessions-store-sentinel-586f47d744-fd254 1/1 Running 0 5h16m
After that, you need to create a connection to the new Redis cluster in
'redis' => [ 'client' => env('REDIS_CLIENT', 'phpredis'), ... 'sessions' => [ 'host' => env('SESSION_REDIS_HOST', '127.0.0.1'), 'password' => env('SESSION_REDIS_PASSWORD', null), 'port' => env('SESSION_REDIS_PORT', 6379), 'database' => 0, ], ],
Now you need to apply a patch that will allow you to take the necessary connection parameters from the ENV in
'driver' => env('SESSION_DRIVER', 'file'), 'connection' => env('SESSION_CONNECTION', null),
Don’t forget about the php library for working with Redis in
RUN apt-get install php7.3-redis
Also you can add additional support to php.ini if some additional non-laravel scripts used:
RUN sed -i 's/session.save_handler = files/session.save_handler = redis/g' /etc/php/7.3/fpm/php.ini RUN sed -i 's/;session.save_path = "\/var\/lib\/php\/sessions"/session.save_path = "tcp:\/\/sessions-store-haproxy:6379"/g' /etc/php/7.3/fpm/php.ini
Now provide all the necessary environment variables to Pod and you can start deploying.
SESSION_DRIVER: redis SESSION_CONNECTION: sessions SESSION_REDIS_HOST: "sessions-store-haproxy" SESSION_REDIS_PASSWORD: "" SESSION_REDIS_PORT: 6379
Login to Laravel and check Redis
Redis operator runs Sentinel and Redis, makes Redis high available with HAProxy.