
In today’s article, we will review the step-by-step process involved with a Kubernetes cluster install on Ubuntu server version 20.04. However, this procedure will work
 
															In this guide, we’ll walk you through the process of deploying WordPress on Kubernetes, leveraging its benefits to ensure your website runs smoothly and efficiently.
In the fast-paced realm of website management, the quest for a scalable, reliable, and efficient platform is never-ending. Enter Kubernetes – the revolutionary container orchestration tool that has transformed the way we deploy, manage, and scale applications in modern IT environments.
Kubernetes, often abbreviated as K8s, is an open-source container orchestration platform originally developed by Google and now maintained by the Cloud Native Computing Foundation (CNCF). At its core, Kubernetes automates the deployment, scaling, and management of containerized applications, providing a unified platform for orchestrating workloads across a cluster of machines.
We configured our kubernetes cluster with the following settings:
| master node | master.localdomain | 
| No. of worker nodes | 3 (wk1.localdomain, wk2.localdomain, wk3.localdomain) | 
| RAM | 4 GB | 
| Cores | 2 | 
| Docker Version | Docker version 25.0.1, build 29cf629 | 
| Kubectl Version | { “clientVersion”: { “major”: “1”, “minor”: “29”, “gitVersion”: “v1.29.1”, “gitCommit”: “bc401b91f2782410b3fb3f9acf43a995c4de90d2”, “gitTreeState”: “clean”, “buildDate”: “2024-01-17T15:51:03Z”, “goVersion”: “go1.21.6”, “compiler”: “gc”, “platform”: “linux/amd64” }, “kustomizeVersion”: “v5.0.4-0.20230601165947-6ce0bf390ce3” } | 
| Kubernetes Version | v1.28.3 | 
| Operating System (OS) Images | Debian GNU/Linux 11 (bullseye) | 
Imagine Kubernetes as the conductor of a symphony orchestra, meticulously coordinating each instrument to create a harmonious melody. Similarly, Kubernetes orchestrates the various components of your WordPress application – from the web server to the database – ensuring they work in concert to deliver a seamless user experience.
At its essence, Kubernetes abstracts away the complexities of infrastructure management, allowing you to focus on what truly matters – building and maintaining your WordPress website. Whether you’re a seasoned developer or a novice user, Kubernetes offers a level playing field for deploying WordPress applications, democratizing access to enterprise-grade infrastructure capabilities.
Now, let’s delve into the nitty-gritty of deploying WordPress on Kubernetes and unleash the power of cloud-native hosting for your website.
Before deploying WordPress, you need to have a Kubernetes cluster up and running. You can choose from various Kubernetes distributions like Minikube for local development or managed services like Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS), or Azure Kubernetes Service (AKS) for production environments.
				
					[admin@master wordpress-deployment]$ cat <./kustomization.yaml
secretGenerator:
- name: mysql-pass
  literals:
  - password=YOUR_PASSWORD
EOF  
				
			
		WordPress relies on a database to store its content and configuration. We’ll start by deploying a MySQL database on Kubernetes. Below is an example YAML manifest for deploying MySQL:
				
					apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:8.0
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        - name: MYSQL_DATABASE
          value: wordpress
        - name: MYSQL_USER
          value: wordpress
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim
 
				
			
		This deployment is setting up a MySQL database for a WordPress application in a Kubernetes cluster. It consists of three main components: a Service, a PersistentVolumeClaim, and a Deployment.
The Service wordpress-mysql exposes port 3306 for MySQL communication and selects pods with the labels app: wordpress and tier: mysql. The PersistentVolumeClaim mysql-pv-claim requests 5Gi of storage with ReadWriteOnce access mode to store MySQL data persistently.
The Deployment wordpress-mysql ensures the desired state of the MySQL pods, pulling the mysql:8.0 image, setting environment variables for database configuration, and mounting persistent storage for data storage at /var/lib/mysql.
Copy and paste the contents above to a file called mysql.yaml (or your preferred name).
With the MySQL database running, we can now deploy WordPress. Below is an example YAML manifest for deploying WordPress with NGINX Ingress:
				
					apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:6.2.1-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        - name: WORDPRESS_DB_USER
          value: wordpress
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim
 
				
			
		This deployment is setting up a WordPress application in a Kubernetes cluster. It consists of three main components: a Service, a PersistentVolumeClaim (PVC), and a Deployment.
