Kubernetes — Не Удается Получить Разрешения Postgres Или Pvc, Работающие В Aks

  • Автор темы Mosyinentee
  • Обновлено
  • 21, Oct 2024
  • #1

Это в значительной степени шаги, которые я выполнил по порядку. В основном то, что описано в документации:

https://docs.microsoft.com/en-us/azure/aks/azure-files-dynamic-pv

  1.  
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     The selected container has not logged any messages yet.
     
- name: postgres image: postgres command: - /bin/chown - -R - "1000" - /var/lib/postgresql/data
  1. postgres
mountPath

PVC теперь настроен.

Изменен mountPath в соответствии с документацией по образу Postgres:

ПГДАТА

Эту необязательную переменную можно использовать для определения другого местоположения (например, подкаталога) для файлов базы данных. По умолчанию используется /var/lib/postgresql/data, но если используемый вами том данных является точкой монтирования файловой системы (как в случае с постоянными дисками GCE), Postgres initdb рекомендует подкаталог (например, /var/lib/postgresql/data/ pgdata ) будет создан для хранения данных.

Это переменная среды, не специфичная для Docker. Поскольку эта переменная используется двоичным файлом сервера postgres (см. документацию PostgreSQL), сценарий точки входа учитывает ее.

На основании этого у меня есть postgres setup like the following:

PGDATA

Вы получаете ошибку:

root

Итак, используя любой из них в качестве Dockerfile:

mountPath

Или

postgres

На самом деле это не имеет значения, вы все равно получите ошибку того же типа, выполнив любое из следующих действий:

$ ls -l drwxr-xr-x 1 root root 4096 Feb 2 06:06 apt drwxr-xr-x 1 root root 4096 Feb 2 06:07 dpkg drwxr-xr-x 2 root root 4096 Feb 2 06:06 exim4 drwxr-xr-x 2 root root 4096 Aug 28 2018 logrotate drwxr-xr-x 2 root root 4096 Nov 10 12:17 misc drwxr-xr-x 2 root root 4096 Jan 30 00:00 pam drwxr-xr-x 1 postgres postgres 4096 Feb 2 06:07 postgresql drwxrwxrwx 2 1000 1000 0 Jan 31 21:46 postgresql-data drwxr-xr-x 1 root root 4096 Jan 30 00:00 systemd drwxr-xr-x 3 root root 4096 Feb 2 06:07 ucf $ ls -l postgresql && ls -l postgresql/data && ls -l postgresql-data total 4 drwx------ 19 postgres postgres 4096 Feb 5 23:28 data total 124 drwx------ 6 postgres postgres 4096 Feb 5 23:28 base drwx------ 2 postgres postgres 4096 Feb 5 23:29 global drwx------ 2 postgres postgres 4096 Feb 5 23:28 pg_commit_ts drwx------ 2 postgres postgres 4096 Feb 5 23:28 pg_dynshmem -rw------- 1 postgres postgres 4281 Feb 5 23:28 pg_hba.conf -rw------- 1 postgres postgres 1636 Feb 5 23:28 pg_ident.conf drwx------ 4 postgres postgres 4096 Feb 5 23:33 pg_logical drwx------ 4 postgres postgres 4096 Feb 5 23:28 pg_multixact drwx------ 2 postgres postgres 4096 Feb 5 23:28 pg_notify drwx------ 2 postgres postgres 4096 Feb 5 23:28 pg_replslot drwx------ 2 postgres postgres 4096 Feb 5 23:28 pg_serial drwx------ 2 postgres postgres 4096 Feb 5 23:28 pg_snapshots drwx------ 2 postgres postgres 4096 Feb 5 23:28 pg_stat drwx------ 2 postgres postgres 4096 Feb 5 23:51 pg_stat_tmp drwx------ 2 postgres postgres 4096 Feb 5 23:28 pg_subtrans drwx------ 2 postgres postgres 4096 Feb 5 23:28 pg_tblspc drwx------ 2 postgres postgres 4096 Feb 5 23:28 pg_twophase -rw------- 1 postgres postgres 3 Feb 5 23:28 PG_VERSION drwx------ 3 postgres postgres 4096 Feb 5 23:28 pg_wal drwx------ 2 postgres postgres 4096 Feb 5 23:28 pg_xact -rw------- 1 postgres postgres 88 Feb 5 23:28 postgresql.auto.conf -rw------- 1 postgres postgres 26588 Feb 5 23:28 postgresql.conf -rw------- 1 postgres postgres 36 Feb 5 23:28 postmaster.opts -rw------- 1 postgres postgres 94 Feb 5 23:28 postmaster.pid total 0

Результат: следующая ошибка:

ls -l

Попробуйте это:

# Thus /var/lib/postgresql/data # - name: PGDATA # value: /var/lib/postgresql-data volumeMounts: - name: test-app-storage mountPath: /var/lib/postgresql-data subPath: postgres-storage

И это приводит к следующему:

... - name: PGDATA value: /var/lib/postgresql-data volumeMounts: - name: test-app-storage mountPath: /var/lib/postgresql-data subPath: postgres-storage ... or ... # if PGDATA is not specified it defaults to /var/lib/postgresql/data # - name: PGDATA # value: /var/lib/postgresql-data volumeMounts: - name: test-app-storage mountPath: /var/lib/postgresql/data subPath: postgres-storage ...

Попробуйте это:

mountPath

И это приводит к следующему:

PGDATA

Кто-то предложил избавиться от крепления тома вот так:

... - name: POSTGRES_INITDB_ARGS value: "-A md5" - name: PGDATA value: /var/lib/postgresql/data/pgdata volumes: - name: postgres-storage persistentVolumeClaim: claimName: test-app-storage ...

