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) . 怎么会这样?