【问题标题】:What is the correct way to manage Kubernetes NFS PV permissions for Postgres?为 Postgres 管理 Kubernetes NFS PV 权限的正确方法是什么?
【发布时间】:2021-03-10 18:57:04
【问题描述】:

我正在使用 Helm 将 Harbor 连接到本地 Kubernetes 集群中。我想将数据持久保存到 EMC 存储设备上公开的 NFS 共享。我创建了一个指向 nfs 共享的 PV 和 PVC,并使用 busybox 对其进行测试,以确认基本设置工作正常。在掌舵图的值中,我指定了 existingClaim 和 subPath。但是,postgres 数据库 pod 失败。通过查看 kubectl 日志和描述,我确定问题是权限,但是我不清楚如何继续。具体来说:

  • init 容器 change-permission-of-directory 将 /harbor/database 文件夹的 uid:gid 更改为 postgres:postrges。
  • remove-lost-found init 容器失败,因为“Permission Denied”
  • 我手动 chmod -R 777 /harbor/database。 remove-lost-found 完成
  • 数据库容器创建了一些 global 和 pg_xlog 文件夹,但随后因权限被拒绝而失败
  • 我再次手动 chmod -R 777 /harbor/database。
  • 数据库容器失败并显示“initdb:目录“/var/lib/postgresql/data”存在但不为空”
  • 如果我删除文件夹,它会重新创建文件夹并失败并拒绝权限。

我认为 chmod 777 不是正确的做法,但我很困惑应该如何配置它。我在这里做错了什么?

Kubernetes 文件:

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: harbor-database-pv  
spec:
  capacity:
    storage: 5Gi 
  accessModes:
  - ReadWriteMany
  nfs: 
    path: /nfsserver/somepath/database
    server: platform.mycompany.com
---              
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
   name: harbor-database-pvc
spec:
   accessModes:
     - ReadWriteMany
   storageClassName: ""
   resources:
     requests:
       storage: "1Gi"
   volumeName: "harbor-database-pv"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: harbor-postgres
spec:
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  replicas: 1
  selector:
    matchLabels:
      app: harbor-postgres
  template:
    metadata:
      labels:
        app: harbor-postgres
    spec:    
      containers:
      - name: postgres
        image: postgres:13
        imagePullPolicy: "Always"
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_USER
          value: pgbench
        - name: PGUSER
          value: pgbench
        - name: POSTGRES_PASSWORD
          value: postgres@123
        - name: PGBENCH_PASSWORD
          value: superpostgres
        - name: PGDATA
          value: /var/lib/postgresql/data/pg
        volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgredb
      volumes:
      - name: postgredb
        persistentVolumeClaim:
          claimName: harbor-database-pvc

来自 kubectl 日志的第一个初始化日志:

fixing permissions on existing directory /var/lib/postgresql/data ... ok
initdb: error: could not create directory "/var/lib/postgresql/data/pg_wal/archive_status": Permission denied
initdb: removing contents of data directory "/var/lib/postgresql/data"
initdb: warning: could not open directory "/var/lib/postgresql/data/global": Permission denied
initdb: warning: could not open directory "/var/lib/postgresql/data/pg_wal": Permission denied
initdb: error: failed to remove contents of data directory
creating subdirectories ...

后续的初始化日志:

initdb: error: directory "/var/lib/postgresql/data/pg" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/var/lib/postgresql/data/pg" or run initdb
with an argument other than "/var/lib/postgresql/data/pg".

【问题讨论】:

  • 我不会在 NFS 上保留 PostgreSQL 数据。
  • 好的 - 为在 Kubernetes 中运行的 Postgres 持久化数据卷的首选方式是什么?
  • 普通持久卷,但您需要复制,例如使用 Crunchy 运算符:github.com/CrunchyData/postgres-operator
  • @Jonas 的建议能帮您解决吗?正如他提到的,不建议将 NFS 用于 PostgreSQL。
  • 内容丰富,但我仍然觉得我正在做的事情应该是可能的。 Postgres 文档说 NFS 没问题:postgresql.org/docs/current/creating-cluster.html(参见最后一节,18.2.2.1. NFS)使用本地存储意味着我们必须依赖一台主机上的物理磁盘。让操作员站起来比我现在正在寻找的开销更大,并且仍然需要一些存储空间。我不需要 HA- 我只想要一个简单的实例,其中数据在我们的存储阵列上。

标签: postgresql kubernetes


【解决方案1】:

在 nfs/efs 上持久化数据库是个坏主意。普通 PV 可以完成这项工作,但不要尝试复制。

【讨论】:

  • 如果使用local-storage pv,如果容器迁移到其他主机或重启,我会不会丢失数据?
  • 不用担心。这就是光伏的原因。
猜你喜欢
  • 2019-08-29
  • 2010-10-10
  • 2021-03-31
  • 1970-01-01
  • 2012-12-31
  • 2019-09-24
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
相关资源
最近更新 更多