注意:经过进一步的故障排除后,我认为这是 minikube mount 的问题。以下描述的大部分内容可能与确切问题无关。有关其他信息,请参阅我的评论。保持问题不变。
我正在尝试使用本地 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. 创建持久卷:
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. 创建 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. 创建 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
此时我得到一个 CrashLoopBackoff 并且在检查容器日志时发现错误:
chown:更改“/var/lib/postgresql/data/pgdata”的所有权:输入/输出错误
我相信这里发生的事情是容器有一个用户 postgres,它正在运行 initdb 命令,而目录由 root 拥有?再说一次,我觉得在这种情况下我不会收到输入/输出错误。
无论如何,我尝试了另外两种方法:
1. 使用 securityContext 和 fsGroup 匹配 postgres 用户的 UID/GID (999)
在这里,我只是在规范的顶部添加了这个片段,希望卷将使用 postgres 用户的上下文创建(我不太确定这是如何工作的......):
securityContext:
fsGroup: 999
我收到同样的错误并迅速转向下一种方法......
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
有了这个,我得到了 Init:CrashLoopBackOff 的 pod 状态。这是我在 initContainer 中的日志中得到的内容:
根
总计 0 drwxrwxrwx 1 根 0 Jan 1 1970 数据
总计 1 drwxrwxrwx 1 根 0 1970 年 1 月 1 日 pgdata -rw-rw-rw- 1 根 5 1970 年 1 月 1 日测试
chown:更改“/var/lib/postgresql/data”的所有权:输入/输出错误
chown:更改“/var/lib/postgresql/data/pgdata”的所有权:输入/输出错误
我还编写了一个从 shell 脚本到 pgdata 目录的简单测试文件,发现它存在于我的 SDCard 上。由此我推测输入/输出错误与权限无关。此外,能够以 root 身份写入目录意味着文件系统处于正常工作状态。我只是不能 chown (作为根)。这怎么可能?