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

test-postgresql.yaml

从 pod 接收错误:

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

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

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

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

【问题讨论】:

    标签: postgresql docker kubernetes persistent-volumes aws-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 )被创建来包含数据。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 2021-11-18
      • 2018-12-02
      • 2020-03-17
      相关资源
      最近更新 更多