diff --git a/volumes/assets/solution-step1.txt b/volumes/assets/solution-step1.txt new file mode 100644 index 0000000..d779a06 --- /dev/null +++ b/volumes/assets/solution-step1.txt @@ -0,0 +1,4 @@ +Retrouver le mot de passe: + + kubectl get secret mysql -o jsonpath='{.data.password}' | base64 -d + diff --git a/volumes/assets/solution-step2.txt b/volumes/assets/solution-step2.txt new file mode 100644 index 0000000..bc8157a --- /dev/null +++ b/volumes/assets/solution-step2.txt @@ -0,0 +1,8 @@ +Le déploiement possède une image avec un tag non valide + image: nginx: #mettre: nginx:1.9.14 + +Il est possible d'utiliser un outil tel que vim pour remplacer nginx: en nginx:1.9.14 + +Pour appliquer le changement d'un fichier yaml, utiliser kubectl apply -f frontend.yaml + +echo 'kubectl apply -f frontend.yaml' > res-step2 \ No newline at end of file diff --git a/volumes/assets/volume/mysql-service.yaml b/volumes/assets/volume/mysql-service.yaml new file mode 100644 index 0000000..402d94f --- /dev/null +++ b/volumes/assets/volume/mysql-service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: mysql + labels: + app: mysql +spec: + type: ClusterIP + ports: + - port: 3306 + selector: + app: mysql \ No newline at end of file diff --git a/volumes/assets/volume/mysql-volumeclaim.yaml b/volumes/assets/volume/mysql-volumeclaim.yaml new file mode 100644 index 0000000..93bd8bc --- /dev/null +++ b/volumes/assets/volume/mysql-volumeclaim.yaml @@ -0,0 +1,10 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: mysql-volumeclaim +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi \ No newline at end of file diff --git a/volumes/assets/volume/mysql.yaml b/volumes/assets/volume/mysql.yaml new file mode 100644 index 0000000..8034496 --- /dev/null +++ b/volumes/assets/volume/mysql.yaml @@ -0,0 +1,42 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mysql + labels: + app: mysql +spec: + strategy: + type: Recreate + replicas: 1 + selector: + matchLabels: + app: mysql + template: + metadata: + labels: + app: mysql + spec: + containers: + - image: mysql:5.6 + name: mysql + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: mysql + key: password + ports: + - containerPort: 3306 + name: mysql + volumeMounts: + - name: mysql-persistent-storage + mountPath: /var/lib/mysql + resources: + requests: + memory: 400Mi + limits: + cpu: 0.1 + volumes: + - name: mysql-persistent-storage + persistentVolumeClaim: + claimName: mysql-volumeclaim \ No newline at end of file diff --git a/volumes/assets/volume/wordpress-service.yaml b/volumes/assets/volume/wordpress-service.yaml new file mode 100644 index 0000000..6002267 --- /dev/null +++ b/volumes/assets/volume/wordpress-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: wordpress + name: wordpress +spec: + type: NodePort + ports: + - port: 80 + targetPort: 80 + nodePort: 30000 + protocol: TCP + selector: + app: wordpress \ No newline at end of file diff --git a/volumes/assets/volume/wordpress-volumeclaim.yaml b/volumes/assets/volume/wordpress-volumeclaim.yaml new file mode 100644 index 0000000..6419307 --- /dev/null +++ b/volumes/assets/volume/wordpress-volumeclaim.yaml @@ -0,0 +1,10 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: wordpress-volumeclaim +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi \ No newline at end of file diff --git a/volumes/assets/volume/wordpress.yaml b/volumes/assets/volume/wordpress.yaml new file mode 100644 index 0000000..1c19b81 --- /dev/null +++ b/volumes/assets/volume/wordpress.yaml @@ -0,0 +1,41 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: wordpress + labels: + app: wordpress +spec: + replicas: 1 + selector: + matchLabels: + app: wordpress + template: + metadata: + labels: + app: wordpress + spec: + containers: + - image: wordpress + name: wordpress + env: + - name: WORDPRESS_DB_HOST + value: mysql:3306 + - name: WORDPRESS_DB_PASSWORD + valueFrom: + secretKeyRef: + name: mysql + key: password + ports: + - containerPort: 80 + name: wordpress + volumeMounts: + - name: wordpress-persistent-storage + mountPath: /var/www/html + resources: + limits: + cpu: 0.1 + memory: "50Mi" + volumes: + - name: wordpress-persistent-storage + persistentVolumeClaim: + claimName: wordpress-volumeclaim \ No newline at end of file diff --git a/volumes/background.sh b/volumes/background.sh new file mode 100644 index 0000000..3395065 --- /dev/null +++ b/volumes/background.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +true diff --git a/volumes/foreground.sh b/volumes/foreground.sh new file mode 100644 index 0000000..09355c8 --- /dev/null +++ b/volumes/foreground.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +echo "Welcome to the Sfeir School Volume scenario" +echo " Enjoy :-)" + diff --git a/volumes/index.json b/volumes/index.json new file mode 100644 index 0000000..436ea25 --- /dev/null +++ b/volumes/index.json @@ -0,0 +1,40 @@ +{ + "title": "Volume", + "description": "Gérer les données dans Kubernetes", + "details": { + "intro": { + "text": "intro.md", + "background": "background.sh", + "foreground": "foreground.sh" + }, + "steps": [ + { + "title": "Créer un secret pour la base de données", + "text": "step1/step1.md", + "verify": "step1/verify.sh" + }, + { + "title": "Déployer un Wordpress complet", + "text": "step2/step2.md", + "verify": "step2/verify.sh" + }, + { + "title": "Détruire et relancer des pods", + "text": "step3/step3.md" + }, + { + "title": "Nettoyage", + "text": "step4/step4.md", + "verify": "step4/verify.sh" + } + ], + "assets": { + "host01": [ + {"file": "volume/*", "target": "/root", "chmod": "+w"} + ] + } + }, + "backend": { + "imageid": "kubernetes-kubeadm-1node" + } + } \ No newline at end of file diff --git a/volumes/intro.md b/volumes/intro.md new file mode 100644 index 0000000..d76c5f7 --- /dev/null +++ b/volumes/intro.md @@ -0,0 +1,5 @@ +# Volumes + +Les fichiers sur disque dans un conteneur sont éphémères, ce qui présente des problèmes pour des applications non-triviales lorsqu'elles s'exécutent dans des conteneurs. Premièrement, lorsqu'un conteneur plante, kubelet va le redémarrer mais les fichiers seront perdus - le conteneur démarre avec un état propre. Deuxièmement, lorsque plusieurs conteneurs s'exécutent ensemble dans un `Pod`, il est souvent nécessaire de partager des fichiers entre ces conteneurs. L'abstraction Kubernetes `Volume` résout ces deux problèmes. + +Le but de ce TP est de déployer une stack Wordpress complète avec une base de données MySQL. diff --git a/volumes/step1/step1.md b/volumes/step1/step1.md new file mode 100644 index 0000000..cdf5e48 --- /dev/null +++ b/volumes/step1/step1.md @@ -0,0 +1,36 @@ +## 1/ Créer un secret pour votre base de données + +Executer la commande suivante: +``` +kubectl create secret generic mysql --from-literal=password=$(openssl rand -hex 12) +```{{exec}} + +### Question ? + +- Quelle est le mot de passe généré ? + +Indices pour le retrouver: + +1. Afficher le secret en format YAML + +``` +kubectl get secret mysql -o yaml +```{{exec}} + +2. Dans ce yamml, repérer le chemin de l'élément qui contient le mot de passe, et l'extraire avec le paramètre _jsonpath_ de kubectl + +``` +kubectl get secret mysql -o jsonpath='{.mon.chemin.ici}' +``` + +3. Attention, la valeur est encodée en base64, il faut donc la décoder: + +``` +echo 'mon_MoT_de_PaSsE_enCOde==' | base64 -d +``` + +- Ecrire la valeur de ce mot de passe dans le fichier /tmp/res-step1 + +> vous pouvez utiliser la commande `echo '..mot_de_passe_trouvé..' > /tmp/res-step1` + + diff --git a/volumes/step1/verify.sh b/volumes/step1/verify.sh new file mode 100644 index 0000000..e69141e --- /dev/null +++ b/volumes/step1/verify.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +grep $(kubectl get secret mysql -o jsonpath='{.data.password}' | base64 -d) /tmp/res-step1 diff --git a/volumes/step2/step2.md b/volumes/step2/step2.md new file mode 100644 index 0000000..da910c9 --- /dev/null +++ b/volumes/step2/step2.md @@ -0,0 +1,61 @@ +## 1/ Créer les volumes +Appliquer ces 2 commandes + +``` +kubectl apply -f volume/mysql-volumeclaim.yaml +kubectl apply -f volume/wordpress-volumeclaim.yaml +```{{exec}} + +## 2/ Créer ma base de données MySQL +Les descripteurs permettant de déployer une base de données sont founis dans le TP. Les examiner et les appliquer: + +``` +cat volume/mysql.yaml +```{{exec}} + +``` +kubectl apply -f volume/mysql.yaml +```{{exec}} + +``` +cat volume/mysql-service.yaml +```{{exec}} + +``` +kubectl apply -f volume/mysql-service.yaml +```{{exec}} + + +## 3/ Créer l'instance Wordpress et l'exposer +Les descripteurs sont founis dans le TP. Les examiner et les appliquer: + +``` +cat volume/wordpress.yaml +```{{exec}} + +``` +kubectl apply -f volume/wordpress.yaml +```{{exec}} + +``` +cat volume/wordpress-service.yaml +```{{exec}} + +``` +kubectl apply -f volume/wordpress-service.yaml +```{{exec}} + + +## 4/ Accédez à votre wordpress + +``` +curl http://$(kubectl get service wordpress -o jsonpath="{.status.loadBalancer.ingress[0].ip}") +```{{exec}} + +### Challenge + +Accédez à l'application depuis votre navigateur +- Trouver l'IP +- Se connecter en http + + diff --git a/volumes/step2/verify.sh b/volumes/step2/verify.sh new file mode 100644 index 0000000..3395065 --- /dev/null +++ b/volumes/step2/verify.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +true diff --git a/volumes/step3/step3.md b/volumes/step3/step3.md new file mode 100644 index 0000000..325a89e --- /dev/null +++ b/volumes/step3/step3.md @@ -0,0 +1,12 @@ +## 1/ Détruire des pods mysql et wordpress + +``` +kubectl delete pods -l="app=mysql" +```{{exec}} + +``` +kubectl delete pods -l="app=wordpress" +```{{exec}} + +### Question ? +Que se passe-t-il ? (un peu de patience quand même ;) ) diff --git a/volumes/step3/verify.sh b/volumes/step3/verify.sh new file mode 100644 index 0000000..3395065 --- /dev/null +++ b/volumes/step3/verify.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +true diff --git a/volumes/step4/step4.md b/volumes/step4/step4.md new file mode 100644 index 0000000..b1f26e0 --- /dev/null +++ b/volumes/step4/step4.md @@ -0,0 +1,12 @@ +## 1/ Nettoyer l'environnement + +Effacer tous les objets crées. + +``` +kubectl delete service wordpress +kubectl delete deployment wordpress +kubectl delete pvc wordpress +kubectl delete service mysql +kubectl delete deployment mysql +kubectl delete pvc mysql +```{{exec}} diff --git a/volumes/step4/verify.sh b/volumes/step4/verify.sh new file mode 100644 index 0000000..3395065 --- /dev/null +++ b/volumes/step4/verify.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +true