#Mysql i Kubernetes
Vi läste tidigare att det inte är så bra att köra en databas i K8s, men vi gör det ändå för att öva på stateful applikationer. Vi ska använda PersistentVolumeClaim för att få stateful data åt databasen. Det är inte säkert egentligen då vi förlorar all data om noden går ner. Om vi har gjort detta i verkligheten hade vi också kopplat vår data till en molntjänst eller server.
#Skydda lösenord med Secrets
Vi börjar med att skapa en secret file då vi kommer sätta lösenord i deployments filerna. Vi behöver ett root lösenord och en lösenord åt Microblogen.
echo -n "my-super-secret-root-password" | base64 <password-string> echo -n "micropassw" | base64 <password-string>
Skapa en fil, mysql-secrets.yml.
--- apiVersion: v1 kind: Secret metadata: name: mysql-secrets type: Opaque data: ROOT_PASSWORD: <password-string> DB_PASSWORD: <password-string>
Aktivera dem i kubectl.
kubectl apply -f mysql-secrets.yml kubectl get secret NAME TYPE DATA AGE default-token-8ld8g kubernetes.io/service-account-token 3 37m mysql-secrets Opaque 2 36s kubectl describe secret mysql-secrets Name: mysql-secrets Namespace: default Labels: <none> Annotations: Type: Opaque Data ==== DB_PASSWORD: 34 bytes ROOT_PASSWORD: 29 bytes
#Persisten data med PersistentVolumeClaim
Skapa filen mysql-pv.yml.
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
Vi skapar en Volym med 5 gig och ReadWriteOnce så at bara en nod skall kunna använda volymen.
kubectl apply -f mysql-pv.yml kubectl get persistentvolumeclaim mysql-pv-claim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-pv-claim Bound mysql-pv-volume 5Gi RWO manual 66s
#Mysql deployment
Skapa filen mysql-deployment.yml. I den skapar vi en Service, så att Microblogen sen kan koppla upp sig mot databasen.
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
Vi sätter clusterIP: None så att Servicens IP kopplas direkt mot POD:en. Det är att föredra om man bara ska ha en POD bakom en service, vilket vi ska.
Lägg till följande i slutet av filen.
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.7
name: mysql
env:
# Use secret in real usage
- name: MYSQL_USER
value: <user>
- name: MYSQL_DATABASE
value: <db_name>
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: DB_PASSWORD
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: ROOT_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
Vi läser lösenorden från secrets och mountar PV:n vi skapade tidigare. Notera strategy: type: Recreate, det gör att K8s inte gör rolling updates. Vi vill inte använda det för databasen i och med att vi bara vill ha en igång åt gången. Nu kommer POD:en först soppas och en startas en ny med uppdaterade konfiguration.
Nu kan vi starta mysql.
kubectl apply -f mysql-deployment.yml kubectl get pods -l app=mysql NAME READY STATUS RESTARTS AGE mysql-647b4cc668-nwmnm 1/1 Running 0 22s
Ni kan testa koppla upp er till databasen.
kubectl run -it --rm --image=mysql:5.7 --restart=Never mysql-client -- mysql -h mysql -pmy-super-secret-root-password mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | microblog | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql>
Nu har vi en databas i Kubernetes vi kan koppla Microbloggen till.
#Revision history
- 2020-12-03: (A, moc) Skapad inför HT2020.
