loading...

23/07/2023

Deploy WordPress on Kubernetes

————————————- Setup MySQL ————————————-
 
1. Create Secret for MySQL
 
# echo -n ‘mysql1234’ | base64
 
# vi mysql-secret.yaml
 
apiVersion: v1
kind: Secret
metadata:
  name: wp-db-secrets
type: Opaque
data:
  MYSQL_ROOT_PASSWORD: bXlzcWwxMjM0
 
 
# kubectl apply -f mysql-secret.yaml
# kubectl get secrets
 
2. Create PVC for MySQL
 
# vi mysql-volume.yaml
 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-volume
spec:
  accessModes:
  – ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: mysql-storage
 
# kubectl apply -f mysql-volume.yaml
 
# kubectl get pv
# kubectl get pvc
 
3. Create Deployment for MySQL
 
# vi mysql.yaml
 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      – name: database
        image: mysql:5.7
        args:
          # mount volume
          – “–ignore-db-dir=lost+found”
        # add root password
        envFrom:
          – secretRef:
              name: wp-db-secrets
        ports:
          – containerPort: 3306
        volumeMounts:
        – name: mysql-data
          mountPath: /var/lib/mysql
      volumes:
      – name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-volume
 
 
# kubectl apply -f mysql.yaml
 
# kubectl get pods
 
# kubectl describe pod <pod_name>
 
4. Create Service for MySQL
 
# vi mysql-service.yaml
 
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  ports:
  – port: 3306
    protocol: TCP
  selector:
    app: mysql
 
 
# kubectl apply -f mysql-service.yaml
 
# kubectl get svc
# kubectl get pods
 
# kubectl exec -it <pod_name> — bash
 
# mysql -u root -p [MYSQL_ROOT_PASSWORD: bXlzcWwxMjM0   or mysql1234]
 
SQL> CREATE DATABASE wordpress;
SQL> show databases;
 
 
————————————— Setup WordPress ——————————————-
 
1. Create PVC for WordPress
 
# vi wp-volume.yaml
 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress-volume
spec:
  accessModes:
  – ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: wp-storage
 
 
# kubectl apply -f wp-volume.yaml
 
# kubectl get pv
# kubectl get pvc
 
2. Create Deployment for WordPress
 
# vi wp.yaml
 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
        – name: wordpress
          image: wordpress:5.8.3-php7.4-apache
          ports:
          – containerPort: 80
            name: wordpress
          volumeMounts:
            – name: wordpress-data
              mountPath: /var/www
          env:
            – name: WORDPRESS_DB_HOST
              value: mysql-service.default.svc.cluster.local
            – name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: wp-db-secrets
                  key: MYSQL_ROOT_PASSWORD
            – name: WORDPRESS_DB_USER
              value: root
            – name: WORDPRESS_DB_NAME
              value: wordpress
      volumes:
        – name: wordpress-data
          persistentVolumeClaim:
            claimName: wordpress-volume
 
 
# kubectl apply -f wp.yaml
 
# kubectl get pods
 
3. Create Service for WordPress
 
# vi wp-service.yaml
 
kind: Service
apiVersion: v1
metadata:
  name: wordpress-service
spec:
  type: LoadBalancer
  selector:
    app: wordpress
  ports:
    – name: http
      protocol: TCP
      port: 80
      targetPort: 80
  
 
# kubectl apply -f wp-service.yaml
 
# kubectl get svc
 
4. (Optional )Remove All Pods, PVCs, and Services
 
# kubectl delete svc –all
# kubectl delete pod –all 
# kubectl delete pvc –all 
# kubectl delete pv –all
Posted in DevOps, k8sTaggs: