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

Posted

技术标签:

【中文标题】如何在 Kubernetes 中使用 Aws EBS 挂载 postgresql 卷【英文标题】:How to mount a postgresql volume using Aws EBS in Kubernete 【发布时间】:2018-12-12 14:14:14 【问题描述】:
    我首先创建了持久卷 (EBS 10G) 和相应的持久卷声明。但是当我尝试如下部署 postgresql pod(yaml 文件)时:

test-postgresql.yaml

从 pod 接收错误:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

为此,您首先需要将卷的 subPath 空(例如 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
...

【讨论】:

这是一个很好的答案。我尝试了许多解决方案,包括在安装后删除 lost+found,但最终找到了这个简单的工作解决方案。 这也适用于 Azure 托管磁盘(不是文件)上的卷【参考方案2】:

我通过告诉 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

【讨论】:

谢谢你。【参考方案3】:

这是来自 dockerhub 的描述...

PGDATA 这个可选变量可用于定义另一个位置 - 像一个子目录 - 用于数据库文件。默认是 /var/lib/postgresql/data,但如果您使用的数据量是 文件系统挂载点(如 GCE 永久磁盘)、Postgres initdb 推荐一个子目录(例如 /var/lib/postgresql/data/pgdata )被创建来包含数据。

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

【讨论】:

以上是关于如何在 Kubernetes 中使用 Aws EBS 挂载 postgresql 卷的主要内容,如果未能解决你的问题,请参考以下文章

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

更改 AWS EB 环境使用的 RDS 数据库

更改 AWS EB 环境使用的 RDS 数据库

AWS:为单独的 EB 实例克隆 RDS

当 EB 环境为 python 3.6 时,使用 python 2.7 安装要求时出现 AWS 错误

AWS:使用 Elastic Beanstalk 命令行界面 (EB CLI) 3.x SSH 到 EC2