web-dev-qa-db-fra.com

Comment monter un volume postgresql en utilisant Aws EBS dans Kubernetes

  1. J'ai d'abord créé le volume persistant (EBS 10G) et la revendication de volume persistant correspondante. Mais quand j'essaie de déployer les pods postgresql comme ci-dessous (fichier yaml):

test-postgresql.yaml

Recevez les erreurs du pod:

initdb: le répertoire "/ var/lib/postgresql/data" existe mais n'est pas vide Il contient un répertoire perdu + trouvé, peut-être parce qu'il s'agit d'un point de montage. L'utilisation directe d'un point de montage comme répertoire de données n'est pas recommandée. Créez un sous-répertoire sous le point de montage.

Pourquoi le pod ne peut pas utiliser ce chemin? J'ai essayé les mêmes tests sur minikube. Je n'ai rencontré aucun problème.

  1. J'ai essayé de changer le chemin du répertoire de montage du volume en "/ var/lib/test/data", les pods peuvent être en cours d'exécution. J'ai créé une nouvelle table et quelques données dessus, puis j'ai tué ce pod. Kubernete a créé un nouveau pod. Mais le nouveau n'a pas conservé les données et le tableau précédents.

Alors, comment monter correctement un volume postgresql en utilisant Aws EBS dans Kubernete, ce qui permet aux pods recréés de réutiliser la base de données initiale stockée dans EBS?

17
X.J

Alors, comment monter correctement un volume postgresql en utilisant Aws EBS

Vous êtes sur la bonne voie ...

L'erreur que vous obtenez est due au fait que vous souhaitez utiliser le dossier racine du volume monté / en tant que répertoire de données postgresql et postgresql se plaignent qu'il n'est pas recommandé de le faire car il n'est pas vide et contient déjà des données à l'intérieur (à savoir lost+found répertoire).

Il est préférable de localiser le répertoire de données dans un sous-dossier vide distinct (/postgres par exemple) et donner une ardoise propre à postgresql lors de la création de sa structure de fichiers. Vous n'avez pas eu la même chose sur le mini-cube car vous avez probablement monté un dossier Host qui n'avait rien à l'intérieur (était vide) et n'a pas déclenché une telle plainte.

Pour ce faire, vous auriez besoin initialement vide subPath de votre volume (vide /postgres sous-dossier sur votre PV par exemple) monté au point de montage approprié (/var/lib/posgresql/data) dans votre pod. Notez que vous pouvez nommer subPath et dossier de point de montage du même nom, ils sont différents ici juste comme exemple où test-db-volume/postgres le dossier serait monté sur le pod dans /var/lib/postgresql/data dossier:

...
volumeMounts:
- mountPath: /var/lib/postgresql/data
  name: test-db-volume
  subPath: postgres
...
24
Const

J'ai corrigé cela en disant à postgres où je veux que la base de données soit créée avec l'env PGDATA. Il crée le répertoire vide et inits la base de données. Si vous ne l'avez pas, cela suppose que vous voulez le créer dans le répertoire de montage de la pièce qui pour moi avait le répertoire; ost + found que postgres n'a pas aimé

containers:
  - name: postgres
    imagePullPolicy: Always
    image: postgres:9.6
    ports:
    - containerPort: 5432
      name: postgres
    env:
    - name: POSTGRES_DB
      value: "mydb"
    - name: PGDATA
      value: /var/lib/postgresql/data/pgdata
    volumeMounts:
      - mountPath: /var/lib/postgresql/data
        name: postgres-data
1
Martin Naughton

c'est de la description de dockerhub ...

PGDATA Cette variable facultative peut être utilisée pour définir un autre emplacement - comme un sous-répertoire - pour les fichiers de base de données. La valeur par défaut est/var/lib/postgresql/data, mais si le volume de données que vous utilisez est un point de montage de système de fichiers (comme avec les disques persistants GCE), Postgres initdb recommande un sous-répertoire (par exemple/var/lib/postgresql/data/pgdata) doit être créé pour contenir les données.

alors, créez un répertoire plus profond et ça marche

0