postgresql - Azure kubernetes 上的 Postgres 卷权限错误

标签 postgresql azure kubernetes yaml

我正在尝试在 Azure Kubernetes 上部署具有数据持久性的 Postgresql。所以我用的是PVC。 我在这里搜索了很多帖子,其中大多数都提供了如下所示的 yaml 文件,但它给出了以下错误;

chmod: changing permissions of '/var/lib/postgresql/data/pgdata': Operation not permitted
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

initdb: error: could not change permissions of directory "/var/lib/postgresql/data/pgdata": Operation not permitted
fixing permissions on existing directory /var/lib/postgresql/data/pgdata ...

部署yaml文件如下;

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgresql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgresql
  template:
    metadata:
      labels:
        app: postgresql
    spec:
      containers:
        - name: postgresql
          image: postgres:13.2
          securityContext:
            runAsUser: 999
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 5432
          envFrom:
            - secretRef:
                name: postgresql-secret
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgredb-kap
      volumes:
        - name: postgredb-kap
          persistentVolumeClaim:
            claimName: postgresql-pvc

secret yaml 如下;

apiVersion: v1
kind: Secret
metadata:
  name: postgresql-secret
type: Opaque
data:
  POSTGRES_DB: a2V5sd4=
  POSTGRES_USER: cG9zdGdyZXNhZG1pbg==
  POSTGRES_PASSWORD: c234Rw==
  PGDATA: L3Za234dGF0YQ==

pvc 和 sc yaml 文件如下:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgresql-pvc
  labels:
    app: postgresql
spec:
  storageClassName: postgresql-sc
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
---
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: postgresql-sc
mountOptions:
- dir_mode=0777
- file_mode=0777
- uid=1000
- gid=1000
parameters:
  skuName: Standard_LRS
provisioner: kubernetes.io/azure-file
reclaimPolicy: Retain

因此,当我使用“- mountPath:/var/lib/postgresql/”等挂载路径时,它就可以工作。我可以到达数据库,这很好。但是当我删除 pod 并重新创建时,没有数据库!因此没有数据持久性。

你能帮忙吗,我在这里缺少什么?

谢谢!

最佳答案

您可以尝试的一件事是将挂载选项中的uid=1000,gid=1000更改为999,因为这是postgres容器中postgres用户的uid(我没有测试这一点)。


另一个可以肯定解决此问题的解决方案涉及 init 容器。

Postgres 容器需要以 root 身份启动才能chown pgdata 目录,因为它是作为 root 目录安装的。执行此操作后,它会删除 root 权限并以 postgres 用户身份运行。

但是您可以使用 init 容器(以 root 身份运行)来 chmod 卷目录,以便您可以以非 root 身份运行主容器。

这是一个例子:

  initContainers:
    - name: init
      image: alpine
      command: ["sh", "-c", "chown 999:999 /var/lib/postgresql/data"]
      volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgredb-kap

关于postgresql - Azure kubernetes 上的 Postgres 卷权限错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66860101/

相关文章:

sql - 复杂的 SQL 连接

windows - Azure 即用即付

SSL "bare"(不带 www)自定义域的 Azure 前门和 DNS 配置

c# - 在 Azure 中托管 WCF 和可扩展性怎么样?

jenkins - Google Cloud Console Jenkins密码

azure - Azure 文件的权限

SQL仅获取列中所有值的项目

python - 检查python下是否存在postgresql表(可能还有Psycopg2)

kubernetes - 如何在 Kubernetes Secrets 中生成随机字符串/密码

sql - 如果使用 Jdbc 在 PostgreSQL 中有太多行,如何停止大型查询?