无法理解将 Postgres 数据路径挂载到 Minikube Kubernetes 部署上并出现权限错误



我正在开始使用 kubernetes,我想创建一个包含单个 Web 服务器和 postgres 数据库的简单应用程序。我遇到的问题是 postgres 的部署给了我权限错误。以下是围绕此的讨论:

  • https://github.com/docker-library/postgres/issues/116
  • https://github.com/docker-library/postgres/issues/103
  • https://github.com/docker-library/postgres/issues/696
  • 无法获取 Postgres 权限或在 AKS 中工作的 PVC
  • Kubernetes - 封装数据库的 Pod 正在崩溃
  • 将本地目录挂载到 pod 中 minikube
  • https://serverfault.com/questions/981459/minikube-using-a-storageclass-to-provision-data-outside-of-tmp

编辑

规范:

  • OSX - 10.15.4
  • 迷你库贝 - v1.9.2
  • Kubernetes - v1.18.2

迷你库贝设置

minikube start --driver=virtualbox --cpus=2 --memory=5120 --kubernetes-version=v1.18.2 --container-runtime=docker --mount=true --mount-string=/Users/holmes/kubernetes/pgdata:/data/pgdata

权限错误:chmod: changing permissions of '/var/lib/postgresql/data': Operation not permitted

我正在尝试将本地操作系统目录挂载到 minikube 中,以便与 postgres 部署/pod/容器卷挂载一起使用。

运行上述设置后,我 ssh 进入 minikube (minikube ssh( 并检查权限

# minikube: /
drwxr-xr-x   3 root   root   4096 May 13 19:31 data
# minikube: /data
drwx------  1 docker docker   96 May 13 19:27 pgdata

通过在chmod权限下方运行脚本,错误表面。如果我更改--mount-string=/Users/holmes/kubernetes/pgdata:/data(省略/pgdata(,然后minikube ssh创建pgdata目录:

mkdir -p /data/pgdata
chmod 777 /data/pgdata

我在部署之前获得了一组不同的权限

# minikube: /
drwx------   1 docker docker   96 May 13 20:10 data
# minikube: /data
drwxrwxrwx 1 docker docker   64 May 13 20:25 pgdata

和部署

# minikube: /
drwx------   1 docker docker  128 May 13 20:25 data
# minikube: /data
drwx------ 1 docker docker   64 May 13 20:25 pgdata

不知道为什么会发生变化,并且chmod权限错误仍然存在。似乎上述参考链接在不同虚拟机上的不同机器上的不同方法中跳动,我不明白,也无法让它工作。有人可以带我去工作吗?通过上述所有讨论超级困惑。

postgres.yaml

apiVersion: v1
kind: Namespace
metadata:
name: data-block
---
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
namespace: data-block
labels:
type: starter
data:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: docker
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-pv
namespace: data-block
labels:
app: postgres
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/pgdata
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pv-claim
namespace: data-block
labels:
app: postgres
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: ""
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
namespace: data-block
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:12.2
ports:
- containerPort: 5432
envFrom:
- configMapRef:
name: postgres-config
volumeMounts:
- name: postgres-vol
mountPath: /var/lib/postgresql/data
volumes:
- name: postgres-vol
persistentVolumeClaim:
claimName: postgres-pv-claim

更新

我继续将部署脚本更新为一个简单的 pod。目标是将 postgres/var/lib/postgresql/data映射到我的本地文件目录/Users/<my-path>/database/data以持久化数据。

---
apiVersion: v1
kind: Pod
metadata:
name: postgres-pod
namespace: data-block
labels:
name: postgres-pod
spec:
containers:
- name: postgres
image: postgres:12.3
imagePullPolicy: IfNotPresent
ports:
- name: postgres-port
containerPort: 5432
envFrom:
- configMapRef:
name: postgres-env-config
- secretRef:
name: postgres-secret
volumeMounts:
- name: postgres-vol
mountPath: /var/lib/postgresql/data
volumes:
- name: postgres-vol
hostPath:
path: /Users/<my-path>/database/data
restartPolicy: Never

错误:initdb: error: could not access directory "/var/lib/postgresql/data": Permission denied

如何挂载本地文件目录?

您正在声明 PGDATA 字段,这可能是问题的原因。我遇到了同样的错误,这是因为该目录中已经有 LOST+FOUND 文件夹,但是容器希望它是一个空目录。提供子路径字段可以解决此问题。请尝试此操作,它应该可以解决问题,并且您不需要任何PGDATA字段。尝试从配置映射中省略它,并将 subPath 添加到某个文件夹。请浏览以下清单。

https://github.com/mendix/kubernetes-howto/blob/master/postgres-deployment.yaml

https://www.bmc.com/blogs/kubernetes-postgresql/

这是一个有状态集,通常您应该使用,而不是在数据库部署时进行部署。

- name: postgredb
mountPath: /var/lib/postgresql/data
#setting subPath will fix your issue it can be pgdata or 
postgres or any other folder name according to your 
choice.
subPath: postgres 

最新更新