Kitloft

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

Prefer Docker Compose? See the WordPress with MySQL Docker Compose version.