mkdir /mnt/data: 只读文件系统 Back-off 重启失败的 postgres 容器
Posted
技术标签:
【中文标题】mkdir /mnt/data: 只读文件系统 Back-off 重启失败的 postgres 容器【英文标题】:mkdir /mnt/data: read-only file system Back-off restarting failed postgres container 【发布时间】:2020-10-16 00:53:47 【问题描述】:我是 Kubernetes 新手,我尝试应用 yaml 文件在 GKE 中创建 Postgres,我收到错误消息“错误:无法启动容器“postgres”:来自守护进程的错误响应:创建挂载源路径时出错'/mnt/data': mkdir /mnt/data: 只读 文件系统 Back-off 重启失败的容器。
当我尝试登录到 pod 即容器内时,我认为我需要将权限设置为 RWX 。它不允许登录。 任何人请帮助我!!。
这是我用于 Postgres 的 Yaml 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
selector:
matchLabels:
app: postgres
replicas: 1
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:latest
imagePullPolicy: "IfNotPresent"
envFrom:
- configMapRef:
name: postgres-config
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgredb
volumes:
- name: postgredb
persistentVolumeClaim:
claimName: postgres-pv-claim
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: postgres-pv-volume
labels:
type: local
app: postgres
spec:
storageClassName: manual
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/mnt/data"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: postgres-pv-claim
labels:
app: postgres
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
---
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
labels:
app: postgres
data:
POSTGRES_DB: postgresdb
POSTGRES_USER: postgres
POSTGRES_PASSWORD: root
---
apiVersion: v1
kind: Service
metadata:
name: postgres
labels:
app: postgres
spec:
ports:
- name: postgres
port: 5432
nodePort: 30432
type: NodePort
selector:
app: postgres
【问题讨论】:
我假设你使用了this 教程。您正在使用type: local
,并且您想使用/mnt/data
,在GKE 上是ReadOnly
。您可以使用path: /var/lib/test
我会在几分钟内为您写一个答案。
【参考方案1】:
在您的Persistent Volume 中,您使用的是type: local
,这意味着您要在/mnt
中创建目录。本地也不支持dynamic volume provisioning。如果你将 SSH 连接到你的任何节点,你会发现这个文件夹是 ReadOnly file system
。
/mnt $ mkdir 某事 mkdir: 无法创建目录'something': 只读文件系统
作为最快的解决方法,您可以更改您的 PV YAML
- ReadWriteMany
hostPath:
path: /mnt/data
收件人:
- ReadWriteMany
hostPath:
path: /var/lib/data
例子:
$ kubectl apply -f pv-pvc.yaml
persistentvolume/postgres-pv-volume created
persistentvolumeclaim/postgres-pv-claim created
$ kubectl apply -f pos.yaml
deployment.apps/postgres created
$ kubectl get po
NAME READY STATUS RESTARTS AGE
postgres-65d9cbd495-pcqf5 1/1 Running 0 2s
$ kubectl exec -ti postgres-65d9cbd495-pcqf5 -- /bin/bash
root@postgres-65d9cbd495-pcqf5:/# cd /var/lib/postgresql/data
root@postgres-65d9cbd495-pcqf5:/var/lib/postgresql/data# ls
base pg_commit_ts pg_hba.conf pg_logical pg_notify pg_serial pg_stat pg_subtrans pg_twophase pg_wal postgresql.auto.conf postmaster.opts
global pg_dynshmem pg_ident.conf pg_multixact pg_replslot pg_snapshots pg_stat_tmp pg_tblspc PG_VERSION pg_xact postgresql.conf postmaster.pid
root@postgres-65d9cbd495-pcqf5:/var/lib/postgresql/data# echo "Hello from postgress pod" > data.txt
root@postgres-65d9cbd495-pcqf5:/var/lib/postgresql/data# cat data.txt
Hello from postgress pod
现在,如果您将 SSH 连接到托管此 pod 的节点,您将能够访问此文件夹和文件。
user@gke-cluster-1-default-pool-463f9615-gxhl ~ $ sudo su
gke-cluster-1-default-pool-463f9615-gxhl /home/user # cd /var/lib/data
gke-cluster-1-default-pool-463f9615-gxhl /var/lib/data # ls
PG_VERSION pg_dynshmem pg_notify pg_stat_tmp pg_xact
base pg_hba.conf pg_replslot pg_subtrans postgresql.auto.conf
data.txt pg_ident.conf pg_serial pg_tblspc postgresql.conf
global pg_logical pg_snapshots pg_twophase postmaster.opts
pg_commit_ts pg_multixact pg_stat pg_wal postmaster.pid
gke-cluster-1-default-pool-463f9615-gxhl /var/lib/data # cat data.txt
Hello from postgress pod
编辑
我用过的 YAML。
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
labels:
app: postgres
data:
POSTGRES_DB: postgresdb
POSTGRES_USER: postgres
POSTGRES_PASSWORD: root
---
apiVersion: v1
kind: Service
metadata:
name: postgres
labels:
app: postgres
spec:
type: NodePort
selector:
app: postgres
ports:
- name: postgres
port: 5432
nodePort: 30432
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: postgres-pv-volume
labels:
app: postgres
type: local
spec:
storageClassName: manual
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
hostPath:
path: /var/lib/data
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: postgres-pv-claim
labels:
app: postgres
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:latest
imagePullPolicy: "IfNotPresent"
envFrom:
- configMapRef:
name: postgres-config
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgredb
volumes:
- name: postgredb
persistentVolumeClaim:
claimName: postgres-pv-claim
configmap/postgres-config created
service/postgres created
persistentvolume/postgres-pv-volume created
persistentvolumeclaim/postgres-pv-claim created
deployment.apps/postgres created
$ kubectl get po
NAME READY STATUS RESTARTS AGE
postgres-65d9cbd495-wxx4h 1/1 Running 0 19s
【讨论】:
如果我根据您指定的更改路径出现错误,因为“PersistentVolume "postgres-pv-volume" 无效:spec.persistentvolumesource: Forbidden: is immutable after creation" 您必须删除 PV 和 PVC(如果它们不会消失,您可能还需要重新部署 postgress 部署),因为在某些资源中您无法在创建后更改值。 我已经删除了同样的错误,我又将它部署在一个新的集群中,同样的错误来了 哪一个错误?The PersistentVolume "postgres-pv-volume" is invalid: spec.persistentvolumesource: Forbidden: is immutable after creation
或 read-only file system
如果您仍然有 Forbidden: is immutable after creation
错误,请 ehck 如果 PersistentVolume 和 PersistentVolumeClaim 已被删除。 $ kubectl get cm,deploy,pv,pvc No resources found in default namespace.
我添加了我使用过的 YAML。只是为了确认您在本地机器上使用的是 GKE [Google Kubernetes Engine] 而不是 Kubeadm 或 Minikue?以上是关于mkdir /mnt/data: 只读文件系统 Back-off 重启失败的 postgres 容器的主要内容,如果未能解决你的问题,请参考以下文章
Google Cloud Functions 部署:EROFS:只读文件系统
如何删除/mnt/cdrom?|如何删除只读文件系统(Read-only files ystem)? failed !bh ? 挂载光盘?挂载usb?