如何在 Kubernetes 中使用 Aws EBS 挂载 postgresql 卷

How to mount a postgresql volume using Aws EBS in Kubernete

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

test-postgresql.yaml

收到来自 pod 的错误:

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

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

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

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

So what's the way to correctly mount a postgresql volume using Aws EBS

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

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

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

为此,您最初需要清空 subPath 卷(例如,清空您的 PV 上的 /postgres 子文件夹),并将其安装到适当的安装点 (/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
...

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

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

这是来自 dockerhub 的描述...

PGDATA This optional variable can be used to define another location - like a subdirectory - for the database files. The default is /var/lib/postgresql/data, but if the data volume you're using is a filesystem mountpoint (like with GCE persistent disks), Postgres initdb recommends a subdirectory (for example /var/lib/postgresql/data/pgdata ) be created to contain the data.

所以,再创建一个更深层次的字典就可以了