Skip to content

Commit a764229

Browse files
committed
examples
k8s example with DHI , first version (only database)
1 parent 3094d08 commit a764229

6 files changed

Lines changed: 348 additions & 1 deletion

File tree

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# PHP - Examples: PHP-FPM & NGINX & MySQL (using DHI) for K8s/Kubernetes
2+
3+
## Steps:
4+
1. ```kubectl apply -f namespace.yaml```
5+
2. Registry Login (needed for DHI), see below.
6+
2. ```kubectl apply -f volumes.yaml```
7+
3. ```kubectl apply -f wsc-db.yaml```
8+
* create database and user and set permission:
9+
```sh
10+
# Database
11+
kubectl -n wsc exec -it deployment/wsc-db -c mysql -- sh -c 'mysql -uroot -e "CREATE DATABASE ${MYSQL_DATABASE};"'
12+
# User with Password and Permission for Database
13+
kubectl -n wsc exec -it deployment/wsc-db -c mysql -- sh -c 'mysql -uroot -e "CREATE USER \"${MYSQL_USER}\"@\"%\" IDENTIFIED BY \"${MYSQL_PASSWORD}\"; GRANT ALL PRIVILEGES ON ${MYSQL_DATABASE}.* TO \"${MYSQL_USER}\"@\"%\";"'
14+
```
15+
* create exporter user with password and set permission:
16+
```sh
17+
kubectl -n wsc exec -it deployment/wsc-db -c mysql -- sh -c 'mysql -uroot -e "CREATE USER \"${MYSQL_EXPORTER_USER}\"@\"%\" IDENTIFIED BY \"${MYSQL_EXPORTER_PASSWORD}\"; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO \"${MYSQL_EXPORTER_USER}\"@\"%\";"'
18+
```
19+
* check:
20+
```sh
21+
kubectl -n wsc exec -it deployment/wsc-db -c mysql -- sh -c 'mysql -h localhost -uroot -e "SELECT user, host, max_user_connections FROM mysql.user;"'
22+
kubectl -n wsc exec -it deployment/wsc-db -c mysql -- sh -c 'mysql -h localhost -uroot -e "SELECT host, user, db FROM mysql.db;"'
23+
```
24+
* Now you can edit `wsc-db.yaml` and use `MYSQL_EXPORTER_USER` and `MYSQLD_EXPORTER_PASSWORD` for exporter and optional use other user instead root for healtcheck.
25+
4. ```kubectl apply -f wsc-web.yaml```
26+
5. copy wsc files to html folder in wsc-web deployment: ```kubectl cp ....```
27+
6. ...
28+
29+
## Registry Login
30+
31+
Login to docker.io and dhi.io Registries!
32+
33+
```sh
34+
# Steps:
35+
36+
# 1. User and Password
37+
REGISTRY_USER_NAME="<username>" # Docker Hub Username
38+
REGISTRY_USER_PASSWORD="<password>" # Password or Token
39+
40+
# 2. Registry: Docker Hub
41+
REGISTRY_NAME="index.docker.io/v1/"
42+
K8S_REGCRED_NAME="regcred-dockerhub"
43+
44+
# 3. Login command
45+
kubectl create secret docker-registry ${K8S_REGCRED_NAME} \
46+
--docker-server="${REGISTRY_NAME}" \
47+
--docker-username="${REGISTRY_USER_NAME}" \
48+
--docker-password="${REGISTRY_USER_PASSWORD}" \
49+
--save-config --dry-run=client -o yaml | \
50+
kubectl --namespace=wsc apply -f -
51+
52+
# 4. Registry: DHI
53+
REGISTRY_NAME="dhi.io"
54+
K8S_REGCRED_NAME="regcred-dhi"
55+
56+
# 5. repeat "3. Login command" again
57+
```
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
apiVersion: v1
2+
kind: Namespace
3+
metadata:
4+
name: wsc
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# https://github.com/rancher/local-path-provisioner
2+
3+
---
4+
5+
apiVersion: v1
6+
kind: PersistentVolumeClaim
7+
metadata:
8+
name: wsc-db-data
9+
namespace: wsc
10+
labels:
11+
app.kubernetes.io/name: wsc-db
12+
app.kubernetes.io/component: database
13+
app.kubernetes.io/part-of: wsc
14+
spec:
15+
accessModes:
16+
- ReadWriteOnce
17+
volumeMode: Filesystem
18+
storageClassName: local-path # set to your class
19+
resources:
20+
requests:
21+
storage: 5Gi
22+
23+
---
24+
25+
apiVersion: v1
26+
kind: PersistentVolumeClaim
27+
metadata:
28+
name: wsc-web-data
29+
namespace: wsc
30+
labels:
31+
app.kubernetes.io/name: wsc-web
32+
app.kubernetes.io/component: server
33+
app.kubernetes.io/part-of: wsc
34+
spec:
35+
accessModes:
36+
- ReadWriteOnce
37+
volumeMode: Filesystem
38+
storageClassName: local-path # set to your class
39+
resources:
40+
requests:
41+
storage: 15Gi
Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
# WSC-DB (MySQL-Database)
2+
# Source: https://github.com/Tob1as/docker-php
3+
# other konfig example: https://github.com/Tob1as/docker-kubernetes-collection/blob/master/examples_k8s/mariadb.yaml
4+
#
5+
# used Images:
6+
# - https://dhi.io/catalog/mysql
7+
# - https://dhi.io/catalog/mysqld-exporter (Docs: https://github.com/prometheus/mysqld_exporter)
8+
#
9+
# TODO: only do this commands after first start when using dhi mysql image (create database and user with password from environment vars):
10+
# kubectl -n wsc exec -it deployment/wsc-db -c mysql -- sh -c 'mysql -uroot -e "CREATE DATABASE ${MYSQL_DATABASE};"'
11+
# kubectl -n wsc exec -it deployment/wsc-db -c mysql -- sh -c 'mysql -uroot -e "CREATE USER \"${MYSQL_USER}\"@\"%\" IDENTIFIED BY \"${MYSQL_PASSWORD}\"; GRANT ALL PRIVILEGES ON ${MYSQL_DATABASE}.* TO \"${MYSQL_USER}\"@\"%\";"'
12+
# kubectl -n wsc exec -it deployment/wsc-db -c mysql -- sh -c 'mysql -uroot -e "CREATE USER \"${MYSQL_EXPORTER_USER}\"@\"%\" IDENTIFIED BY \"${MYSQL_EXPORTER_PASSWORD}\"; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO \"${MYSQL_EXPORTER_USER}\"@\"%\";"'
13+
14+
---
15+
16+
apiVersion: v1
17+
kind: ConfigMap
18+
metadata:
19+
name: wsc-db-env-config
20+
namespace: wsc
21+
labels:
22+
app.kubernetes.io/name: wsc-db
23+
app.kubernetes.io/component: database
24+
app.kubernetes.io/part-of: wsc
25+
data:
26+
MYSQL_OPTIONS: "--innodb-buffer-pool-size=512M" # only support in DHI (instead of own *.cnf file)
27+
# the following variables require manual intervention in order to be used (kubectl exec command):
28+
MYSQL_DATABASE: "woltlab_suite"
29+
MYSQL_USER: "woltlab_suite"
30+
MYSQL_EXPORTER_USER: "exporter"
31+
32+
---
33+
34+
apiVersion: v1
35+
kind: Secret
36+
metadata:
37+
name: wsc-db-env-secret
38+
namespace: wsc
39+
labels:
40+
app.kubernetes.io/name: wsc-db
41+
app.kubernetes.io/component: database
42+
app.kubernetes.io/part-of: wsc
43+
stringData:
44+
MYSQL_ROOT_PASSWORD: "my-secret-pw" # required !
45+
# the following variables require manual intervention in order to be used (kubectl exec command):
46+
MYSQL_PASSWORD: "my-secret-pw"
47+
MYSQL_EXPORTER_PASSWORD: "my-secret-pw"
48+
49+
---
50+
51+
apiVersion: apps/v1
52+
kind: Deployment
53+
metadata:
54+
name: wsc-db
55+
namespace: wsc
56+
labels:
57+
app.kubernetes.io/name: wsc-db
58+
app.kubernetes.io/component: database
59+
app.kubernetes.io/part-of: wsc
60+
spec:
61+
replicas: 1
62+
strategy:
63+
type: Recreate
64+
selector:
65+
matchLabels:
66+
app.kubernetes.io/name: wsc-db
67+
app.kubernetes.io/component: database
68+
app.kubernetes.io/part-of: wsc
69+
template:
70+
metadata:
71+
labels:
72+
app.kubernetes.io/name: wsc-db
73+
app.kubernetes.io/component: database
74+
app.kubernetes.io/part-of: wsc
75+
spec:
76+
imagePullSecrets:
77+
- name: regcred-dockerhub
78+
- name: regcred-dhi
79+
restartPolicy: Always
80+
securityContext:
81+
fsGroup: 65532
82+
containers:
83+
- name: mysql
84+
image: dhi.io/mysql:8.4-debian13
85+
imagePullPolicy: Always
86+
envFrom:
87+
- configMapRef:
88+
name: wsc-db-env-config
89+
optional: true
90+
- secretRef:
91+
name: wsc-db-env-secret
92+
#optional: true
93+
ports:
94+
- containerPort: 3306
95+
name: mysql
96+
protocol: TCP
97+
readinessProbe:
98+
exec:
99+
command: ["/bin/sh", "-c", "mysqladmin ping -h localhost -P 3306 -u root || exit 1"]
100+
#command: ["/bin/sh", "-c", "mysqladmin ping -h localhost -P 3306 --user=$MYSQL_USER --password=$MYSQL_PASSWORD || exit 1"]
101+
#tcpSocket:
102+
# port: 3306
103+
initialDelaySeconds: 10
104+
periodSeconds: 30
105+
timeoutSeconds: 5
106+
failureThreshold: 3
107+
successThreshold: 1
108+
livenessProbe:
109+
exec:
110+
command: ["/bin/sh", "-c", "mysqladmin ping -h localhost -P 3306 -u root || exit 1"]
111+
#command: ["/bin/sh", "-c", "mysqladmin ping -h localhost -P 3306 --user=$MYSQL_USER --password=$MYSQL_PASSWORD || exit 1"]
112+
#tcpSocket:
113+
# port: 3306
114+
initialDelaySeconds: 10
115+
periodSeconds: 30
116+
timeoutSeconds: 5
117+
failureThreshold: 3
118+
successThreshold: 1
119+
resources:
120+
requests:
121+
memory: "512Mi"
122+
cpu: "0.5"
123+
limits:
124+
memory: "1Gi"
125+
cpu: "1.0"
126+
volumeMounts:
127+
- name: wsc-db-data
128+
mountPath: /var/lib/mysql
129+
- name: exporter
130+
image: dhi.io/mysqld-exporter:0.18-debian13
131+
imagePullPolicy: Always
132+
ports:
133+
- containerPort: 9104
134+
name: exporter
135+
protocol: TCP
136+
env:
137+
- name: MYSQL_EXPORTER_USER
138+
value: "root"
139+
#- name: MYSQL_EXPORTER_USER
140+
# valueFrom:
141+
# configMapKeyRef:
142+
# name: wsc-db-env-config
143+
# key: MYSQL_EXPORTER_USER
144+
# #optional: true
145+
#- name: MYSQLD_EXPORTER_PASSWORD
146+
# valueFrom:
147+
# secretKeyRef:
148+
# name: wsc-db-env-secret
149+
# key: MYSQL_EXPORTER_PASSWORD
150+
# optional: true
151+
args:
152+
- "--web.listen-address=:9104"
153+
- "--web.telemetry-path=/metrics"
154+
- "--mysqld.address=localhost:3306"
155+
- "--mysqld.username=$(MYSQL_EXPORTER_USER)"
156+
- "--log.level=info"
157+
resources:
158+
requests:
159+
memory: "64Mi"
160+
cpu: "0.1"
161+
limits:
162+
memory: "128Mi"
163+
cpu: "0.5"
164+
volumes:
165+
- name: wsc-db-data
166+
persistentVolumeClaim:
167+
claimName: wsc-db-data
168+
169+
---
170+
171+
apiVersion: v1
172+
kind: Service
173+
metadata:
174+
name: wsc-db
175+
namespace: wsc
176+
labels:
177+
app.kubernetes.io/name: wsc-db
178+
app.kubernetes.io/component: database
179+
app.kubernetes.io/part-of: wsc
180+
spec:
181+
type: ClusterIP
182+
ports:
183+
- name: "mysql"
184+
protocol: TCP
185+
port: 3306
186+
targetPort: 3306
187+
- name: "exporter"
188+
protocol: TCP
189+
port: 9104
190+
targetPort: 9104
191+
selector: # deployment
192+
app.kubernetes.io/name: wsc-db
193+
app.kubernetes.io/component: database
194+
app.kubernetes.io/part-of: wsc
195+
196+
# Port-Forward/Tunnel to localhost
197+
# kubectl -n wsc port-forward service/wsc-db 3306:3306
198+
# kubectl -n wsc port-forward service/wsc-db 9104:9104
199+
200+
#---
201+
#
202+
### After this line ONLY for Monitoring !
203+
#
204+
#apiVersion: monitoring.coreos.com/v1
205+
#kind: ServiceMonitor
206+
#metadata:
207+
# name: wsc-db
208+
# namespace: wsc
209+
# labels:
210+
# app.kubernetes.io/name: wsc-db
211+
# app.kubernetes.io/component: database
212+
# app.kubernetes.io/part-of: wsc
213+
#spec:
214+
# endpoints:
215+
# - path: /metrics
216+
# scheme: http
217+
# port: exporter # 9104
218+
# targetPort: 9104
219+
# selector:
220+
# matchLabels: # service
221+
# app.kubernetes.io/name: wsc-db
222+
# app.kubernetes.io/component: database
223+
# app.kubernetes.io/part-of: wsc
224+
#
225+
#---
226+
#
227+
## Examples: https://samber.github.io/awesome-prometheus-alerts/rules#mysql
228+
#
229+
#apiVersion: monitoring.coreos.com/v1
230+
#kind: PrometheusRule
231+
#metadata:
232+
# name: mysql
233+
# namespace: wsc
234+
# labels:
235+
# app: mysql
236+
#spec:
237+
# groups:
238+
# - name: mysql.rules
239+
# rules:
240+
# - alert: {}
241+
# - alert: {}
242+
# - alert: {}
243+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# WSC-WEB (PHP-FPM + NGINX)
2+
# Source: https://github.com/Tob1as/docker-php

examples/fpm-nginx-dhi/docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ services:
9393
timeout: 5s
9494
retries: 3
9595
# check with: "docker inspect --format='{{json .State.Health}}' wsc-db | jq"
96-
# TODO: only do this commands after first start when using dhi mysql image (create database and user with password form environment vars):
96+
# TODO: only do this commands after first start when using dhi mysql image (create database and user with password from environment vars):
9797
# docker exec -it wsc-db bash -c 'mysql -uroot -e "CREATE DATABASE ${MYSQL_DATABASE};"'
9898
# docker exec -it wsc-db bash -c 'mysql -uroot -e "CREATE USER \"${MYSQL_USER}\"@\"%\" IDENTIFIED BY \"${MYSQL_PASSWORD}\"; GRANT ALL PRIVILEGES ON ${MYSQL_DATABASE}.* TO \"${MYSQL_USER}\"@\"%\";"'
9999

0 commit comments

Comments
 (0)