3

我开始使用 kubernetes,我想创建一个带有单个 webserver 和 postgres 数据库的简单应用程序。我遇到的问题是 postgres 的部署给了我权限错误。以下是围绕这个问题的讨论:

编辑

规格:

  • OSX - 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 部署/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权限错误仍然存​​在。似乎上面的参考链接在不同的虚拟机上的不同机器上跳来跳去,我不明白也不能让它工作。有人可以带我去工作吗?通过上述所有讨论超级困惑。

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

如何挂载本地文件目录?

4

1 回答 1

0

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

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

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

当涉及到数据库部署时,它通常是你应该使用的 statefulset,而不是部署。

        - 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 
于 2020-05-12T20:12:44.383 回答