All tools / Kubernetes examples
WordPress with MySQL on Kubernetes
WordPress plus its own MySQL database, with persistent volumes for both, a Service and an Ingress with TLS.
Customize names, versions and passwords →
wordpress.yaml
apiVersion: v1
kind: Secret
metadata:
name: wordpress-db
namespace: default
type: Opaque
stringData:
MYSQL_ROOT_PASSWORD: "change-me"
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: "change-me"
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-db
namespace: default
spec:
clusterIP: None
selector:
app: wordpress-db
ports:
- name: mysql
port: 3306
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: wordpress-db
namespace: default
spec:
serviceName: wordpress-db
replicas: 1
selector:
matchLabels:
app: wordpress-db
template:
metadata:
labels:
app: wordpress-db
spec:
securityContext:
fsGroup: 999
containers:
- name: mysql
image: mysql:8.4
ports:
- name: mysql
containerPort: 3306
envFrom:
- secretRef:
name: wordpress-db
readinessProbe:
exec:
command: ["mysqladmin", "ping", "-h", "127.0.0.1"]
initialDelaySeconds: 10
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
memory: 1Gi
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wordpress-content
namespace: default
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
namespace: default
labels:
app: wordpress
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:6.8-apache
ports:
- name: http
containerPort: 80
env:
- name: WORDPRESS_DB_HOST
value: wordpress-db
- name: WORDPRESS_DB_NAME
value: wordpress
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: wordpress-db
key: MYSQL_PASSWORD
readinessProbe:
tcpSocket:
port: http
initialDelaySeconds: 10
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
memory: 512Mi
volumeMounts:
- name: content
mountPath: /var/www/html
volumes:
- name: content
persistentVolumeClaim:
claimName: wordpress-content
---
apiVersion: v1
kind: Service
metadata:
name: wordpress
namespace: default
spec:
selector:
app: wordpress
ports:
- name: http
port: 80
targetPort: http
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wordpress
namespace: default
annotations:
cert-manager.io/cluster-issuer: letsencrypt
nginx.ingress.kubernetes.io/proxy-body-size: 64m
spec:
ingressClassName: nginx
tls:
- hosts: ["blog.example.com"]
secretName: wordpress-tls
rules:
- host: blog.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wordpress
port:
name: http
Passwords here are placeholders (change-me). The generator creates random ones for you.
How to use it
Commands
kubectl apply -f wordpress.yaml kubectl -n default get pods -w
- The Ingress assumes the NGINX Ingress Controller and a cert-manager ClusterIssuer named letsencrypt.
- Visit https://blog.example.com after the pods are ready to finish the WordPress setup.
Prefer Docker Compose? See the WordPress with MySQL Docker Compose version.