Что, эй, это действительно работает! Но данные не сохраняются, поскольку они просто используют хранилище Pod, поэтому это довольно бессмысленно:

kubernetes — не удается получить разрешения Postgres или PVC, работающие в AKS

И конечно же, когда вы создаете таблицу в Postgres, уничтожаете под, а затем повторно развертываете его, таблицы, конечно же, больше нет.

Так что, скорее всего, я делаю что-то не так, но я следую документации и кажется, что это должно сработать.

Где дела идут не так?

РЕДАКТИРОВАТЬ: Разрешения в Pod

По-видимому, это проблема с разрешениями, которая возникает, когда 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 ... So nothing seems to work that I've tried and following the documentation where I can. is the same directory as ... - name: POSTGRES_INITDB_ARGS value: "-A md5" value: "-D /var/lib/postgresql/data/pgdata" volumeMounts: - name: postgres-storage mountPath: /var/lib/postgresql/data/pgdata subPath: postgres-storage volumes: - name: postgres-storage persistentVolumeClaim: claimName: test-app-storage ... . Например:

chmod: changing permissions of '/var/lib/postgresql/data': Operation not permitted

Что-то вроде этого, когда они не совпадают, создаст Pod, но использует хранилище Pod, что мне явно не нужно:

... - name: POSTGRES_INITDB_ARGS value: "-A md5" volumeMounts: - name: postgres-storage mountPath: /var/lib/postgresql/data subPath: postgres-storage volumes: - name: postgres-storage persistentVolumeClaim: claimName: test-app-storage ...

Разрешения 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: directory "/var/lib/postgresql/data" exists but is not empty If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". looks like this:

... - name: POSTGRES_INITDB_ARGS value: "-A md5" volumeMounts: - name: postgres-storage mountPath: /var/lib/postgresql/data/pgdata subPath: postgres-storage volumes: - name: postgres-storage persistentVolumeClaim: claimName: test-app-storage ...<br>

Разрешения на то, где он создает файлы данных, FROM postgres:11-alpine EXPOSE 5432 . However, doing this, it doesn't map to Azure Files and the PVC. It just stays and is destroyed with the Pod.

Я думаю, что происходит FROM postgres:11-alpine EXPOSE 5432 RUN /bin/bash -c 'chmod 777 /var/lib/postgresql/data' RUN /bin/bash -c 'chmod 777 /var/lib/postgresql/data/pgdata' uses chmod: changing permissions of '/var/lib/postgresql/data/pgdata': Operation not permitted и apiVersion: apps/v1 kind: Deployment metadata: name: postgres-deployment spec: replicas: 1 selector: matchLabels: component: postgres template: metadata: labels: component: postgres spec: containers: - name: postgres image: postgres # I don't know, someone suggested this, but doesn't work apparently securityContext: runAsUser: 0 ports: - containerPort: 5432 env: - name: POSTGRES_DB valueFrom: secretKeyRef: name: test-app-secrets key: PGDATABASE - name: POSTGRES_USER valueFrom: secretKeyRef: name: test-app-secrets key: PGUSER - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: test-app-secrets key: PGPASSWORD - name: POSTGRES_INITDB_ARGS value: "-A md5" - name: PGDATA value: /var/lib/postgresql/data/pgdata volumeMounts: - name: postgres-storage mountPath: /var/lib/postgresql/data/pgdata subPath: postgres-storage volumes: - name: postgres-storage persistentVolumeClaim: claimName: test-app-storage --- apiVersion: v1 kind: Service metadata: name: postgres-cluster-ip-service spec: type: ClusterIP selector: component: postgres ports: - port: 1423 targetPort: 5432 uses postgres.yaml , и как-то apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-app-storage spec: accessModes: - ReadWriteMany storageClassName: test-app-sc resources: requests: storage: 15Gi<br> is trying to use azure-storage.yaml ???

Действительно, не уверен и все еще не понимаю, как решить эту проблему.

РЕДАКТИРОВАТЬ2

Наткнулся на такой ответ:

https://stackoverflow.com/a/51203031/3123109

Поэтому добавил к себе следующее:

kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: test-app-sc provisioner: kubernetes.io/azure-file mountOptions: - dir_mode=0777 - file_mode=0777 - uid=1000 - gid=1000 - mfsymlinks - nobrl - cache=none parameters: skuName: Standard_LRS location: westus

Но это порождает новую ошибку:

azure-storage-claim.yaml

Прогресс, я думаю.

#kubernetes #azure #postgresql #azure-kubernetes-service #persistent-volumes

Mosyinentee


Рег
27 Nov, 2019

Тем
91

Постов
205

Баллов
700
  • 25, Oct 2024
  • #2

Следующая установка работает для меня. При использовании

     spec:

...

containers:

- ...

volumeMounts:

# need a subpath as postgres wants an empty folder (the mounted folder `/var/lib/postgresql/data` has a `lost+found` directory)

# see https://stackoverflow.com/questions/51168558/how-to-mount-a-postgresql-volume-using-aws-ebs-in-kubernete

# this is used together with the env var PGDATA = /var/lib/postgresql/data/pgdata (below)

# the owner:group of this folder is 70:70 (postgres:postgres), done by this step in the docker image:

# https://github.com/docker-library/postgres/blob/master/Dockerfile-alpine.template#L146

- mountPath: /var/lib/postgresql/data

subPath: pgdata

name: my-postgres-pv

...

env:

# need to define PGDATA env var because not using the default /var/lib/postgresql/data, but a subpath under it.

- name: PGDATA

value: /var/lib/postgresql/data/pgdata

...
 
in subPath , проблема с разрешениями решается автоматически, поскольку пользователь postgres owns the folder corresponding to the volumeMounts .

subPath
 

Шана


Рег
13 Aug, 2011

Тем
59

Постов
193

Баллов
518
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно