Search
left arrowBack
Pavel Rykov

Pavel Rykov

July 26, 2023 ・ Code

Migrate PHP (laravel) app to Kubernetes

Introduction

Migrating a PHP (Laravel) application to Kubernetes offers numerous benefits such as scalability, high availability, and self-healing capabilities. In this guide, we will walk you through the process of containerizing your Laravel app using Docker and deploying it to Kubernetes.

Preparing your Laravel app

Before we start, ensure that your Laravel application is ready for containerization. For optimal performance, configure your app to use environment variables for settings like database connections and caching.

.env.example

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mydatabase
DB_USERNAME=myuser
DB_PASSWORD=mypassword

Creating a Dockerfile

To containerize your Laravel app, you will need a Dockerfile. This file describes the environment required to run your application, including the base image, dependencies, and necessary configurations.

Dockerfile

FROM php:8.2-fpm

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    libwebp-dev \
    libonig-dev \
    libzip-dev \
    zip \
    unzip

# Configure GD library
RUN docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp
RUN docker-php-ext-install -j$(nproc) gd

# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl

# Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Set working directory
WORKDIR /var/www

# Copy existing application directory
COPY . .

# Install app dependencies
RUN composer install

# Change ownership of app files
RUN chown -R www-data:www-data /var/www

# Expose port
EXPOSE 9000

CMD ["php-fpm"]

Building and pushing Docker images to the registry

Once you have created the Dockerfile, build the Docker image for your Laravel app.

docker build -t my-registry/my-laravel-app:latest .

Push the image to your container registry (e.g., Docker Hub, Google Container Registry, or AWS Elastic Container Registry).

docker push my-registry/my-laravel-app:latest

Kubernetes manifests

Next, you need to create Kubernetes manifest files. These files describe the desired state of your application and its infrastructure components.

deployment.yml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-laravel-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-laravel-app
  template:
    metadata:
      labels:
        app: my-laravel-app
    spec:
      containers:
      - name: my-laravel-app
        image: my-registry/my-laravel-app:latest
        ports:
        - containerPort: 9000
        envFrom:
        - configMapRef:
            name: my-laravel-app-config

configmap.yml

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-laravel-app-config
data:
  DB_CONNECTION: mysql
  DB_HOST: my-laravel-db-service
  DB_PORT: "3306"
  DB_DATABASE: mydatabase
  DB_USERNAME: myuser
  DB_PASSWORD: mypassword

service.yml

---
apiVersion: v1
kind: Service
metadata:
  name: my-laravel-app-service
spec:
  selector:
    app: my-laravel-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9000
  type: LoadBalancer

Deploying the application to Kubernetes

After creating the necessary manifest files, you can deploy your application to a Kubernetes cluster. First, apply the ConfigMap:

kubectl apply -f configmap.yml

Next, deploy the Laravel app using the Deployment manifest:

kubectl apply -f deployment.yml

Finally, create a LoadBalancer service to expose your application:

kubectl apply -f service.yml

You can now access your Laravel app through the LoadBalancer's external IP address.

Conclusion

In this guide, we demonstrated how to migrate a PHP (Laravel) application to Kubernetes. We covered containerizing the Laravel app using Docker, pushing the Docker image to a registry, creating Kubernetes manifest files, and deploying the application to a Kubernetes cluster. By following these steps, you can harness the power of Kubernetes to manage your Laravel application efficiently and effectively.

  • Code