米尼库贝酒店;Kubernetes:在Postgres容器中使用Windows安装的驱动器作为永久卷

米尼库贝酒店;Kubernetes:在Postgres容器中使用Windows安装的驱动器作为永久卷,windows,postgresql,kubernetes,minikube,persistent-volumes,Windows,Postgresql,Kubernetes,Minikube,Persistent Volumes,注意:进一步排除故障后,我认为这是minikube安装的问题。下面的大部分描述可能与具体问题无关。更多信息请参见我的评论。保持问题的原样 我正在尝试将本地SD卡用作minikube内的装载点,在装载点内创建一个持久卷,创建一个相应的持久卷声明,然后将其用作承载postgres实例的容器内的卷装载。我将首先描述如何创建PVC,然后深入到pod定义 1。我正在使用minikube命令启动minikube虚拟机(Hyper-V),挂载点: apiVersion: v1 kind: Persisten

注意:进一步排除故障后,我认为这是minikube安装的问题。下面的大部分描述可能与具体问题无关。更多信息请参见我的评论。保持问题的原样


我正在尝试将本地SD卡用作minikube内的装载点,在装载点内创建一个持久卷,创建一个相应的持久卷声明,然后将其用作承载postgres实例的容器内的卷装载。我将首先描述如何创建PVC,然后深入到pod定义

1。我正在使用minikube命令启动minikube虚拟机(Hyper-V),挂载点:

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"
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgres-data-pvc
  annotations:
    volume.beta.kubernetes.io/storage-class: ""
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi
minikube启动--vm driver=“hyperv”--hyperv虚拟交换机=“我的 虚拟交换机”-mount--mount string=“D:\data:/data”

运行此命令后,我使用了
minikube ssh
来确定目录是否正确装载,并且是否具有root的所有者/组

2。创建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"
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgres-data-pvc
  annotations:
    volume.beta.kubernetes.io/storage-class: ""
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi
3。创建PersistentVolumeClaim:

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"
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgres-data-pvc
  annotations:
    volume.beta.kubernetes.io/storage-class: ""
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi
4。创建吊舱和容器 我第一次尝试创建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。将securityContext与fsGroup一起使用,fsGroup与postgres用户的UID/GID匹配(999)

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

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

2。使用initContainer执行chown命令。我大部分时间都是在这里度过的。我添加了一些调试命令,以便更好地了解此处发生的情况。

  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
有了这个,我得到一个pod状态Init:CrashLoopBackOff。以下是我在initContainer内的日志中得到的信息:

总数0 drwxrwxrwx 1根根0 1970年1月1日数据

总数1 drwxrwxrwx 1根目录0 1970年1月1日pgdata -rw rw rw-1根根1970年1月5日试验

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

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


我还将一个简单的测试文件从shell脚本写入pgdata目录,并发现它存在于我的SD卡上。由此我推测输入/输出错误与权限无关。此外,能够以root用户身份写入目录意味着文件系统处于正常工作状态。我就是不能(作为根)。这怎么可能呢?

在进行了更多的故障排除之后,我发现我无法修改WSL中D:上的文件/文件夹的权限。似乎这可能是一个线索?看来我已经确认这不是SD卡位置的问题。我测试了在我的WSL用户主目录(WSL可以自由控制权限)中挂载一个目录,但仍然没有成功。我还尝试从C:安装驱动器。还是不走运。在这两种情况下都是相同的错误。另外,确认如果我在minikube VM中创建一个新目录(没有从Windows挂载),并将其用作PV,那么我确实可以从postgres容器中删除该目录。所以这似乎是minikube安装的问题(可能是从Windows安装?)验证这是minikube问题。在minikube虚拟机中,我无法查看装载的目录。对此的解决方案是什么?