37
  1. 我首先创建了持久卷 (EBS 10G) 和相应的持久卷声明。但是,当我尝试如下部署 postgresql pod(yaml 文件)时:

测试-postgresql.yaml

从 pod 接收错误:

initdb: directory "/var/lib/postgresql/data" 存在但不是空的 它包含一个 lost+found 目录,可能是因为它是一个挂载点。不建议直接使用挂载点作为数据目录。在挂载点下创建一个子目录。

为什么 pod 不能使用这条路径?我在 minikube 上尝试过相同的测试。我没有遇到任何问题。

  1. 我尝试将卷挂载目录路径更改为“/var/lib/test/data”,pod 可以运行。我创建了一个新表和一些数据,然后杀死了这个 pod。Kubernetes 创建了一个新的 pod。但是新的没有保留以前的数据和表格。

那么在 Kubernetes 中使用 Aws EBS 正确挂载 postgresql 卷的方法是什么,它允许重新创建的 pod 可以重用存储在 EBS 中的初始数据库?

4

3 回答 3

70

那么使用 Aws EBS 正确挂载 postgresql 卷的方法是什么

你走在正确的道路上......

您得到的错误是因为您想使用已安装卷的根文件夹/作为 postgresql 数据目录,而 postgresql 抱怨这样做不是最佳做法,因为它不是空的并且内部已经包含一些数据(即lost+found目录)。

最好将数据目录定位在单独的空子文件夹中(/postgres例如),并在创建其文件结构时为 postgresql 提供干净的 slate。你在 minicube 上没有得到同样的东西,因为你很可能安装了里面没有任何东西(是空的)并且没有触发这样的投诉的主机文件夹。

为此,您首先需要将卷的空子路径(例如 PV 上的空子/postgres文件夹)挂载到 pod 中的适当挂载点 ( /var/lib/posgresql/data)。请注意,您可以将 subPath 和挂载点结束文件夹命名为相同的名称,它们在此处有所不同,仅作为将test-db-volume/postgres文件夹挂载到 pod 到/var/lib/postgresql/data文件夹的示例:

...
volumeMounts:
- mountPath: /var/lib/postgresql/data
  name: test-db-volume
  subPath: postgres
...
于 2018-07-04T13:02:15.107 回答
11

我通过告诉 postgres 我希望使用 PGDATA env 在哪里创建数据库来解决这个问题。它创建空目录并初始化数据库。如果你没有这个,那么它假设你想在房间安装目录中创建它,对我来说,它有 postgres 不喜欢的 ;ost+found 目录

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
于 2019-03-20T14:41:57.963 回答
1

这是来自 dockerhub 的描述...

PGD​​ATA 此可选变量可用于为数据库文件定义另一个位置——例如子目录。默认为 /var/lib/postgresql/data,但如果您使用的数据卷是文件系统挂载点(如 GCE 永久磁盘),Postgres initdb 建议使用子目录(例如 /var/lib/postgresql/data/ pgdata ) 被创建来包含数据。

所以,创建一个更深层次的字典,它就可以工作

于 2019-05-23T16:43:13.620 回答