Déploiement de linkding

Linkding est un gestionnaire de marquepage pour navigateur.

Préparation du terrain

On crée un dossier linkding :

mkdir linkding

Créons le namespace :

k create namespace

ou :

# linkding/namespace.yml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: linkding
spec: {}
status: {}

puis :

k apply -f linkding/namespace.yaml

Déploiement

Il y a seulement un docker-compose.yml disposition :

# linkding/namespace.yml
services:
  linkding:
    container_name: "${LD_CONTAINER_NAME:-linkding}"
    image: sissbruecker/linkding:latest
    ports:
      - "${LD_HOST_PORT:-9090}:9090"
    volumes:
      - "${LD_HOST_DATA_DIR:-./data}:/etc/linkding/data"
    env_file:
      - .env
    restart: unless-stopped

Transformons le en déploiement kubernetes :

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: linkding
  name: linkding
spec:
  replicas: 1
  selector:
    matchLabels:
      app: linkding
  strategy: {}
  template:
    metadata:
      labels:
        app: linkding
    spec:
      containers:
        - image: sissbruecker/linkding:1.43.0
          name: linkding
          ports:
            - containerPort: 9090

et appliquons

k apply -f linkding/deploy.yaml

Testons avec un port-forward :

k port-forward pods/linkding-5f55c54b4d-zn6gf 9090

Ça marche dans le browser !

Persistent Volume Claim

Création du stockage

# linkding/storage.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: linkding-data
  namespace: linkding
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi

Appliquons :

k apply -f linkding/storage.yaml

Utilisation du persistent volume claim dans notre déploiement

# linkding/deploy.yaml
# ...
spec:
  containers:
    - image: sissbruecker/linkding:1.43.0
      name: linkding
      ports:
        - containerPort: 9090
      volumeMounts:
        - name: linkding-data
          mountPath: /etc/linkding/data
  volumes:
    - name: linkding-data
      persistentVolumeClaim:
        claimName: linkding-data

Redéployons :

k apply -f linkding/deploy.yaml

Port-forwardons, créons un lien, pétons le pod et voyons si on retrouve le lien

k port-forward pods/linkding-6b46c8469-n7hng 9090

Créons le superutilisateur :

k exec -it linkding-6b46c8469-n7hng -c linkding -- python manage.py createsuperuser --username=joe --email=joe@example.com
Password: #joepassword
Password (again):
Superuser created successfully.
k delete pod linkding-6b46c8469-nk2lq

Le pod est à nouveau déployé et on retrouve notre lien

Service

On crée un service de type LoadBalancer :

# linkding/service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: linkding
  name: linkding
  namespace: linkding
spec:
  ports:
    - port: 9090
      protocol: TCP
      targetPort: 9090
  selector:
    app: linkding
  type: LoadBalancer

Déployons :

k apply -f linkding/service.yaml

Et port-forwardons notre service :

k port-forward services/linkding 9090

Nous avons accès à notre instance linkding !