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

时间:2018-08-07 11:21:33

标签: postgresql kubernetes nfs

我正在使用以下清单在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卷工作)时,它才起作用,为什么?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我遇到相同的问题,当我使用头盔部署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)可以解决此问题,或者尝试通过nfs进行mysql的数据挂载。