【问题标题】:GKE (1.7.12-gke.1) Dynamic provisioning: Directory contents are created in containerFS, instead of volume FSGKE (1.7.12-gke.1) 动态配置:在 containerFS 中创建目录内容,而不是在卷 FS 中创建
【发布时间】:2018-04-06 19:38:41
【问题描述】:

我有一个 1.7.12-gke.1 集群。

问题

  • 当我动态配置卷时,我创建了一个 PVC。
  • 将数据引导到该 PVC 后,我终止了生成数据的容器。
  • 然后,我启动了第二个容器,它绑定了相同的 PVC。

我希望第一个目录中的 postgres /data 文件将在新容器中可见...但它们不可见。

通常可以在挂载时看到它们之间的文件,但是所有由 postgres 出于某种原因在 data/ 目录下创建的文件在新 pod 中不可见。

详情

不知何故,这个特定目录的子内容似乎没有存储到卷中(或者至少,不是以这样一种方式,即它们以后可以从同一个 PVC 挂载到新容器中)。

我在卷中引导数据目录,如下所示:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: jay-gke-pvc
spec:
  accessModes:
    - ReadWriteOnce
    - ReadOnlyMany
  resources:
    requests:
      storage: 700Mi
---
apiVersion: v1
kind: Pod
metadata:
  name: postgres-init
  labels:
    app: postgres-init
    tier: postgres-init
spec:
  serviceAccountName: postgresapp
  volumes:
  - name: postgres-persistent-vol
    persistentVolumeClaim:
      claimName: jay-gke-pvc
  initContainers:
  - name: postgres-ini-bootstrap
    image: alpine
    command: ["rm","-rf","/var/lib/postgresql/*"]
    volumeMounts:
    - name: postgres-persistent-vol
      mountPath: /var/lib/postgresql/
  containers:
  - name: postgres-ini
    image: images/my-postgres:9.6.c
    volumeMounts:
    - name: postgres-persistent-vol
      mountPath: /var/lib/postgresql/
    securityContext:
      runAsUser: 70
  restartPolicy: Never

我可以看到,这个 pod 启动后,volume 中有很多数据:

/ $ ls -altrh /var/lib/postgresql/data/
total 140
-rw-r--r--    1 postgres postgres    1.4K Apr  6 19:24 root.crt
-rw-------    1 postgres postgres   21.6K Apr  6 19:24 postgresql.conf
drwx------    3 postgres postgres    4.0K Apr  6 19:24 pg_xlog
drwx------    2 postgres postgres    4.0K Apr  6 19:24 pg_twophase
drwx------    2 postgres postgres    4.0K Apr  6 19:24 pg_tblspc
drwx------    2 postgres postgres    4.0K Apr  6 19:24 pg_subtrans
drwx------    2 postgres postgres    4.0K Apr  6 19:24 pg_snapshots
drwx------    2 postgres postgres    4.0K Apr  6 19:24 pg_serial
drwx------    2 postgres postgres    4.0K Apr  6 19:24 pg_replslot
drwx------    4 postgres postgres    4.0K Apr  6 19:24 pg_multixact
drwx------    4 postgres postgres    4.0K Apr  6 19:24 pg_logical
-rw-------    1 postgres postgres    1.6K Apr  6 19:24 pg_ident.conf
drwx------    2 postgres postgres    4.0K Apr  6 19:24 pg_dynshmem
drwx------    2 postgres postgres    4.0K Apr  6 19:24 pg_commit_ts
drwx------    2 postgres postgres    4.0K Apr  6 19:24 pg_clog
-r--------    1 postgres postgres    1.6K Apr  6 19:24 hub-database.key
-rw-r--r--    1 postgres postgres    1.5K Apr  6 19:24 hub-database.crt
-rw-------    1 postgres postgres       4 Apr  6 19:24 PG_VERSION
drwxr-xr-x    4 root     root        4.0K Apr  6 19:24 ..
-rw-------    1 postgres postgres     874 Apr  6 19:24 postgresql.auto.conf
drwx------    8 postgres postgres    4.0K Apr  6 19:24 base
-rw-------    1 postgres postgres     940 Apr  6 19:24 pg_hba.conf
-rw-------    1 postgres postgres      85 Apr  6 19:24 postmaster.pid
-rw-------    1 postgres postgres      24 Apr  6 19:24 postmaster.opts
drwx------    2 postgres postgres    4.0K Apr  6 19:24 pg_stat
drwx------    2 postgres postgres    4.0K Apr  6 19:24 pg_notify
drwx------    2 postgres postgres    4.0K Apr  6 19:24 pg_log
drwx------   20 postgres postgres    4.0K Apr  6 19:24 .
drwx------    2 postgres postgres    4.0K Apr  6 19:24 pg_stat_tmp
drwx------    2 postgres postgres    4.0K Apr  6 19:24 global
/ $ df -h | grep postgres
/dev/sdb                975.9M      2.5M    906.2M   0% /var/lib/postgresql
/dev/sda1                94.3G     31.0G     63.2G  33% /var/lib/postgresql/data

