- 我首先创建了持久卷 (EBS 10G( 和相应的持久卷声明。但是当我尝试部署 postgresql pods 如下(yaml 文件(时:
test-postgresql.yaml
从 pod 接收错误:
initdb:目录"/var/lib/postgresql/data"存在但不为空 它包含一个丢失+找到的目录,可能是因为它是一个挂载点。 不建议直接使用挂载点作为数据目录。 在挂载点下创建一个子目录。
为什么 Pod 不能使用此路径?我在minikube上尝试了相同的测试。我没有遇到任何问题。
- 我试图将卷挂载目录路径更改为"/var/lib/test/data",pods 可以运行。我创建了一个新表和一些数据,然后杀死了这个 pod。Kubernete创建了一个新的豆荚。但是新的没有保留以前的数据和表格。
那么,在Kubernete 中使用 Aws EBS 正确挂载 postgresql 卷的方法是什么,这允许重新创建的 Pod 可以重用存储在 EBS 中的初始数据库?
Aws EBS 正确挂载 postgresql 卷的方法是什么
你走在正确的道路上...
您得到的错误是因为您想使用挂载卷/
的根文件夹作为 postgresql Data dir,postgresql 抱怨这样做不是最佳实践,因为它不为空并且已经包含一些数据(即lost+found
目录(。
最好将数据目录放在单独的空子文件夹(例如/postgres
(中,并在创建其文件结构时给 postgresql 干净的石板。您在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
...
我通过告诉 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
这是来自Dockerhub的描述...
PGDATA 此可选变量可用于定义另一个位置 - 就像一个子目录 - 用于数据库文件。默认值为/var/lib/postgresql/data,但是如果你使用的数据量是 文件系统挂载点(如GCE永久磁盘(,Postgres initdb 推荐一个子目录(例如/var/lib/postgresql/data/pgdata ( 创建以包含数据。
所以,再创建一个更深层次的二分法,它就可以了
使用子路径,如下所述
- name: postgredb
mountPath: /var/lib/postgresql/data
#setting subPath - it can be any arbitrary name
subPath: postgres