如何使用 postgres 在 GKE kubernetes StatefulSet 中保留数据?

kon*_*rer 2 postgresql docker kubernetes

所以我只是想通过实验让一个网络应用程序在 GKE 上运行,以熟悉 Kubernetes 和 GKE。

我有一个 statefulSet (Postgres),它有一个持久卷/持久卷声明,它按预期安装到 Postgres pod。我遇到的问题是让 Postgres 数据持久。如果我在var/lib/postgres数据上安装 PV,每个 pod 更新都会被覆盖。如果我安装在var/lib/postgres/data我收到警告:

initdb: directory "/var/lib/postgresql/data" exists but is not empty It contains a lost+found directory, perhaps due to it being a mount point. Using a mount point directly as the data directory is not recommended. Create a subdirectory under the mount point.

单独使用 Docker 使卷挂载点var/lib/postgresql/data按预期工作并且数据持久,但我现在不知道在 GKE 中该做什么。如何正确设置?

安装文件:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sm-pd-volume-claim
spec:
  storageClassName: "standard"
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1G
---
apiVersion: "apps/v1"
kind: "StatefulSet"
metadata:
  name: "postgis-db"
  namespace: "default"
  labels:
    app: "postgis-db"
spec:
  serviceName: "postgis-db"
  replicas: 1
  selector:
    matchLabels:
      app: "postgis-db"
  template:
    metadata:
      labels:
        app: "postgis-db"
    spec:
      terminationGracePeriodSeconds: 25
      containers:
      - name: "postgis"
        image: "mdillon/postgis"
        ports:
        - containerPort: 5432
          name: postgis-port
        volumeMounts:
        - name: sm-pd-volume
          mountPath: /var/lib/postgresql/data
      volumes:
      - name: sm-pd-volume
        persistentVolumeClaim:
          claimName: sm-pd-volume-claim
Run Code Online (Sandbox Code Playgroud)

Sub*_*kam 9

您收到此错误是因为 postgres pod 已尝试在 / 文件夹上挂载数据目录。不建议这样做。

您必须创建子目录来解决 statefulset 清单 yaml 文件上的此问题。

  volumeMounts:
    - name: sm-pd-volume
      mountPath: /var/lib/postgresql/data
      subPath: data
Run Code Online (Sandbox Code Playgroud)