How to Deploy WordPress in AWS EKS?
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.
Steps:
- Create efs filesystem
- Create Storageclass
- Create PersistentVolume and PersistentVolumeClaim
- Create ConfigMap for WordPress
- Create Secret for MySQL and WordPress
- 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.