How to Deploy WordPress in AWS EKS?

Sujit Patel
3 min readJul 16, 2022

--

WordPress is a free, open-source platform for building websites.
Technically speaking, WordPress is a PHP-based MySQL database-based content management system (CMS).
WordPress is the simplest and most effective blogging and website builder available today, in non-geek terms.

By deploying WordPress in Kubernetes you can build a reliable and scalable website platform.

Deploy WordPress in AWS EKS

Steps:

  1. Create efs filesystem
  2. Create Storageclass
  3. Create PersistentVolume and PersistentVolumeClaim
  4. Create ConfigMap for WordPress
  5. Create Secret for MySQL and WordPress
  6. Create Deployment for WordPress and MySQL

Create efs filesystem

Login to AWS console and go to efs. click Create file system. give it a name for example wordpress select same VPC as your EKS and click create.

similarly create another efs file system for MySql.

After creating efs file system go to Network and check subnets they should be same as your EKS. if not remove existing and add your subnet.

and note the File system ID.

Create Storageclass

To use efs file system we need to first create StorageClass.

create StorageClass file with following code.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: efs-filesystem
provisioner: efs.csi.aws.com
reclaimPolicy: Delete
volumeBindingMode: Immediate

And then run:

kubectl apply -f efs-storageclass.yml

Create PersistentVolume and PersistentVolumeClaim

Now we first create PersistentVolume for MySql and wordpress.

apiVersion: v1
kind: PersistentVolume
metadata:
name: wordpress-efs-pv
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: efs-filesystem
csi:
driver: efs.csi.aws.com
volumeHandle: <your-wordpress-efs-file-system-id>
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-efs-pv
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: efs-filesystem
csi:
driver: efs.csi.aws.com
volumeHandle: <your-mysql-efs-file-system-id>

And then run:

kubectl apply -f persistent-volume.yml

Now we create PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wordpress-efs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: efs-filesystem
---apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-efs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: efs-filesystem

And then run:

kubectl apply -f persistent-volume-claim.yml

Create ConfigMap for WordPress

we’ll create ConfigMap for wordpress to update PHP settings.

apiVersion: v1
kind: ConfigMap
metadata:
name: wordpress-efs-php-config
namespace: wordpress
data:
uploads.ini: |-
file_uploads = On
upload_max_filesize = 5048M
post_max_size = 5048M
max_execution_time = 600

And then run:

kubectl apply -f wp-configmap.yml

Create Secret for MySQL and WordPress

Now we’ll create Secret file for MySQL and WordPress to store password.

In Kubernetes each item in a secret must be base64 encoded. To encode use below command.

echo -n 'storagpassword' | base64

you’ll get the encoded password: c3RvcmFncGFzc3dvcmQ=

apiVersion: v1
kind: Secret
metadata:
name: mysql-password
type: Opaque
data:
password: c3RvcmFncGFzc3dvcmQ=

And then run:

kubectl apply -f secret.yml

Create Deployment for WordPress and MySQL

We’ll first deploy MySQL and then we deploy WordPress

Create MySQL deployment file.

apiVersion: v1
kind: Service
metadata:
labels:
name: wordpress-mysql
name: wordpress-mysql
spec:
ports:
- port: 3306
selector:
name: wordpress-mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
name: wordpress-mysql
name: wordpress-mysql
spec:
replicas: 1
selector:
matchLabels:
name: wordpress-mysql
template:
metadata:
labels:
name: wordpress-mysql
spec:
containers:
- name: wordpress-mysql
image: mysql:8.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
name: wordpress-mysql
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-efs-volume
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-password
volumes:
- name: "mysql-efs-volume"
persistentVolumeClaim:
claimName: mysql-efs-pvc

And then run:

kubectl apply -f mysql-deployment.yml

Now we create deployment file for wordpress.

apiVersion: v1
kind: Service
metadata:
labels:
name: wordpress-efs
name: wordpress-efs
spec:
ports:
- port: 80
selector:
name: wordpress-efs
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
name: wordpress-efs
name: wordpress-efs
spec:
replicas: 2
selector:
matchLabels:
name: wordpress-efs
template:
metadata:
labels:
name: wordpress-efs
spec:
containers:
- name: wordpress
image: wordpress:6.0.0-apache
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: wordpress-efs
volumeMounts:
- mountPath: /var/www/html
name: wordpress-efs-volume
- mountPath: /usr/local/etc/php/conf.d/uploads.ini
name: php-config
subPath: uploads.ini
env:
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-password
- name: WORDPRESS_DB_USER
value: "admin"
- name: WORDPRESS_DB_HOST
value: "wordpress-mysql"
volumes:
- name: "wordpress-efs-volume"
persistentVolumeClaim:
claimName: wordpress-efs-pvc
- name: php-config
configMap:
name: "wordpress-efs-php-config"

And then run:

kubectl apply -f wordpress-deployment.yml

To get the public url run below command.

kubectl get svc

Copy the EXTERNAL-IP and open it in your browser.

--

--

Sujit Patel
Sujit Patel

Written by Sujit Patel

DevOps Engineer, Linux lover, Technology and Automation enthusiast. A strong believer in continuous learning.

Responses (1)