如何在 Kubernetes 中使用 Aws EBS 挂载 postgresql 卷
How to mount a postgresql volume using Aws EBS in Kubernete
- 我首先创建了持久卷 (EBS 10G) 和相应的持久卷声明。但是当我尝试如下部署 postgresql pods(yaml 文件)时:
test-postgresql.yaml
收到来自 pod 的错误:
initdb: 目录“/var/lib/postgresql/data”存在但不为空
它包含一个 lost+found 目录,可能是因为它是一个挂载点。
不建议直接使用挂载点作为数据目录。
在挂载点下创建子目录
为什么pod不能使用这个路径?我在 minikube 上尝试过相同的测试。我没有遇到任何问题。
- 我尝试将卷装载目录路径更改为“/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.
所以,再创建一个更深层次的字典就可以了
- 我首先创建了持久卷 (EBS 10G) 和相应的持久卷声明。但是当我尝试如下部署 postgresql pods(yaml 文件)时:
test-postgresql.yaml
收到来自 pod 的错误:
initdb: 目录“/var/lib/postgresql/data”存在但不为空 它包含一个 lost+found 目录,可能是因为它是一个挂载点。 不建议直接使用挂载点作为数据目录。 在挂载点下创建子目录
为什么pod不能使用这个路径?我在 minikube 上尝试过相同的测试。我没有遇到任何问题。
- 我尝试将卷装载目录路径更改为“/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.
所以,再创建一个更深层次的字典就可以了