diff --git a/debian/README.md b/boxes/debian/README.md similarity index 100% rename from debian/README.md rename to boxes/debian/README.md diff --git a/debian/Vagrantfile b/boxes/debian/Vagrantfile similarity index 100% rename from debian/Vagrantfile rename to boxes/debian/Vagrantfile diff --git a/debian/shared/.gitkeep b/boxes/debian/shared/.gitkeep similarity index 100% rename from debian/shared/.gitkeep rename to boxes/debian/shared/.gitkeep diff --git a/debian/shared/k3s.yaml b/boxes/debian/shared/k3s.yaml similarity index 100% rename from debian/shared/k3s.yaml rename to boxes/debian/shared/k3s.yaml diff --git a/debian/shared/token b/boxes/debian/shared/token similarity index 100% rename from debian/shared/token rename to boxes/debian/shared/token diff --git a/ubuntu/README.md b/boxes/ubuntu/README.md similarity index 100% rename from ubuntu/README.md rename to boxes/ubuntu/README.md diff --git a/ubuntu/Vagrantfile b/boxes/ubuntu/Vagrantfile similarity index 100% rename from ubuntu/Vagrantfile rename to boxes/ubuntu/Vagrantfile diff --git a/ubuntu/k3s_control.sh b/boxes/ubuntu/k3s_control.sh similarity index 100% rename from ubuntu/k3s_control.sh rename to boxes/ubuntu/k3s_control.sh diff --git a/ubuntu/k3s_worker.sh b/boxes/ubuntu/k3s_worker.sh similarity index 100% rename from ubuntu/k3s_worker.sh rename to boxes/ubuntu/k3s_worker.sh diff --git a/ubuntu/libvirtVagrantfile b/boxes/ubuntu/libvirtVagrantfile similarity index 100% rename from ubuntu/libvirtVagrantfile rename to boxes/ubuntu/libvirtVagrantfile diff --git a/ubuntu/shared/.gitkeep b/boxes/ubuntu/shared/.gitkeep similarity index 100% rename from ubuntu/shared/.gitkeep rename to boxes/ubuntu/shared/.gitkeep diff --git a/ubuntu/shared/k3s.yaml b/boxes/ubuntu/shared/k3s.yaml similarity index 100% rename from ubuntu/shared/k3s.yaml rename to boxes/ubuntu/shared/k3s.yaml diff --git a/ubuntu/shared/token b/boxes/ubuntu/shared/token similarity index 100% rename from ubuntu/shared/token rename to boxes/ubuntu/shared/token diff --git a/exemples/practica-final/01-secret.yaml b/exemples/practica-final/01-secret.yaml index eead3e7..2c31c9e 100644 --- a/exemples/practica-final/01-secret.yaml +++ b/exemples/practica-final/01-secret.yaml @@ -4,4 +4,4 @@ metadata: name: credencials-bd type: Opaque data: - password: c3VwZXJzZWNyZXQ= # "supersecret" en base64 + password: c3VwZXJzZWNyZXQ= # "supersecret" en base64 \ No newline at end of file diff --git a/exemples/practica-final/02-pvcs.yaml b/exemples/practica-final/02-pvcs.yaml index b068309..02b039f 100644 --- a/exemples/practica-final/02-pvcs.yaml +++ b/exemples/practica-final/02-pvcs.yaml @@ -1,16 +1,5 @@ apiVersion: v1 kind: PersistentVolumeClaim -metadata: - name: mariadb-pvc -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 2Gi ---- -apiVersion: v1 -kind: PersistentVolumeClaim metadata: name: wordpress-pvc spec: @@ -18,4 +7,4 @@ spec: - ReadWriteOnce resources: requests: - storage: 2Gi + storage: 2Gi \ No newline at end of file diff --git a/exemples/practica-final/03-mariadb.yaml b/exemples/practica-final/03-mariadb.yaml index 72d918c..53d93aa 100644 --- a/exemples/practica-final/03-mariadb.yaml +++ b/exemples/practica-final/03-mariadb.yaml @@ -1,37 +1,29 @@ -apiVersion: apps/v1 -kind: Deployment +apiVersion: v1 +kind: ConfigMap metadata: - name: mariadb-deployment -spec: - replicas: 1 - selector: - matchLabels: - app: mariadb - template: - metadata: - labels: - app: mariadb - spec: - containers: - - name: mariadb - image: mariadb:lts-ubi - env: - - name: MARIADB_ROOT_PASSWORD - valueFrom: - secretKeyRef: - name: credencials-bd - key: password - - name: MARIADB_DATABASE - value: "wordpress" - ports: - - containerPort: 3306 - volumeMounts: - - name: dades-bd - mountPath: /var/lib/mysql - volumes: - - name: dades-bd - persistentVolumeClaim: - claimName: mariadb-pvc + name: mariadb-configmap +data: + primary.cnf: | + [mariadb] + log-bin + log-basename=my-mariadb + + replica.cnf: | + [mariadb] + log-basename=my-mariadb + + primary.sql: | + CREATE USER 'repluser'@'%' IDENTIFIED BY 'replsecret'; + GRANT REPLICATION REPLICA ON *.* TO 'repluser'@'%'; + CREATE DATABASE IF NOT EXISTS wordpress; + + secondary.sql: | + CHANGE MASTER TO + MASTER_HOST='mariadb-sts-0.servei-mariadb.default.svc.cluster.local', + MASTER_USER='repluser', + MASTER_PASSWORD='replsecret', + MASTER_CONNECT_RETRY=10; + START SLAVE; --- apiVersion: v1 kind: Service @@ -44,3 +36,87 @@ spec: - protocol: TCP port: 3306 targetPort: 3306 + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: mariadb-sts +spec: + serviceName: "servei-mariadb" + replicas: 3 + selector: + matchLabels: + app: mariadb + template: + metadata: + labels: + app: mariadb + spec: + initContainers: + - name: init-mariadb + image: mariadb:lts-ubi + command: + - bash + - "-c" + - | + set -ex + echo 'Starting init-mariadb' + ls /mnt/config-map + [[ `hostname` =~ -([0-9]+)$ ]] || exit 1 + ordinal=${BASH_REMATCH[1]} + if [[ $ordinal -eq 0 ]]; then + cp /mnt/config-map/primary.cnf /etc/mysql/conf.d/server-id.cnf + cp /mnt/config-map/primary.sql /docker-entrypoint-initdb.d + else + cp /mnt/config-map/replica.cnf /etc/mysql/conf.d/server-id.cnf + cp /mnt/config-map/secondary.sql /docker-entrypoint-initdb.d + fi + echo server-id=$((3000 + ordinal)) >> /etc/mysql/conf.d/server-id.cnf + ls /etc/mysql/conf.d/ + cat /etc/mysql/conf.d/server-id.cnf + volumeMounts: + - name: mariadb-config-map + mountPath: /mnt/config-map + - name: mariadb-config + mountPath: /etc/mysql/conf.d/ + - name: initdb + mountPath: /docker-entrypoint-initdb.d + containers: + - name: mariadb + image: mariadb:lts-ubi + ports: + - containerPort: 3306 + name: mariadb-port + env: + - name: MARIADB_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: credencials-bd + key: password + - name: MYSQL_INITDB_SKIP_TZINFO + value: "1" + volumeMounts: + - name: datadir + mountPath: /var/lib/mysql + - name: mariadb-config + mountPath: /etc/mysql/conf.d/ + - name: initdb + mountPath: /docker-entrypoint-initdb.d + volumes: + - name: mariadb-config-map + configMap: + name: mariadb-configmap + - name: mariadb-config + emptyDir: {} + - name: initdb + emptyDir: {} + volumeClaimTemplates: + - metadata: + name: datadir + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi \ No newline at end of file diff --git a/exemples/practica-final/04-wordpress.yaml b/exemples/practica-final/04-wordpress.yaml index 41e881f..decb454 100644 --- a/exemples/practica-final/04-wordpress.yaml +++ b/exemples/practica-final/04-wordpress.yaml @@ -17,16 +17,16 @@ spec: image: wordpress:latest env: - name: WORDPRESS_DB_HOST - value: "servei-mariadb" # Apunta al nom del Service de MariaDB + value: "mariadb-sts-0.servei-mariadb.default.svc.cluster.local" # Apunta al pod primari de MariaDB - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: credencials-bd key: password - name: WORDPRESS_DB_USER - value: "root" + value: "root" - name: WORDPRESS_DB_NAME - value: "wordpress" + value: "wordpress" ports: - containerPort: 80 volumeMounts: @@ -47,4 +47,4 @@ spec: ports: - protocol: TCP port: 80 - targetPort: 80 + targetPort: 80 \ No newline at end of file diff --git a/exemples/practica-final/README.md b/exemples/practica-final/README.md index 08edf3f..ee9d473 100644 --- a/exemples/practica-final/README.md +++ b/exemples/practica-final/README.md @@ -1,29 +1,41 @@ # Pràctica final -Carpeta que agrupa els manifests per una pràctica completa (WordPress + MariaDB) amb secrets, PVCs, base de dades i ingress. +Carpeta que agrupa els manifests per una pràctica completa de WordPress + MariaDB amb replicació. + +Aquesta pràctica desplega: +- MariaDB en un `StatefulSet` de 3 rèpliques amb replicació. +- WordPress connectat al node primari de MariaDB. +- Un Ingress per exposar l'aplicació a `elmeublog.local`. Prerequisits - Controlador d'Ingress actiu (traefik, nginx-ingress, etc.). -- `kubectl` configurat. -- StorageClass per proveir PVCs. +- `kubectl` configurat al cluster. +- StorageClass disponible per proveir els PVCs. +- Opcional: afegir `127.0.0.1 elmeublog.local` al teu `/etc/hosts` si fas servir un cluster local. Ordre d'aplicació recomanat -1. `01-secret.yaml` — Crear `Secret` amb credencials. -2. `02-pvcs.yaml` — Crear `PersistentVolumeClaim` per MariaDB i WordPress. -3. `03-mariadb.yaml` — Desplegar MariaDB. -4. `04-wordpress.yaml` — Desplegar WordPress connectat a MariaDB. -5. `05-ingress.yaml` — Crear Ingress per exposar l'aplicació. +1. `kubectl apply -f exemples/practica-final/01-secret.yaml` +2. `kubectl apply -f exemples/practica-final/02-pvcs.yaml` # crea el PVC per WordPress +3. `kubectl apply -f exemples/practica-final/03-mariadb.yaml` +4. `kubectl apply -f exemples/practica-final/04-wordpress.yaml` +5. `kubectl apply -f exemples/practica-final/05-ingress.yaml` + +Aquest ordre garanteix que el Secret i el volum de WordPress existeixin abans de desplegar MariaDB i WordPress. MariaDB crea els seus volums amb `volumeClaimTemplates` dins del `StatefulSet`. Com aplicar tot junt ```bash kubectl apply -f exemples/practica-final/install.yaml ``` +Accés +- Navega a `http://elmeublog.local` després de desplegar l'Ingress. + Neteja ```bash kubectl delete -f exemples/practica-final/install.yaml ``` Notes -- Revisa que els secrets (usuaris/contrassenyes) i les connexions (host/port) entre WordPress i MariaDB estiguin correctes abans d'executar la pràctica. -- Si utilitzes hostnames en l'Ingress, afegeix les entrades corresponents al teu `/etc/hosts` o DNS de desenvolupament. +- WordPress es connecta directament al pod primari de MariaDB: `mariadb-sts-0.servei-mariadb.default.svc.cluster.local`. +- La MariaDB es desplega com a `StatefulSet` de 3 rèpliques amb configuració de primari/secundari. +- Si l'Ingress no funciona, revisa que el controlador estigui actiu i que el host `elmeublog.local` estigui resoluble. diff --git a/exemples/practica-final/install.yaml b/exemples/practica-final/install.yaml index 467e00c..dbff324 100644 --- a/exemples/practica-final/install.yaml +++ b/exemples/practica-final/install.yaml @@ -8,17 +8,6 @@ data: --- apiVersion: v1 kind: PersistentVolumeClaim -metadata: - name: mariadb-pvc -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 2Gi ---- -apiVersion: v1 -kind: PersistentVolumeClaim metadata: name: wordpress-pvc spec: @@ -28,40 +17,32 @@ spec: requests: storage: 2Gi --- -apiVersion: apps/v1 -kind: Deployment +apiVersion: v1 +kind: ConfigMap metadata: - name: mariadb-deployment -spec: - replicas: 1 - selector: - matchLabels: - app: mariadb - template: - metadata: - labels: - app: mariadb - spec: - containers: - - name: mariadb - image: mariadb:lts-ubi - env: - - name: MARIADB_ROOT_PASSWORD - valueFrom: - secretKeyRef: - name: credencials-bd - key: password - - name: MARIADB_DATABASE - value: "wordpress" - ports: - - containerPort: 3306 - volumeMounts: - - name: dades-bd - mountPath: /var/lib/mysql - volumes: - - name: dades-bd - persistentVolumeClaim: - claimName: mariadb-pvc + name: mariadb-configmap +data: + primary.cnf: | + [mariadb] + log-bin + log-basename=my-mariadb + + replica.cnf: | + [mariadb] + log-basename=my-mariadb + + primary.sql: | + CREATE USER 'repluser'@'%' IDENTIFIED BY 'replsecret'; + GRANT REPLICATION REPLICA ON *.* TO 'repluser'@'%'; + CREATE DATABASE IF NOT EXISTS wordpress; + + secondary.sql: | + CHANGE MASTER TO + MASTER_HOST='mariadb-sts-0.servei-mariadb.default.svc.cluster.local', + MASTER_USER='repluser', + MASTER_PASSWORD='replsecret', + MASTER_CONNECT_RETRY=10; + START SLAVE; --- apiVersion: v1 kind: Service @@ -74,6 +55,90 @@ spec: - protocol: TCP port: 3306 targetPort: 3306 + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: mariadb-sts +spec: + serviceName: "servei-mariadb" + replicas: 3 + selector: + matchLabels: + app: mariadb + template: + metadata: + labels: + app: mariadb + spec: + initContainers: + - name: init-mariadb + image: mariadb:lts-ubi + command: + - bash + - "-c" + - | + set -ex + echo 'Starting init-mariadb' + ls /mnt/config-map + [[ `hostname` =~ -([0-9]+)$ ]] || exit 1 + ordinal=${BASH_REMATCH[1]} + if [[ $ordinal -eq 0 ]]; then + cp /mnt/config-map/primary.cnf /etc/mysql/conf.d/server-id.cnf + cp /mnt/config-map/primary.sql /docker-entrypoint-initdb.d + else + cp /mnt/config-map/replica.cnf /etc/mysql/conf.d/server-id.cnf + cp /mnt/config-map/secondary.sql /docker-entrypoint-initdb.d + fi + echo server-id=$((3000 + ordinal)) >> /etc/mysql/conf.d/server-id.cnf + ls /etc/mysql/conf.d/ + cat /etc/mysql/conf.d/server-id.cnf + volumeMounts: + - name: mariadb-config-map + mountPath: /mnt/config-map + - name: mariadb-config + mountPath: /etc/mysql/conf.d/ + - name: initdb + mountPath: /docker-entrypoint-initdb.d + containers: + - name: mariadb + image: mariadb:lts-ubi + ports: + - containerPort: 3306 + name: mariadb-port + env: + - name: MARIADB_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: credencials-bd + key: password + - name: MYSQL_INITDB_SKIP_TZINFO + value: "1" + volumeMounts: + - name: datadir + mountPath: /var/lib/mysql + - name: mariadb-config + mountPath: /etc/mysql/conf.d/ + - name: initdb + mountPath: /docker-entrypoint-initdb.d + volumes: + - name: mariadb-config-map + configMap: + name: mariadb-configmap + - name: mariadb-config + emptyDir: {} + - name: initdb + emptyDir: {} + volumeClaimTemplates: + - metadata: + name: datadir + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi --- apiVersion: apps/v1 kind: Deployment @@ -94,16 +159,16 @@ spec: image: wordpress:latest env: - name: WORDPRESS_DB_HOST - value: "servei-mariadb" # Apunta al nom del Service de MariaDB + value: "mariadb-sts-0.servei-mariadb.default.svc.cluster.local" # Apunta al pod primari de MariaDB - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: credencials-bd key: password - name: WORDPRESS_DB_USER - value: "root" + value: "root" - name: WORDPRESS_DB_NAME - value: "wordpress" + value: "wordpress" ports: - containerPort: 80 volumeMounts: