Minikube 和 Kubernetes:在 Postgres 容器中使用 Windows 挂载驱动器作为持久卷

the*_*ly2 5 windows postgresql kubernetes persistent-volumes minikube

注意:经过进一步的故障排除后,我认为这是 minikube 安装的问题。下面的大部分描述可能与确切的问题无关。有关其他信息,请参阅我的评论。保留问题。


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

1. 我使用 minikube 命令通过挂载点启动 minikube VM (Hyper-V):

minikube start --vm-driver="hyperv" --hyperv-virtual-switch="我的虚拟交换机" --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"
Run Code Online (Sandbox Code Playgroud)

3. 创建 PersistentVolumeClaim:

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

4. 创建 Pod 和容器 我第一次尝试创建 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
Run Code Online (Sandbox Code Playgroud)

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

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

我相信这里发生的事情是容器有一个用户 postgres,它正在运行 initdb 命令,而目录归 root 所有?再说一次,我不觉得在这种情况下我会收到输入/输出错误。

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

1. 使用 securityContext 和 fsGroup 匹配 postgres 用户的 UID/GID (999)

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

  securityContext:
    fsGroup: 999
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

总计 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 身份)。这怎么可能?