postgresql - 无法理解将 postgres 数据路径安装到带有权限错误的 minikube kubernetes 部署

标签 postgresql kubernetes containers minikube mounted-volumes

我刚开始使用 kubernetes,我想用一个网络服务器和 postgres 数据库创建一个简单的应用程序。我遇到的问题是 postgres 的部署给我权限错误。以下是对此的讨论:

编辑

规范:

  • 操作系统 - 10.15.4
  • minikube - v1.9.2
  • kubernetes - v1.18.2

minikube 设置

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 deployment/pod/container 卷挂载一起使用。

运行上述设置后,我通过 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权限错误仍然存​​在。上面的引用链接似乎在不同虚拟机上的不同机器上围绕着不同的方法跳来跳去,我不明白,也无法让它工作。有人可以带我去上类吗?通过以上所有讨论, super 困惑。

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 文件夹,但是容器希望它是一个空目录。提供 subPath 字段可以解决此问题。请试试这个,它应该可以解决问题,您不需要任何 PGDATA 字段。尝试从您的 configmap 中省略它并将 subPath 添加到某个文件夹。请仔细阅读以下 list 。

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 

关于postgresql - 无法理解将 postgres 数据路径安装到带有权限错误的 minikube kubernetes 部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61758886/

相关文章:

python - 带有 Django 的 Postgres - 配置不当。错误 : ImproperlyConfigured: Error loading psycopg2 module: No module named 'psycopg2'

java - 如何连接到 Docker Swarm 中的 Postgresql 服务?

postgresql - 如何在 Ubuntu 上自动启动服务

Kubernetes - 准入 webhook - 验证部署中的规模操作

css - 将 Bootstrap 自定义为 960px 宽

apache - 如何配置 Apache 主 Web 服务器来处理来自用户的 SSL 连接(Tomcat Servlet/JSP 容器)

python - 在 Django 中从数据库创建 JSON 树

kubernetes - GitOps (Flex) 通过 HelmRelease 操作符在 Kubernetes 中安装标准 Jenkins Helm 图表

python - Kubernetes 部署连接被拒绝

c - docker 容器中的共享内存 ID 始终为 0