HOWEVER 当我在新的 postgres 容器中安装同一个磁盘以进行数据迁移时,我看到以下内容...没有文件(但 data 目录,不知何故是可见的)。

/ $ ls /hub-db/
data/        lost+found/
/ $ ls /hub-db/data/
/ $ ls -altrh /hub-db/
total 28
drwx------    2 root     root       16.0K Apr  6 19:23 lost+found
drwxr-xr-x    2 root     root        4.0K Apr  6 19:24 data
drwxr-xr-x    4 root     root        4.0K Apr  6 19:24 .
drwxr-xr-x    1 root     root        4.0K Apr  6 19:26 ..
/ $ df -h
Filesystem                Size      Used Available Use% Mounted on
overlay                  94.3G     31.0G     63.3G  33% /
tmpfs                    14.7G         0     14.7G   0% /dev
tmpfs                    14.7G         0     14.7G   0% /sys/fs/cgroup
/dev/sdb                975.9M      2.5M    906.2M   0% /hub-db
/dev/sda1                94.3G     31.0G     63.3G  33% /dev/termination-log
/dev/sda1                94.3G     31.0G     63.3G  33% /etc/resolv.conf
/dev/sda1                94.3G     31.0G     63.3G  33% /etc/hostname
/dev/sda1                94.3G     31.0G     63.3G  33% /etc/hosts
shm                      64.0M         0     64.0M   0% /dev/shm
tmpfs                    14.7G     12.0K     14.7G   0% /run/secrets/kubernetes.io/serviceaccount
tmpfs                    14.7G         0     14.7G   0% /proc/kcore
tmpfs                    14.7G         0     14.7G   0% /proc/timer_list
tmpfs                    14.7G         0     14.7G   0% /sys/firmware

请注意,在第二种情况下,我的用户是postgres:x:70:70::/var/lib/postgresql:/bin/sh,在第一种情况下我使用相同的 ID (70),所以数字用户 ID 应该相同,因此我看不出有什么原因权限错误(虽然我可能是错的)。

一些后续问题,以防主要问题“我的 /data 内容在哪里?”不好回答:

1) 是否有一种简单的方法来确认或下载动态配置的卷内容?我宁愿不依赖 kubernetes 来调试卷是否包含正确的内容,因为容器挂载可能会做一些奇怪的事情。

2) 是否有任何原因导致特定子目录内容在使用与我最初写入内容相同的 PVC 的新 pod 中不可见?

【问题讨论】:

    标签: kubernetes google-kubernetes-engine kubernetes-pvc gce-persistent-disk


    【解决方案1】:

    我发现您的容器中有 2 个挂载点:

    $ df -h | grep postgres
    /dev/sdb                975.9M      2.5M    906.2M   0% /var/lib/postgresql
    /dev/sda1                94.3G     31.0G     63.2G  33% /var/lib/postgresql/data
    

    根据您的 Pod 规范,Kubernetes 仅处理第一次挂载,/var/lib/postgresql。似乎有别的东西正在挂载这个数据目录,而且它看起来像是从容器文件系统 (/dev/sda1) 而不是 GCE PD (/dev/sdb) 挂载的。

    所以你的第二个 Pod 不会看到数据目录中的任何内容,因为它只是本地安装在第一个容器中。

    【讨论】:

    • 是的,我当然也对不同的挂载点感到困惑,这就是我发布它们的原因。我想知道为什么当卷安装在容器 fs 上方时,mkdir 能够在容器 fs 上创建路径。
    • data 目录的 mkdir 被挂载点看到。问题是 data 挂载的来源来自容器 rootfs。您遵循什么文档来运行 postgres?这可能已经过时了,但我随机找到了this blog post,在他们的示例中,他们将/var/lib/postgresql/data 指定为容器的mountPath
    【解决方案2】:

    你的坐骑有点奇怪:

    / $ df -h | grep postgres
    /dev/sdb                975.9M      2.5M    906.2M   0% /var/lib/postgresql
    /dev/sda1                94.3G     31.0G     63.2G  33% /var/lib/postgresql/data
    

    您正在挂载 /dev/sda1,它应该是您容器的根文件系统,位于设备 /deb/sdb 之上。

    只是想知道,您是否在杀死第一个容器之前卸载了卷 /var/lib/postgresql/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 2020-04-20
      • 2022-08-20
      • 2022-06-17
      • 2020-05-27
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多