Skip to content

Instantly share code, notes, and snippets.

@geerlingguy
Last active January 29, 2024 19:43
Show Gist options
  • Star 25 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save geerlingguy/e6a661e1cd2b53f6a39493ebb207425c to your computer and use it in GitHub Desktop.
Save geerlingguy/e6a661e1cd2b53f6a39493ebb207425c to your computer and use it in GitHub Desktop.
Wordpress in Kubernetes K3s on Raspberry Pi
# This manifest assumes 'wordpress' namespace is already present:
#
# kubectl create namespace wordpress
#
# Apply the manifest with:
#
# kubectl apply -f mariadb.yml
---
apiVersion: v1
kind: Secret
metadata:
name: mariadb-pass
namespace: wordpress
labels:
app: wordpress
data:
# This value is base64-encoded. Do not use this password in production!
password: MjJzaXl3dVpBNFdmeHNZcg==
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mariadb-pv-claim
namespace: wordpress
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mariadb
namespace: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mariadb
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mariadb
spec:
containers:
- image: tobi312/rpi-mariadb:10.3
name: mariadb
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-pass
key: password
ports:
- containerPort: 3306
name: mariadb
volumeMounts:
- name: mariadb-persistent-storage
mountPath: /var/lib/mysql
resources:
limits:
cpu: '1'
memory: '512Mi'
requests:
cpu: '500m'
memory: '256Mi'
volumes:
- name: mariadb-persistent-storage
persistentVolumeClaim:
claimName: mariadb-pv-claim
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-mariadb
namespace: wordpress
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mariadb
clusterIP: None
# This manifest assumes 'wordpress' namespace is already present:
#
# kubectl create namespace wordpress
#
# Apply the manifest with:
#
# kubectl apply -f wordpress.yml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
namespace: wordpress
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
namespace: 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:5.4-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mariadb
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-pass
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
resources:
limits:
cpu: '1'
memory: '512Mi'
requests:
cpu: '500m'
memory: '256Mi'
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim
---
apiVersion: v1
kind: Service
metadata:
name: wordpress
namespace: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: NodePort
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: wordpress
namespace: wordpress
spec:
rules:
- host: wordpress.10.0.100.99.nip.io
http:
paths:
- path: /
backend:
serviceName: wordpress
servicePort: 80
@mohsinonxrm
Copy link

@geerlingguy, I'm getting Error establishing a database connection when trying to open the Wordpress site... can you please point me where to look to debug/fix?

@geerlingguy
Copy link
Author

Check to make sure both pods are running: kubectl get pods -n wordpress

@mohsinonxrm
Copy link

@geerlingguy, did that. even deleted the WordPress namespace and started over, still the same error. BTW, excellent job on the series really enjoyed it. I hope you'll do another part and show some Kubernetes features, HA, failover, replicas, etc.
and... I'm looking forward to your Kubernetes 101!

@kimus
Copy link

kimus commented Jun 7, 2020

Not sure if it's the same problem. Not using raspberry pi, and so, I'm using mariadb:10.5 image.

All seams running fine:

$ kubectl get all -n wordpress

NAME                                     READY   STATUS    RESTARTS   AGE
pod/wordpress-mariadb-5cb547674f-58djk   1/1     Running   0          10m
pod/wordpress-5c6b9f6dd9-tcm5k           1/1     Running   0          10m

NAME                        TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
service/wordpress-mariadb   ClusterIP   None          <none>        3306/TCP       10m
service/wordpress           NodePort    10.43.100.1   <none>        80:30775/TCP   10m

NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/wordpress-mariadb   1/1     1            1           10m
deployment.apps/wordpress           1/1     1            1           10m

NAME                                           DESIRED   CURRENT   READY   AGE
replicaset.apps/wordpress-mariadb-5cb547674f   1         1         1       10m
replicaset.apps/wordpress-5c6b9f6dd9           1         1         1       10m

In the log of the wordpress I can see that didn't connect to database:

$ kubectl logs -n wordpress deployment.apps/wordpress

WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html
[07-Jun-2020 22:32:36 UTC] PHP Warning:  mysqli::__construct(): (HY000/2002): Connection refused in Standard input code on line 22

MySQL Connection Error: (2002) Connection refused

MySQL Connection Error: (2002) Connection refused

MySQL Connection Error: (2002) Connection refused

MySQL Connection Error: (2002) Connection refused

MySQL Connection Error: (2002) Connection refused
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.42.0.20. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.42.0.20. Set the 'ServerName' directive globally to suppress this message
[Sun Jun 07 22:32:51.570388 2020] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.3.18 configured -- resuming normal operations
[Sun Jun 07 22:32:51.570443 2020] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'

