【问题标题】:Postgres on Azure kubernetes volume permission errorAzure kubernetes 卷权限错误上的 Postgres
【发布时间】:2021-03-29 19:03:55
【问题描述】:

我正在尝试在 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

秘密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 并重新创建时,没有数据库!所以没有数据持久性。

你能帮忙吗,我在这里错过了什么?

谢谢!

【问题讨论】:

  • 能否分享“kubectl get pv”和“kubectl get pvc”命令的输出?

标签: postgresql azure kubernetes yaml


【解决方案1】:

您可以尝试的一件事是将挂载选项中的uid=1000,gid=1000 更改为 999,因为这是 postgres conatiner 中 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

【讨论】:

    猜你喜欢
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多