簡體   English   中英

Postgres on Azure kube.netes卷權限錯誤

[英]Postgres on Azure kubernetes volume permission error

我正在嘗試在具有數據持久性的 Azure Kube.netes 上部署 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 並重新創建時,沒有數據庫。 所以沒有數據持久性。

你能幫忙嗎,我在這里錯過了什么?

謝謝!

您可以嘗試的一件事是將掛載選項中的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

基於馬特的有用答案。 對於 bitnami postgresql,initContainer 也可以工作,但配置略有不同:

      initContainers:
        - name: init
          image: alpine
          command: ["sh", "-c", "chown 1001:1001 /bitnami/postgresql"]
          volumeMounts:
            - mountPath: /bitnami/postgresql
              name: postgres-volume

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM