如何在Kubernete中使用AWS EBS挂载PostgreSQL卷

时间:2018-07-04 07:55:40

标签: postgresql docker kubernetes persistent-volumes aws-ebs

  1. 我首先创建了永久卷(EBS 10G)和相应的永久卷声明。但是,当我尝试按以下方式部署PostgreSQL Pod(yaml文件)时:

test-postgresql.yaml

从pod接收错误:

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

为什么吊舱无法使用此路径?我已经在minikube上尝试过相同的测试。我没遇到任何问题。

  1. 我试图将卷挂载目录路径更改为“ / var / lib / test / data”,pod可以运行。我创建了一个新表及其上的一些数据,然后杀死了该容器。 Kubernete创建了一个新吊舱。但是新的并没有保留以前的数据和表。

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

3 个答案:

答案 0 :(得分:17)

  

那么,使用Aws EBS正确安装postgresql卷的方法是什么

您在正确的道路上...

您收到的错误是因为您想将已安装卷/的根文件夹用作postgresql数据目录,而postgresql抱怨这样做不是最佳实践,因为它不为空并且内部已经包含一些数据(即lost+found目录)。

最好在单独的空子文件夹(例如,/postgres)中定位数据目录,并在创建文件结构时为PostgreSQL提供干净的位置。在minicube上您没有得到相同的东西,因为您最有可能装载的主机文件夹内部没有任何内容(为空)并且没有引发此类投诉。

为此,您最初需要将已安装到吊舱中适当的安装点(/postgres)的卷中的subPath空(例如,PV上的空/var/lib/posgresql/data子文件夹)。请注意,您可以将subPath和安装点结束文件夹命名为相同的名称,这里它们是不同的,仅作为示例,其中test-db-volume/postgres文件夹将被挂载到/var/lib/postgresql/data文件夹上:

...
volumeMounts:
- mountPath: /var/lib/postgresql/data
  name: test-db-volume
  subPath: postgres
...

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这来自dockerhub描述...

  

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

因此,再创建一个更深的目录即可使用