postgresql - 如何使用 NFS 卷在 Kubernetes 上部署 Postgresql

标签 postgresql kubernetes nfs

我正在使用以下 list 在 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

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

The files belonging to this database system will be owned by user "postgres". This user must also own the server process.

The database cluster will be initialized with locale "en_US.utf8". The default database encoding has accordingly been set to "UTF8". The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/data/pgdata ... ok creating subdirectories ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting dynamic shared memory implementation ... posix creating configuration files ... ok running bootstrap script ... ok

它似乎卡在了引导后初始化。

它仅在我不使用 nfs 卷(通过使用 hostPath 卷工作)时有效,这是为什么?

最佳答案

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

关于postgresql - 如何使用 NFS 卷在 Kubernetes 上部署 Postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51725559/

相关文章:

kubernetes - 如果我在使用 Spring Data (Jedis) 在 Redis 集群中连接的 Spring Boot 应用程序中,如何在 Redis 集群中使用 K8s 的自动缩放?

kubernetes - 优先购买通知如何处理?

kill - 谈论 NFS 挂载选项时 "sure kill"是什么?

hadoop - 如何在Cloudera上挂载HDFS?

postgresql - 如何在 Sequelize 中实现 JOIN

Kubernetes Secrets - secret 定义中类型 "Opaque"的用途是什么

sql - 在三个单独的列中计算值 - Rails/SQL

java - 网络中断后由于锁定 nfs 文件导致 JVM 崩溃

postgresql - sequelize.query 返回空数组

python - 将 Django 连接到实时 Heroku Postgres 数据库