【发布时间】: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