Esercizio: Mysql e Wordpress
Progetto
Acquisizione immagini
Dalla macchina host:
docker pull mysql:5.6
docker tag mysql:5.6 localhost:5000/mysql:5.6
docker push localhost:5000/mysql:5.6
docker pull wordpress:4.8-apache
docker tag wordpress:4.8-apache localhost:5000/wordpress:4.8-apache
docker push localhost:5000/wordpress:4.8-apache
Prima Parte: MySQL
1. MY Namespace
Preparazione della directory con gli scripts specifici di Mysql:
mkdir -p ~/scripts/my
Manifest del namespace, ~/scripts/my/my-ns.yml
:
vim ~/scripts/my/my-ns.yml
kind: Namespace
apiVersion: v1
metadata:
name: mysql-db
labels:
name: mysql-db
Creazione:
kubectl apply -f ~/scripts/my/my-ns.yml
2. MY Persistent Volume
Manifest ~/scripts/my/my-volume.yml
:
vim ~/scripts/my/my-volume.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv-volume
spec:
storageClassName: standard
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/my/
Creazione:
kubectl apply -f ~/scripts/my/my-volume.yml
3. MY Persistent Volume Claim
Manifest ~/scripts/my/my-volclaim.yml
:
vim ~/scripts/my/my-volclaim.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: my-pv-claim
namespace: mysql-db
spec:
volumeName: my-pv-volume
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Creazione:
kubectl apply -f ~/scripts/my/my-volclaim.yml
4. MY Secret
Manifest ~/scripts/my/my-secret.yml
:
vim ~/scripts/my/my-secret.yml
apiVersion: v1
kind: Secret
metadata:
namespace: mysql-db
name: mysql-pass
type: Opaque
data:
# secret
root-password: c2VjcmV0
Creazione:
kubectl apply -f ~/scripts/my/my-secret.yml
5. MY Deployment
Manifest ~/scripts/my/my-deploy.yml
:
vim ~/scripts/my/my-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: mysql-db
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: localhost:5000/mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: root-password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: my-pv-claim
Creazione:
kubectl apply -f ~/scripts/my/my-deploy.yml
6. MY Service
Manifest ~/scripts/my/my-svc.yml
:
vim ~/scripts/my/my-svc.yml
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: mysql-db
labels:
app: wordpress
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 3306
targetPort: 3306
nodePort: 30001
selector:
app: wordpress
tier: mysql
Creazione:
kubectl apply -f scripts/my/my-svc.yml
Test di connessione al database:
kubectl get pods -n mysql-db
NAME READY STATUS RESTARTS AGE
mysql-75c59b6bf6-lb9xs 1/1 Running 0 11m
kubectl exec -ti mysql-75c59b6bf6-lb9xs -n mysql-db -- bash
-c "mysql -u root -p"
Naturalmente com il nome del pod giusto per il nostro caso.
Enter password: secret
....
mysql>
ove la password è secret.
Uscire da mysql e dal pod: \q
Procedure Shell per MySQL
Conviene preparare due procedure shell per il setup e il teardown della componente MySQL del progetto.
~/scripts/my/my-setup.sh
vim ~/scripts/my/my-setup.sh
#! /bin/sh
echo "Starting application: mysql"
kubectl apply -f ~/scripts/my/my-ns.yml
kubectl apply -f ~/scripts/my/my-secret.yml
kubectl apply -f ~/scripts/my/my-volume.yml
kubectl apply -f ~/scripts/my/my-volclaim.yml
kubectl apply -f ~/scripts/my/my-deploy.yml
kubectl apply -f ~/scripts/my/my-svc.yml
echo
echo "Wait up to 120s for Mysql deployment to be ready ..."
kubectl wait deployment -n mysql-db mysql --for condition=Available=True --timeout=120s
echo
echo " MYSQL NOW READY"
echo " ===> Pods running:"
kubectl get pods -n mysql-db
Renderla eseguibile:
chmod +x ~/scripts/my/my-setup.sh
~/scripts/my/my-teardown.sh
vim ~/scripts/my/my-teardown.sh
#! /bin/sh
trap 'echo "Interrupted. Application NOT deleted"; exit 100' SIGINT
echo "About to delete application 'mysql'"
echo "Press Control-C within 10 seconds to interrupt"
sleep 10
kubectl delete -f ~/scripts/my/my-svc.yml
kubectl delete -f ~/scripts/my/my-deploy.yml
kubectl delete -f ~/scripts/my/my-volclaim.yml
kubectl delete -f ~/scripts/my/my-volume.yml
kubectl delete -f ~/scripts/my/my-secret.yml
kubectl delete -f ~/scripts/my/my-ns.yml
echo
echo "Application deleted: mysql"
Renderla eseguibile:
chmod +x ~/scripts/my/my-teardown.sh
Seconda Parte: Wordpress
7. WP Persistent Volume
Preparazione della directory er gli script WordPress:
mkdir ~/scripts/wp
Manifest ~/scripts/wp/wp-volume.yml
:
vim ~/scripts/wp/wp-volume.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: wp-pv-volume
spec:
storageClassName: standard
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/wp/
Creazione:
kubectl apply -f ~/scripts/wp/wp-volume.yml
8. WP Persistent Volume Claim
Manifest ~/scripts/wp/wp-volclaim.yml
:
vim ~/scripts/wp/wp-volclaim.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: wp-pv-claim
spec:
volumeName: wp-pv-volume
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
Creazione:
kubectl apply -f ~/scripts/wp/wp-volclaim.yml
9. WP Secret
Manifest ~/scripts/wp/wp-secret.yml
:
vim ~/scripts/wp/wp-secret.yml
apiVersion: v1
kind: Secret
metadata:
name: mysql-pass
type: Opaque
data:
root-password: c2VjcmV0
Creazione:
kubectl apply -f ~/scripts/wp/wp-secret.yml
10. WP Deployment
Manifest ~/scripts/wp/wp-deploy.yml
:
vim ~/scripts/wp/wp-deploy.yml
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: localhost:5000/wordpress:4.8-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: mysql.mysql-db
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: root-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
Creazione:
kubectl apply -f ~/scripts/wp/wp-deploy.yml
11. WP Service
Manifest ~/scripts/wp/wp-svc.yml
:
vim ~/scripts/wp/wp-svc.yml
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
type: LoadBalancer
ports:
- port: 8080
targetPort: 80
selector:
app: wordpress
tier: frontend
Creazione:
kubectl apply -f ~/scripts/wp/wp-svc.yml
Test di Funzionamento
Vedere l’indirizzo esterno del servizio:
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 132m
wordpress LoadBalancer 10.96.27.200 172.19.255.200 8080:30002/TCP 21m
Aprire un browser e puntarlo a: 172.19.255.200:8080
Si dovrebbe vedere la configurazione iniziale di Wordpress
Procedure Shell per WordPress
Prepariamo due procedure shell per il setup e il teardown della componente WordPress del progetto.
~/scripts/wp/wp-setup.sh
vim ~/scripts/wp/wp-setup.sh
#! /bin/sh
echo "Starting application: wordpress"
kubectl apply -f ~/scripts/wp/wp-secret.yml
kubectl apply -f ~/scripts/wp/wp-volume.yml
kubectl apply -f ~/scripts/wp/wp-volclaim.yml
kubectl apply -f ~/scripts/wp/wp-deploy.yml
kubectl apply -f ~/scripts/wp/wp-svc.yml
echo
echo "Wait up to 120s for Wordpress deployment to be ready ..."
kubectl wait deployment wordpress --for condition=Available=True --timeout=120s
echo
echo " WORDPRESS NOW READY"
echo " ===> Pods running:"
kubectl get pods
echo " ===> Services running:"
kubectl get services
Renderla eseguibile:
chmod +x ~/scripts/wp/wp-setup.sh
~/scripts/wp/wp-teardown.sh
vim ~/scripts/wp/wp-teardown.sh
#! /bin/sh
trap 'echo "Interrupted. Application NOT deleted"; exit 100' SIGINT
echo "About to delete application 'wordpress'"
echo "Press Control-C within 10 seconds to interrupt"
sleep 10
kubectl delete -f ~/scripts/wp/wp-svc.yml
kubectl delete -f ~/scripts/wp/wp-deploy.yml
kubectl delete -f ~/scripts/wp/wp-volclaim.yml
kubectl delete -f ~/scripts/wp/wp-volume.yml
kubectl delete -f ~/scripts/wp/wp-secret.yml
echo
echo "Application deleted: wordpress"
Renderla eseguibile:
chmod +x ~/scripts/wp/wp-teardown.sh