【问题标题】:How to deploy Postgresql on Kubernetes with NFS volume如何使用 NFS 卷在 Kubernetes 上部署 Postgresql
【发布时间】:2018-08-07 11:21:33
【问题描述】:

我正在使用以下清单在 NFS 持久卷内的 kubernetes 上部署 postgresql:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs2
spec:
  capacity:
    storage: 6Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 10.139.82.123
    path:  /nfsfileshare/postgres
---

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs2
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 6Gi
---
apiVersion: v1
kind: Service
metadata:
  name: db

  labels:
    app: aiflow-db
spec:
  selector:
    app: aiflow-db
  clusterIP: None
  ports:
  - port: 5432
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: db
  namespace: test-aiflow
  labels:
    app: aiflow-db
spec:
  selector:
    matchLabels:
      app: aiflow-db
  template:
    metadata:
      labels:
        app: aiflow-db
    spec:
      containers:
      - name: db
        image: postgresql:10
        ports:
        - containerPort: 5432
        env:
        - name: PGDATA
          value: /var/lib/postgresql/data/pgdata
        volumeMounts:
        - mountPath: /var/lib/postgresql/data/pgdata
          name: nfs2
      volumes:
        - name: nfs2
          persistentVolumeClaim:
            claimName: nfs2
      restartPolicy: Always

pg数据可以挂载到nfs服务器(/nfsfileshare/postgres *(rw,async,no_subtree_check,no_root_squash)):

total 124
drwx------ 19  999 root    4096 Aug  7 11:10 ./
drwxrwxrwx  5 root root    4096 Aug  7 10:28 ../
drwx------  3  999 docker  4096 Aug  7 11:02 base/
drwx------  2  999 docker  4096 Aug  7 11:10 global/
drwx------  2  999 docker  4096 Aug  7 11:01 pg_commit_ts/
drwx------  2  999 docker  4096 Aug  7 11:01 pg_dynshmem/
-rw-------  1  999 docker  4513 Aug  7 11:02 pg_hba.conf
-rw-------  1  999 docker  1636 Aug  7 11:02 pg_ident.conf
drwx------  4  999 docker  4096 Aug  7 11:09 pg_logical/
drwx------  4  999 docker  4096 Aug  7 11:01 pg_multixact/
drwx------  2  999 docker  4096 Aug  7 11:10 pg_notify/
drwx------  2  999 docker  4096 Aug  7 11:02 pg_replslot/
drwx------  2  999 docker  4096 Aug  7 11:01 pg_serial/
drwx------  2  999 docker  4096 Aug  7 11:01 pg_snapshots/
drwx------  2  999 docker  4096 Aug  7 11:02 pg_stat/
drwx------  2  999 docker  4096 Aug  7 11:02 pg_stat_tmp/
drwx------  2  999 docker  4096 Aug  7 11:02 pg_subtrans/
drwx------  2  999 docker  4096 Aug  7 11:02 pg_tblspc/
drwx------  2  999 docker  4096 Aug  7 11:01 pg_twophase/
-rw-------  1  999 docker     3 Aug  7 11:02 PG_VERSION
drwx------  3  999 docker  4096 Aug  7 11:02 pg_wal/
drwx------  2  999 docker  4096 Aug  7 11:02 pg_xact/
-rw-------  1  999 docker    88 Aug  7 11:02 postgresql.auto.conf
-rw-------  1  999 docker 22729 Aug  7 11:02 postgresql.conf
-rw-------  1  999 docker    74 Aug  7 11:10 postmaster.pid

但是容器卡在下面的日志中:

属于该数据库系统的文件将归用户所有 “postgres”。该用户还必须拥有服务器进程。

数据库集群将使用语言环境“en_US.utf8”进行初始化。这 默认数据库编码已相应设置为“UTF8”。这 默认文本搜索配置将设置为“英语”。

数据页校验和被禁用。

修复现有目录的权限 /var/lib/postgresql/data/pgdata ...好的创建子目录...好的 选择默认 max_connections ... 100 选择默认 shared_buffers ... 128MB 选择动态共享内存 实现 ... posix 创建配置文件 ... 正常运行 引导脚本...好的

似乎它停留在引导后初始化。

只有在我不使用 nfs 卷时才有效(使用 hostPath 卷),这是为什么呢?

【问题讨论】:

  • 最后,我使用Local PV来部署postgresql。
  • hostPath 卷将在工作节点本身上挂载一个文件夹。此文件夹/共享不会共享给不同的工作节点。可以进行测试,但在生产中,当您的 pod 在其他工作人员上重新启动时,共享(文件夹)将为空。

标签: postgresql kubernetes nfs


【解决方案1】:

NFS 不支持 fsync 内核 vfs 调用,这是确保在磁盘上写出重做日志所需的事务日志。所以在需要使用RDBMS的时候应该使用块存储,比如PostgreSQL和MySQL。尽管您可以在 NFS 上运行它,但您可能会失去数据一致性。

【讨论】:

  • 谢谢。你知道为什么 postgresql pod 不工作吗?另一个问题是关于在 kubernetes 上运行 postgresql 有什么建议吗?
【解决方案2】:

遇到同样的问题,当我使用helm deploy gitlab时,postgresql无法运行,报错如下:

FATAL:  data directory "/var/lib/postgresql/data/pgdata" has wrong ownership.  
HINT:  The server must be started by the user that owns the data directory.

我认为这是因为 postgresql 运行属性需要它的数据应该由用户 postgres 和组 postgres 拥有,但是 nfs 更改了自己的用户和组,导致 postgresql 无法运行。

也许换个glusterfs之类的工具可以解决这个问题,或者试试mysql的nfs挂载数据。

【讨论】:

    猜你喜欢
    • 2021-09-17
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 2019-09-24
    • 2021-04-17
    • 2019-11-18
    相关资源
    最近更新 更多