米尼库贝酒店;Kubernetes:在Postgres容器中使用Windows安装的驱动器作为永久卷
注意:进一步排除故障后,我认为这是minikube安装的问题。下面的大部分描述可能与具体问题无关。更多信息请参见我的评论。保持问题的原样米尼库贝酒店;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
我正在尝试将本地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虚拟机中,我无法查看装载的目录。对此的解决方案是什么?