Esercizio: Mysql e Wordpress

Progetto

Pgprog

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