0

我有一个 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 启动后,我可以看到卷中有大量数据:

/ $ 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

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

/ $ 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 中不可见?

4

2 回答 2

2

我看到您的容器中有 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 不会看到数据目录中的任何内容,因为它仅本地安装在第一个容器中。

于 2018-04-06T20:33:39.010 回答
0

你的坐骑有些奇怪:

/ $ 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/在杀死第一个容器之前卸载了卷?

于 2018-04-12T09:42:36.377 回答