Comment déployer un blog Ghost avec Kubernetes

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