mysql-statefulset.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
clusterIP: None
selector:
app: mysql
ports:
- port: 3306
name: mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: "mysql"
replicas: 3
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
value: my-secret-pw
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
kubectl apply -f mysql-statefulset.yaml
kubectl get pods -l app=mysql
→ Du siehst: mysql-0
, mysql-1
, mysql-2
kubectl get pvc
→ Du siehst: mysql-data-mysql-0
, mysql-data-mysql-1
, etc.
Greife auf einen Pod zu:
kubectl exec -it mysql-0 -- mysql -u root -p
Passwort: my-secret-pw
Erstelle eine Test-Datenbank:
CREATE DATABASE testdb;
SHOW DATABASES;
EXIT;
kubectl delete pod mysql-0
Warte, bis mysql-0
neu gestartet wurde, und gehe wieder rein:
kubectl exec -it mysql-0 -- mysql -u root -p
→ testdb
ist noch da – Beweis für persistente Speicherung!
kubectl delete -f mysql-statefulset.yaml
kubectl delete pvc -l app=mysql
Element | Erklärung |
---|---|
clusterIP: None | Headless Service – Pods können sich direkt über DNS mysql-0.mysql , mysql-1.mysql etc. ansprechen |
StatefulSet | Behält Pod-Namen und zugeordnete Volumes über Neustarts hinweg |
PVCs | Werden automatisch für jeden Pod erstellt (eine pro Instanz) |