- 21, Oct 2024
- #1
Это в значительной степени шаги, которые я выполнил по порядку. В основном то, что описано в документации:
https://docs.microsoft.com/en-us/azure/aks/azure-files-dynamic-pv
-
The selected container has not logged any messages yet.
- name: postgres
image: postgres
command:
- /bin/chown
- -R
- "1000"
- /var/lib/postgresql/data
-
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, поэтому это довольно бессмысленно:
И конечно же, когда вы создаете таблицу в 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