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 creationread-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:只读文件系统

阿里云云计算 19 块存储的使用

如何删除/mnt/cdrom?|如何删除只读文件系统(Read-only files ystem)? failed !bh ? 挂载光盘?挂载usb?

标记为只读的文件怎样删除

为啥Linux(Ubuntu系统)创建文件只能创建只读文件,还不能修改权限?

电脑中的“只读文件”怎样删除?那光盘呢?