NOTE: 经过进一步的故障排除后,我认为这是minikube mount的一个问题 . 以下大部分描述可能与确切问题无关 . 有关其他信息,请参阅我的评论保持提问的问题 .


我正在尝试使用本地SDCard作为minikube中的挂载点,在挂载点内创建持久卷,创建相应的持久卷声明,然后将其用作托管postgres实例的容器中的卷挂载 . 我将首先描述我如何创建PVC,然后深入了解pod定义 .

1. I'm using the minikube command to start the minikube VM (Hyper-V) with the mountpoint:

minikube start --vm-driver =“hyperv”--hyperv-virtual-switch =“我的虚拟交换机”--mount --mount-string =“D:\ data:/ data”

运行之后我使用 minikube ssh 来识别目录是否正确安装并拥有root的所有者/组 .

2. Create the PersistentVolume:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgres-data-pv
  labels:
    type: local
    application: postgres
spec:
  capacity:
    storage: 500Mi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: "/data/gather-client/postgres/data"

3. Create the PersistentVolumeClaim:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgres-data-pvc
  annotations:
    volume.beta.kubernetes.io/storage-class: ""
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi

4. Create the Pod and Container 我创建pod的第一次尝试是一种直接的,记录良好的方法:

kind: Pod
apiVersion: v1
metadata:
  name: gather-client
spec:
  volumes:
  - name: postgres-data
    persistentVolumeClaim:
      claimName: postgres-data-pvc
  containers:
    - name: metadata-db
      image: postgres:9.6.5
      env:
      - name: PGDATA
        value: /var/lib/postgresql/data/pgdata
      volumeMounts:
      - name: postgres-data
        mountPath: /var/lib/postgresql/data

此时我得到一个CrashLoopBackoff,并在检查容器日志时找到错误:

chown:更改'/ var / lib / postgresql / data / pgdata'的所有权:输入/输出错误

我相信这里发生的事情是容器有一个用户postgres运行initdb命令,而目录由root拥有?然后,我觉得在这种情况下我不会收到输入/输出错误 .

无论如何,我尝试了另外两种方法:

1. Using securityContext with an fsGroup matching the UID/GID of the postgres user (999)

在这里,我只是在规范的顶部添加了这个片段,希望使用postgres用户的上下文创建卷(我不太确定这是如何工作的......):

securityContext:
    fsGroup: 999

我收到同样的错误,并迅速转向下一个方法......

2. Using an initContainer to perform the chown command. This is where I've spent most of my time. I added a bit of debugging commands to better understand what was happening here.

initContainers:
  - name: metadata-db-init
    image: postgres:9.6.5
    command: ["sh"]
    args: ["-c", "whoami; ls -l /var/lib/postgresql; ls -l /var/lib/postgresql/data; chown postgres /var/lib/postgresql/data; chown postgres /var/lib/postgresql/data/pgdata"]
    volumeMounts:
    - name: postgres-data
      mountPath: /var/lib/postgresql/data

有了这个,我获得了Init:CrashLoopBackOff的pod状态 . 这是我在initContainer中的日志中得到的:

root total 0 drwxrwxrwx 1 root root 0 Jan 1 1970数据总计1 drwxrwxrwx 1 root root 0 Jan 1 1970 pgdata -rw-rw-rw- 1 root root 5 Jan 1 1970 test chown:更改'/ var / lib /的所有权postgresql / data':输入/输出错误chown:更改'/ var / lib / postgresql / data / pgdata'的所有权:输入/输出错误

我还从shell脚本到pgdata目录编写了一个简单的测试文件,发现它存在于我的SDCard上 . 由此我推测输入/输出错误与权限无关 . 此外,能够以root身份写入目录意味着文件系统处于正常工作状态 . 我不能chown(作为root) . 怎么会这样?