Comment déployer un blog Ghost avec Kubernetes
Pour ce premier post, je vous propose de vous montrer comment nous avons déployé un nouveau gestionnaire de blogs "Ghost" pour Groupe CREATIVE.
Présentation
Documentation : https://ghost.org/docs/
Ghost est un moteur de bloglibre et open source écrit en JavaScript et distribué sous licence MIT. Ghost est conçu pour simplifier le processus de publication en ligne par des blogueurs. (Wikipedia)
Disponible sous forme d'image Docker (Docker Hub), Ghost peut être très simple à déployer si vous disposez déjà d'une infrastructure pour gérer vos applications Docker.
Nous utilisons ici Kubernetes pour déployer Ghost.
Prérequis
SGBD
Ghost nécessite une base de donnée, nous avons utilisé ici MariaDB
Nous ne traiterons pas ici du déploiement d'une instance MariaDB pour accueillir la BDD de Ghost.
Pour créer une base de données de tests
CREATE USER IF NOT EXISTS "ghost"@"%" IDENTIFIED BY "ghost";
DROP DATABASE IF EXISTS ghost;
CREATE DATABASE ghost CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON ghost.* TO "ghost"@"%";
PV / PVC
Une partie des données doit être persisté sur un système de fichier, cette étape passe par la création d'un PV et d'un PVC côté Kubernetes (cette étape étant dépendante de votre infrastructure, elle ne sera pas détaillée ici)
SMTP
Ghost nécessite un serveur SMTP pour envoyer des mails (nécessaire pour inviter des utilisateurs en tant qu'éditeurs / administrateurs)
Déploiement
Configmap
Fichier de configuration de Ghost
---
apiVersion: v1
kind: ConfigMap
metadata:
name: ghost-config
namespace: ghost
data:
config.k8s.json: |
{
"url": "http://blog.ghost.k8s",
"server": {
"port": 2368,
"host": "0.0.0.0"
},
"database": {
"client": "mysql",
"connection": {
"host": "mariadb-host",
"port": 3306,
"user": "ghost",
"password": "ghost",
"database": "ghost"
}
},
"logging": {
"transports": [
"file",
"stdout"
]
},
"mail": {
"from": "mail_from@groupe-creative.fr",
"transport": "SMTP",
"options": {
"host": "smtp-host",
"port": xxxx
}
},
"process": "systemd",
"paths": {
"contentPath": "/var/lib/ghost/content"
}
}
Deployment
Fichier de déploiement de Ghost
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ghost
namespace: ghost
labels:
app.kubernetes.io/name: ghost
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: ghost
template:
metadata:
labels:
app.kubernetes.io/name: ghost
spec:
volumes:
- name: ghost-pv-claim
persistentVolumeClaim:
claimName: ghost-pv-claim
- name: ghost-config
configMap:
name: ghost-config
items:
- key: config.k8s.json
path: config.k8s.json
containers:
- name: ghost
image: ghost:4.36.3-alpine
imagePullPolicy: Always
ports:
- name: http
containerPort: 2368
volumeMounts:
- mountPath: "/var/lib/ghost/content"
name: ghost-pv-claim
subPath: ghost
- name: ghost-config
mountPath: "/var/lib/ghost/config.production.json"
subPath: config.k8s.json
Service
Service permettant d'accéder à Ghost (mode cluster IP)
---
apiVersion: v1
kind: Service
metadata:
name: ghost
namespace: ghost
spec:
ports:
- name: ghost-http
port: 2368
selector:
app.kubernetes.io/name: ghost
Ingress
Pour exposer Ghost
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ghost
namespace: ghost
spec:
rules:
- host: blog.ghost.k8s
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ghost
port:
number: 2368
Test
Vous pouvez maintenant accéder à Ghost : http://blog.ghost.k8s
Vous pouvez également accéder à l'interface d'administration de Ghost : http://blog.ghost.k8s/ghost