【问题标题】:Accessing Postgresql data of Kubernetes cluster访问 Kubernetes 集群的 Postgresql 数据
【发布时间】:2021-12-29 05:51:40
【问题描述】:

我有一个包含两个 PostgreSQL 数据库副本的 kubernetes 集群,我想查看存储在数据库中的值。

当我 exec 自己进入两个 postgres pod (kubectl exec --stdin --tty [postgres_pod] -- /bin/bash) 之一并从内部检查数据库时,我只有部分数据库。其余的数据库数据在另一个 Postgres pod 上,我没有看到由存储所有数据库的持久卷创建的任何目录。

简而言之,我创建了 4 个表;在一个 postgres pod 我有 4 个表,但 2 个是空的,在另一个 postgres pod 中有 3 个表,第一个 pod 中的表是空的,这里已经填满有数据。

为什么 pod 中没有相同的数据?

如何访问和下载整个数据库?

PS。我在 minikube 中使用 HELM 部署集群。


这里是 YAML 文件:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-config
  labels:
    app: postgres
data:
  POSTGRES_DB: database-pg
  POSTGRES_USER: postgres
  POSTGRES_PASSWORD: postgres
  PGDATA: /data/pgdata
---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: postgres-pv-volume
  labels:
    type: local
    app: postgres
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/mnt/data"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgres-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  ports:
    - name: postgres
      port: 5432
      nodePort: 30432
  type: NodePort
  selector:
    app: postgres
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: postgres-service
  selector:
    matchLabels:
      app: postgres
  replicas: 2
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:13.2
          volumeMounts:
            - name: postgres-disk
              mountPath: /data
          # Config from ConfigMap
          envFrom:
            - configMapRef:
                name: postgres-config
  volumeClaimTemplates:
    - metadata:
        name: postgres-disk
      spec:
        accessModes: ["ReadWriteOnce"]
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  selector:
    matchLabels:
      app: postgres
  replicas: 2
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:13.2
          imagePullPolicy: IfNotPresent
          envFrom:
            - configMapRef:
                name: postgres-config
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgredb
      volumes:
        - name: postgredb
          persistentVolumeClaim:
            claimName: postgres-pv-claim
---


【问题讨论】:

  • 您不应该直接与数据库文件系统交互。如果您需要下载整个数据库,请使用pbdump。您是否遵循有关如何在 kubernets 上部署 postgres 的任何特定教程?你同时使用DeploymentStatafulset吗?
  • 谢谢马里奥。使用pgdump 将是下载数据库的一个很好的解决方案,但是我想检查下载卷目录的特定场景。我在对帖子的回答中更详细地解释了它。

标签: postgresql kubernetes kubernetes-helm psql minikube


【解决方案1】:

我找到了解决下载卷目录问题的方法,但是当我运行多个 postgres 副本集时,DB 的表仍然分散在 Pod 之间。

这是我下载 postgres 卷的操作:

首先,minikube 支持一些特定目录的卷出现:

minikube 配置为持久化存储在以下目录下的文件,这些目录是在 Minikube VM 中创建的(如果在裸机上运行,​​则在您的本地主机上)。重新启动时,您可能会丢失其他目录中的数据。

/data
/var/lib/minikube
/var/lib/docker
/tmp/hostpath_pv
/tmp/hostpath-provisioner

所以我将挂载路径更改为/data 目录下。这使数据库卷可见。

在此之后,我 ssh'ed 到 minikube 并将数据库卷复制到一个新目录(我使用 /home/docker,因为 minikube 的用户是 docker)。

sudo cp -R /data/pgdata /home/docker

pgdata 仍归 root 所有(访问被拒绝错误)所以我将其更改为归 docker 所有。为此,我还设置了一个我知道的新密码:

sudo passwd docker # change password for docker user
sudo chown -R docker: /home/docker/pgdata # change owner from root to docker

然后您可以退出并将目录复制到本地计算机:

exit
scp -r $(minikube ssh-key) docker@$(minikube ip):/home/docker/pgdata [your_local_path].

注意

Mario 的建议是使用pgdump 可能是复制数据库的更好解决方案。我仍然想下载卷目录以查看它是否具有完整的数据库,当 pod 仅具有所有表的一部分时。结果发现不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2020-07-28
    • 2023-03-15
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多