如何在 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 卷