Running WordPress in Kubernetes Cluster

方式一:YAML

1
2
3
4
5
6
$ kubectl version --short
Client Version: v1.21.3
Server Version: v1.21.2
$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready control-plane,master 4d v1.21.2 192.168.49.2 <none> Ubuntu 20.04.2 LTS 5.10.47-linuxkit docker://20.10.7

编写以下三个yaml文件:mysql-deployment.yaml, wordpress-deployment.yaml, kustomization.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# mysql-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# wordpress-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: 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:4.8-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim

1
2
3
4
5
6
7
8
# kustomization.yaml
secretGenerator:
- name: mysql-pass
literals:
- password=123
resources:
- mysql-deployment.yaml
- wordpress-deployment.yaml

Apply and Verify:

1
2
3
4
5
6
7
8
9
10
$ kubectl apply -k ./
secret/mysql-pass-5kd6m6b97h created
service/wordpress created
service/wordpress-mysql created
persistentvolumeclaim/mysql-pv-claim created
persistentvolumeclaim/wp-pv-claim created
deployment.apps/wordpress created
deployment.apps/wordpress-mysql created

$ minikube service wordpress --url

Cleaning up:

1
2
3
4
5
6
7
8
$ kubectl delete -k ./
secret "mysql-pass-5kd6m6b97h" deleted
service "wordpress" deleted
service "wordpress-mysql" deleted
persistentvolumeclaim "mysql-pv-claim" deleted
persistentvolumeclaim "wp-pv-claim" deleted
deployment.apps "wordpress" deleted
deployment.apps "wordpress-mysql" deleted

方式二:helm

1
2
3
4
5
6
7
8
9
10
11
12
$ brew install helm
$ helm version --short
v3.6.3+gd506314
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm search repo bitnami
NAME CHART VERSION APP VERSION DESCRIPTION
……
bitnami/wordpress 12.1.0 5.8.0 Web publishing platform for building blogs and ...
$ kubectl create namespace wordpress-release
$ kubectl -n wordpress-release get all
No resources found in wordpress-release namespace.
$ helm -n wordpress-release install wordpress bitnami/wordpress # Helm 3
1
2
打开minikube tunnel
$ minikube tunnel
1
2
3
4
5
# Watch the status
$ kubectl get svc --namespace wordpress-release -w wordpress
$ export SERVICE_IP=$(kubectl get svc --namespace wordpress-release wordpress --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
$ echo "WordPress URL: http://$SERVICE_IP/"
$ echo "WordPress Admin URL: http://$SERVICE_IP/admin"

![image-20210824205635030](/Users/vincent/Library/Application Support/typora-user-images/image-20210824205635030.png)

Uninstalling the Chart

1
2
3
4
5
$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
my-release default 1 2021-08-24 20:33:51.916101 +0800 CST deployed wordpress-12.1.0 5.8.0
$ helm delete my-release

References:

https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/

https://github.com/helm/charts/tree/master/stable/wordpress

Kubernetes helm charts 介绍 + 实例部署wordpress