The Service named “wordpress” exposes port 80 for external access and selects pods with the labels app: wordpress and tier: frontend. The PVC named “wp-pv-claim” requests 5Gi of storage with ReadWriteOnce access mode to persistently store WordPress data.
The Deployment named “wordpress” ensures the desired state of the WordPress pods, pulling the wordpress:6.2.1-apache image, setting environment variables for database configuration, and mounting persistent storage for data storage at /var/www/html.
Copy and paste the contents above to a file called wordpress.yaml (or your preferred name).
Once you’ve created the MySQL and WordPress YAML files, along with the kustomization file, your working directory should resemble the following (below):
				
					[admin@master wordpress-deployment]$ ls -lh
total 12K
-rw-r--r--. 1 admin admin   74 Feb  3 17:40 kustomization.yaml
-rw-r--r--. 1 admin admin 1.5K Feb  3 17:43 mysql.yaml
-rw-r--r--. 1 admin admin 1.4K Feb  3 17:43 wordpress.yaml
 
				
			
		Now copy and paste the following (below) to your command-line to add the resource entries to the kustomization file.
				
					[admin@master wordpress-deployment]$ cat <>./kustomization.yaml
resources:
  - mysql.yaml
  - wordpress.yaml
EOF  
				
			
		The contents of the kustomization.yaml file should resemble what is displayed below:
				
					[admin@master wordpress-deployment]$ cat kustomization.yaml
secretGenerator:
- name: mysql-pass
  literals:
  - password=YOUR_PASSWORD
resources:
  - mysql.yaml
  - wordpress.yaml
 
				
			
		Now let’s deploy the kustomization.yaml with the following command:
				
					$ kubectl apply -k ./ 
				
			
		
				
					secret/mysql-pass-df44tkf8t9 created
service/wordpress created
service/wordpress-mysql created
persistentvolumeclaim/mysql-pv-claim created
persistentvolumeclaim/wp-pv-claim created
deployment.apps/wordpress created
deployment.apps/wordpress-mysql created 
				
			
		Check the running status of the pods with the following command:
				
					$ kubectl get pods 
				
			
		
				
					NAME                               READY   STATUS              RESTARTS   AGE
wordpress-cd74ffcf-2gz2v           0/1     ContainerCreating   0          2m25s
wordpress-mysql-86f59dbdd7-h6tmx   1/1     Running             0          2m25s 
				
			
		Check and verify the status of the PVCs using this command. As you can see (below), the persistent volumes are bound and dynamically provisioned.
				
					$ kubectl get pvc
 
				
			
		
				
					NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pv-claim   Bound    pvc-06040cc7-20e9-49c6-8940-d7657fb303a7   5Gi        RWO            standard       3m50s
wp-pv-claim      Bound    pvc-6087efab-efab-492a-b46e-d9c6e249bf10   5Gi        RWO            standard       3m50s
 
				
			
		In addition, check the status of the secret to ensure it was generated successfully (as shown below):
				
					$ kubectl get secret
NAME                    TYPE     DATA   AGE
mysql-pass-df44tkf8t9   Opaque   1      13m 
				
			
		Check the status of the wordpress service:
				
					$ kubectl get services wordpress
 
				
			
		
				
					NAME        TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)        AGE
wordpress   LoadBalancer   10.128.80.159   139.144.240.166   80:31552/TCP   5m13s
 
				
			
		The wordpress service is running and provides information (EXTERNAL-IP address: 139.144.240.166) we will need to view our website. Simply enter the URL http://<your-external-IP> to launch the WordPress installation page.
Rest assured that if you encounter pending instances, there’s no cause for alarm. It’s normal for all components to take a few minutes to become operational. Feel free to take a break, enjoy a coffee, or grab a quick snack, and return shortly.
However, if your deployments remain pending for more than 15-20 minutes, it’s advisable to consider allocating additional system resources, such as RAM or cores, to your worker nodes. Alternatively, you can explore deploying WordPress on a Minikube cluster, which is better suited for running test deployments and may provide a smoother experience.
 
															Photo by admingeek from Infotechys
Well done! Your WordPress site has been successfully deployed on Kubernetes. Now, you can move forward with configuring your WordPress site or execute the command below to remove your deployments and deploy something else!
				
					$ kubectl delete -k ./
 
				
			
		Deploying WordPress on Kubernetes offers numerous benefits, including scalability, resilience, and ease of management. By following the steps outlined in this guide, you can set up a robust WordPress environment that can handle the demands of your website while ensuring high availability and performance.
Did you find this article useful? Your feedback is invaluable to us! Please feel free to share your thoughts in the comments section below.
Related Posts

In today’s article, we will review the step-by-step process involved with a Kubernetes cluster install on Ubuntu server version 20.04. However, this procedure will work

Are you looking to set up a Kubernetes development environment with Vagrant quickly and efficiently? Look no further! In this guide, we’ll walk through how

In this tutorial, we will review the Kubernetes cluster install on CentOS8. This procedure will mirror our previous article about this subject. Install a Kubernetes
