我正在开始使用 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