WordPress complet
Cet exemple déploie un WordPress complet, prêt pour la production : une base MySQL sur volume persistant, des fichiers WordPress partagés entre 2 replicas, et l’exposition HTTPS avec certificat automatique.
Les manifests de cette page ont été déployés et testés tels quels sur la plateforme. Il ne vous reste qu’à changer le domaine et les mots de passe.
1. Les secrets
apiVersion: v1kind: Secretmetadata: name: wordpress-secretsstringData: MYSQL_ROOT_PASSWORD: "changez-moi-root" MYSQL_PASSWORD: "changez-moi-wp"2. MySQL
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: mysql-dataspec: accessModes: [ReadWriteOnce] storageClassName: ceph-block-rwo resources: requests: storage: 5Gi---apiVersion: apps/v1kind: Deploymentmetadata: name: mysqlspec: replicas: 1 strategy: type: Recreate # volume RWO : jamais 2 pods MySQL simultanés selector: matchLabels: {app: mysql} template: metadata: labels: {app: mysql} spec: containers: - name: mysql image: mysql:8.4 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: {name: wordpress-secrets, key: MYSQL_ROOT_PASSWORD} - name: MYSQL_PASSWORD valueFrom: secretKeyRef: {name: wordpress-secrets, key: MYSQL_PASSWORD} - name: MYSQL_DATABASE value: wordpress - name: MYSQL_USER value: wordpress resources: requests: {cpu: 250m, memory: 512Mi} volumeMounts: - name: data mountPath: /var/lib/mysql volumes: - name: data persistentVolumeClaim: {claimName: mysql-data}---apiVersion: v1kind: Servicemetadata: name: mysqlspec: selector: {app: mysql} ports: [{port: 3306}]3. WordPress
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: wordpress-filesspec: accessModes: [ReadWriteMany] # partagé entre les replicas storageClassName: ceph-filesystem-rwx resources: requests: storage: 5Gi---apiVersion: apps/v1kind: Deploymentmetadata: name: wordpressspec: replicas: 2 selector: matchLabels: {app: wordpress} template: metadata: labels: {app: wordpress} spec: containers: - name: wordpress image: wordpress:6-apache env: - name: WORDPRESS_DB_HOST value: mysql - name: WORDPRESS_DB_NAME value: wordpress - name: WORDPRESS_DB_USER value: wordpress - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: {name: wordpress-secrets, key: MYSQL_PASSWORD} resources: requests: {cpu: 200m, memory: 512Mi} volumeMounts: - name: files mountPath: /var/www/html readinessProbe: httpGet: {path: /wp-login.php, port: 80} initialDelaySeconds: 15 periodSeconds: 10 volumes: - name: files persistentVolumeClaim: {claimName: wordpress-files}---apiVersion: v1kind: Servicemetadata: name: wordpressspec: selector: {app: wordpress} ports: [{port: 80}]4. L’exposition HTTPS
Prérequis : votre domaine pointe vers la plateforme (Configurer votre DNS).
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: wordpress annotations: cert-manager.io/issuer: letsencrypt # Sticky sessions : chaque visiteur reste sur le même pod (cf. encadré) nginx.ingress.kubernetes.io/affinity: "cookie" nginx.ingress.kubernetes.io/session-cookie-name: "wp-affinity"spec: rules: - host: blog.example.com http: paths: - path: / pathType: Prefix backend: service: {name: wordpress, port: {number: 80}} tls: - hosts: [blog.example.com] secretName: wordpress-tlsDéployer
kubectl apply -f wordpress-stack.yaml -n <votre-namespace>
# Suivre le démarrage (~1 minute)kubectl get pods -n <votre-namespace> -wUne fois les pods Running et READY 1/1, ouvrez https://blog.example.com :
l’assistant d’installation WordPress vous accueille.
Coût mensuel estimé
Avec la grille tarifaire (facturé à l’heure, ici ramené à un mois de 720 h) :
| Composant | Requests | Bundles | Coût / mois |
|---|---|---|---|
| MySQL | 250 m / 512 Mi | 3 | 8,64 € |
| WordPress × 2 | 200 m / 512 Mi chacun | 3 × 2 | 17,28 € |
| Stockage | 5 Gi RWO + 5 Gi RWX | — | 7,20 € |
| Total | ≈ 33 € HT / mois |
Sauvegardes quotidiennes, certificat TLS, trafic et monitoring inclus.
Pour aller plus loin
- Réduire le coût d’un environnement de test :
replicas: 1et scale à zéro la nuit (~20 €/mois) ; - Les fichiers et la base sont sauvegardés chaque nuit — ajoutez un dump MySQL en CronJob pour un point de reprise plus fin ;
- Suivez la consommation réelle dans le monitoring et ajustez les requests.