@madqb
Copy link

madqb commented Jun 8, 2020

I had the same problem. In mariadb.yml at the very bottom after port: 3306 add targetPort: 3306 on the next line.

@geerlingguy
Copy link
Author

Strange; maybe it's a Kubernetes version issue? Are you running on K3s 1.17 or something else? This matches the config that I've been deploying over and over again inside various Pi clusters here: https://github.com/geerlingguy/turing-pi-cluster/blob/master/roles/wordpress/templates/mariadb.yml#L85

And I haven't had any connection issues. The K8s Service docs basically state that targetPort defaults to port, so specifying it should make no difference:

By default and for convenience, the targetPort is set to the same value as the port field.

@kimus
Copy link

kimus commented Jun 9, 2020

@geerlingguy I was using k3d v3.0.0-beta.0, downgraded to v1.7.0 and the same problem persists.

I'm using k3d in a local macOS docker.

@madqb
Copy link

madqb commented Jun 10, 2020

Strange; maybe it's a Kubernetes version issue? Are you running on K3s 1.17 or something else? This matches the config that I've been deploying over and over again inside various Pi clusters here: https://github.com/geerlingguy/turing-pi-cluster/blob/master/roles/wordpress/templates/mariadb.yml#L85

And I haven't had any connection issues. The K8s Service docs basically state that targetPort defaults to port, so specifying it should make no difference:

By default and for convenience, the targetPort is set to the same value as the port field.

For reference my version output is: v1.18.3+k3s1. The reason I tried this fix was because it was the only difference I could find between your drupal yml and the wordpress one. As soon as I added it to wordpress, the pods came up no problem.

@kimus
Copy link

kimus commented Jun 11, 2020

update

after entering the wordpress pod, installed mariadb-client, and tryed to connect. So, with the rootuser everything connects fine to the mariadb pod:

# mariadb -h $WORDPRESS_DB_HOST -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 10.5.3-MariaDB-1:10.5.3+maria~bionic mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases
    -> ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| wordpress          |
+--------------------+
4 rows in set (0.056 sec)

So, I went and run kubectl rollout restart -n wordpress deployment.apps/wordpressand no errors shown after.

I guess it's related with wordpress starting before mariadb...

@ecasti-gmail-com
Copy link

on mariadb.yml file, line 70, you should have /var/lib/mysql instead /var/lib/mariadb as mountPath, since that image has
configured:
datadir = /var/lib/mysql

@DaveBben
Copy link

on mariadb.yml file, line 70, you should have /var/lib/mysql instead /var/lib/mariadb as mountPath, since that image has
configured:
datadir = /var/lib/mysql

Yes! If you don't change the mount, your files won't be saved. Just learned this the hard way.

@geerlingguy
Copy link
Author

geerlingguy commented Jul 11, 2020

@ecasti-gmail-com and @DaveBben - Thanks for reporting that. I've updated the mount in the gist above. I believe I must've copied out a version of the manifests from when I was changing around the image I was using for MariaDB around the time I was switching between Pi OS 32-bit and 64-bit... sorry about the confusion caused by this!

@raevillena
Copy link

Been cruising around the youtube episodes and made to the point that I had wordpress running. The problem is that the ingress does not route to the wordpress app.

`root@master:~/wordpress# kubectl get all -n wordpress
NAME READY STATUS RESTARTS AGE
pod/wordpress-mariadb-54f564f668-n76xm 1/1 Running 0 24m
pod/wordpress-8bbd9f77c-f4cll 1/1 Running 0 6m37s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/wordpress NodePort 10.43.160.149 80:30957/TCP 24m
service/wordpress-mariadb ClusterIP None 3306/TCP 24m

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/wordpress-mariadb 1/1 1 1 24m
deployment.apps/wordpress 1/1 1 1 24m

NAME DESIRED CURRENT READY AGE
replicaset.apps/wordpress-mariadb-54f564f668 1 1 1 24m
replicaset.apps/wordpress-5c6b9f6dd9 0 0 0 24m
replicaset.apps/wordpress-8bbd9f77c 1 1 1 6m37s
`

@KellyWebServices
Copy link

Been cruising around the youtube episodes and made to the point that I had wordpress running. The problem is that the ingress does not route to the wordpress app.

`root@master:~/wordpress# kubectl get all -n wordpress
NAME READY STATUS RESTARTS AGE
pod/wordpress-mariadb-54f564f668-n76xm 1/1 Running 0 24m
pod/wordpress-8bbd9f77c-f4cll 1/1 Running 0 6m37s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/wordpress NodePort 10.43.160.149 80:30957/TCP 24m
service/wordpress-mariadb ClusterIP None 3306/TCP 24m

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/wordpress-mariadb 1/1 1 1 24m
deployment.apps/wordpress 1/1 1 1 24m

NAME DESIRED CURRENT READY AGE
replicaset.apps/wordpress-mariadb-54f564f668 1 1 1 24m
replicaset.apps/wordpress-5c6b9f6dd9 0 0 0 24m
replicaset.apps/wordpress-8bbd9f77c 1 1 1 6m37s
`

@raevillena
I ran in to the same problem where everything was running but the ingress address didn't load anything. I got to looking at the ingress address and realized it's using the IP for one of Jeff's nodes from the Ingress section at the bottom of the wordpress.yml. I edited that to be one of my nodes. i ran 'kubectl delete -f mariadb.yml' and ran it again for the wordpress.yml file and also 'kubectl delete namespace wordpress' to delete the namespace and restarted the cluster. Basically I wanted to start fresh. Once back up I created the wordpress namespace again and then ran the 'kubectl apply -f mariadb.yml' and made sure it was running using the 'kubectl get nodes -n wordpress' before running the apply again on the wordpress.yml. I tracked to see when that was running and then got the ingress address which was now pointing to one of my nodes and it loaded Wordpress. Hopefully this helps you and I didn't screw up one of the commands. I'm new at this and was just following his awesome series on the pi cluster as well.

Thanks @geerlingguy for the awesome series!

@raevillena
Copy link

Been cruising around the youtube episodes and made to the point that I had wordpress running. The problem is that the ingress does not route to the wordpress app.
root@master:~/wordpress# kubectl get all -n wordpress NAME READY STATUS RESTARTS AGE pod/wordpress-mariadb-54f564f668-n76xm 1/1 Running 0 24m pod/wordpress-8bbd9f77c-f4cll 1/1 Running 0 6m37s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/wordpress NodePort 10.43.160.149 80:30957/TCP 24m service/wordpress-mariadb ClusterIP None 3306/TCP 24m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/wordpress-mariadb 1/1 1 1 24m deployment.apps/wordpress 1/1 1 1 24m NAME DESIRED CURRENT READY AGE replicaset.apps/wordpress-mariadb-54f564f668 1 1 1 24m replicaset.apps/wordpress-5c6b9f6dd9 0 0 0 24m replicaset.apps/wordpress-8bbd9f77c 1 1 1 6m37s

@raevillena
I ran in to the same problem where everything was running but the ingress address didn't load anything. I got to looking at the ingress address and realized it's using the IP for one of Jeff's nodes from the Ingress section at the bottom of the wordpress.yml. I edited that to be one of my nodes. i ran 'kubectl delete -f mariadb.yml' and ran it again for the wordpress.yml file and also 'kubectl delete namespace wordpress' to delete the namespace and restarted the cluster. Basically I wanted to start fresh. Once back up I created the wordpress namespace again and then ran the 'kubectl apply -f mariadb.yml' and made sure it was running using the 'kubectl get nodes -n wordpress' before running the apply again on the wordpress.yml. I tracked to see when that was running and then got the ingress address which was now pointing to one of my nodes and it loaded Wordpress. Hopefully this helps you and I didn't screw up one of the commands. I'm new at this and was just following his awesome series on the pi cluster as well.

Thanks @geerlingguy for the awesome series!

I pretty much did the same thing. I forgot to update my comment on this thread for everyone. Thanks for your update.

@Nenad13
Copy link

Nenad13 commented Feb 27, 2021

Hi Jeff,

I think I have version problem with deployment of the wordpres.yml file.

Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress ingress.extensions/wordpress configured

I try to adapt wordpress.yml file accordingly in the line 90 apiVersion: extensions/v1beta1
without success. Do you have any ideas? My k3s VERSION: v1.20.2+k3s1

By the way Thank you very much for your videos on k3s on raspberry cluster and Kubernetes! Great content!

Cheers,
Nenad

@bozh0
Copy link

bozh0 commented Sep 20, 2021

Hi Nenad13, here is the last reworked version from me that I can confirm that it works:
image

@ealvesss
Copy link

ealvesss commented Apr 25, 2022

I'm newbie with k3s but everything went well here.

I have a question, how can i access wordpress in browser?

Update:
I got how to deal with it.

@br3jlm
Copy link

br3jlm commented Jun 12, 2022

Could we please have your code updated ?

@dk98174003
Copy link

/var/lib/mysql as datadir is not working - I keep trying find a solution for this.

I can mount my persistent volumne to /data no problem but the database will write to /var/lib/mysql.

Here the error message.

2022-08-04 09:56:27+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.3.* started.
chown: changing ownership of '/var/lib/mysql/': Operation not permitted

;o)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment