Company
Solutions
Developers
Careers
Search
EN
EN
Ampere Computing Logo
Solutions
Solutions Home
Systems
Solutions
Performance Overview
Tutorials Overview
Workload Briefs Overview
Tuning Guides Overview
Where to Try
Ampere Systems
Ampere Altra
Azure
Equinix
Google Cloud
Oracle
Tencent Cloud
Ampere AIDownloadsHow It WorksFAQs
Developers
Developer CenterDesigning Cloud ApplicationsBuilding Cloud ApplicationsDeploying Cloud ApplicationsUsing Your DataEnabling the Open-Source CommunityAmpere Ready SoftwareAmpere Developer Community Forum
Support
Search
Workloads Ampere Altra

Kubernetes on Ampere - Deploy WordPress and MySQL

Tutorial

Print
Download
Overview
Prerequisites
Preparing the Deployment File for MySQL
Preparing the Deployment File for WordPress
Installation Steps
Verify Services and Install WordPress
Overview

WordPress is a very popular blogging and content management tool that uses a relational database to store blog articles, related data, metadata, pictures etc. This tutorial shows how to deploy a WordPress Site and MySQL database on a Kubernetes cluster hosted on Ampere servers or virtual machines. Each component runs as a container. The WordPress container is the front-end tier and the MySQL container will be the backend/database for WordPress.

We use the official arm64 Docker images for WordPress and MySQL from Docker hub.

Prerequisites

If deploying on the cloud, you can use your cloud provider’s Kubernetes engine. Ampere instances are available on OCI, GCP and Azure clouds. When deploying on bare-metal servers, create a Kubernetes cluster using Kubeadm or Minikube.

Preparing the Deployment File for MySQL

The following manifest describes a single instance deployment of MySQL. The MySQL container uses a PersistentVolume (PV) for storage using the host path /tmp/mysql/data and mounted at /var/lib/mysql. The password for the MySQL database is stored in a Kubernetes secret which is generated from password.txt.

NOTE: For production deployments, we recommend PVs backed by persistent disks to store data outside of containers.

mysql-deployment.yaml


---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/tmp/mysql/data"
  persistentVolumeReclaimPolicy: Recycle
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress-mysql
spec:
  ports:
  - port: 3306
  selector:
    app: wordpress-mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress-mysql
spec:
  selector:
    matchLabels:
      app: wordpress-mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress-mysql
    spec:
      containers:
      - image: mysql:oracle
        name: mysql
        env:
        - name: MYSQL_DATABASE
          value: wordpress
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password.txt
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim
Preparing the Deployment File for WordPress

This manifest describes a WordPress deployment. The WordPress container also uses a PersistentVolume for storing the website files using the host path /tmp/wp/data and mounted at /var/www/html. The environment variable WORDPRESS_DB_HOST sets the name of the MySQL service and WORDPRESS_DB_PASSWORD defines the password to access the MySQL database from the Kubernetes secret generated from the password.txt file.

If using a cloud deployment, you can set the service type to LoadBalancer and use the IP address of the cloud load balancing service to access the WordPress front-end. If using Kubernetes on bare metal, you can set the type to NodePort and use the Kubernetes node IP address to access WordPress front-end. Alternatively, you can use type as LoadBalancer and specify the external IP address of your server.

wordpress-deployment.yaml


---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wp-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/tmp/wp/data"
  persistentVolumeReclaimPolicy: Recycle
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
    tier: frontend
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer
  externalIPs:
  - 10.76.87.233
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
    tier: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
        - image: wordpress:6.0.1-php7.4
          name: wordpress
          env:
            - name: WORDPRESS_DB_HOST
              value: wordpress-mysql
            - name: WORDPRESS_DB_NAME
              value: wordpress
            - name: WORDPRESS_DB_USER
              value: root
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password.txt
          ports:
            - containerPort: 80
              name: wordpress
          volumeMounts:
            - name: wordpress-persistent-storage
              mountPath: /var/www/html
      volumes:
        - name: wordpress-persistent-storage
          persistentVolumeClaim:
            claimName: wp-pv-claim

Installation Steps
  • Set up MySQL secret. Create a new file called password.txt and add your desired MySQL password in this file. Make sure that there is no newline (\n) at the end of the password. Use kubectl command to generate the MySQL secret.
  • Deploy MySQL and WordPress containers using the YAML files from the previous section.

kubectl create secret generic mysql-pass --from-file=password.txt
kubectl create -f mysql-deployment.yaml
kubectl create -f wordpress-deployment.yaml
Verify Services and Install WordPress

Verify that services are running using the following command:


# kubectl get service
NAME              TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)        AGE
kubernetes        ClusterIP      10.96.0.1        <none>         443/TCP        51m
wordpress         LoadBalancer   10.100.16.187    10.76.87.233   80:32160/TCP   40m
wordpress-mysql   ClusterIP      10.105.136.201   <none>         3306/TCP       40m

# kubectl get pv
NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS   REASON   AGE
mysql-pv-volume   20Gi       RWO            Recycle          Bound    default/wp-pv-claim      manual                  13h
wp-pv-volume      20Gi       RWO            Recycle          Bound    default/mysql-pv-claim   manual                  13h

Copy the external IP address of the WordPress service and open the link http://<"ip-address"> in a browser. You should see the WordPress setup page.


WordPress Homescreen


Fill in the details and set up the WordPress site. Your WordPress site is now up and running on Ampere !!


Wordpress Success

Ampere Computing

4655 Great America Parkway

Suite 601 Santa Clara, CA 95054

Tel: +1-669-770-3700

info[at]amperecomputing.com

About
image
image
image
image
© 2023 Ampere Computing LLC. All rights reserved. Ampere, Altra and the A and Ampere logos are registered trademarks or trademarks of Ampere Computing.