Невозможно получить разрешения Postgres или PV C, работающие в AKS - PullRequest
0 голосов
/ 12 февраля 2020

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

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

  1. azure-storage-claim.yaml
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.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-app-storage
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: test-app-sc
  resources:
    requests:
      storage: 15Gi

PV C теперь настроен.

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

PGDATA

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

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

Исходя из этого, у меня есть postgres.yaml настройка, подобная следующей:

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:11-alpine
          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
          volumeMounts:
            - name: test-app-storage
              mountPath: /var/lib/postgresql-data
              subPath: postgres-storage
      volumes:
        - name: test-app-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

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

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

Так что с любым из них как Dockerfile:

FROM postgres:11-alpine
EXPOSE 5432
RUN /bin/bash -c 'chmod 777 /var/lib/postgresql-data'

Или

FROM postgres:11-alpine
EXPOSE 5432

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

            ...
            - name: POSTGRES_INITDB_ARGS
              value: "-A md5"
          volumeMounts:
            - name: test-app-storage
              mountPath: /var/lib/postgresql-data
              subPath: postgres-storage
      volumes:
        - name: test-app-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".

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

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

И это приведет к этому:

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

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

            ...
            - name: POSTGRES_INITDB_ARGS
              value: "-A md5"
              value: "-D /var/lib/postgresql/data/pgdata"
          volumeMounts:
            - name: test-app-storage
              mountPath: /var/lib/postgresql/data/pgdata
              subPath: postgres-storage
      volumes:
        - name: test-app-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: 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.

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

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

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

enter image description here

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

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

Где что-то идет не так?

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

Очевидно, это проблема с разрешениями, которая возникает, когда PGDATA совпадает каталог как mountPath. Например:

  ...
  - 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
...

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

  # 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

Permissions ls -l выглядит следующим образом:

$ 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

Разрешения для создания файлов данных: postgres. Однако при этом он не сопоставляется с Azure файлами и PV C. Он просто остается и уничтожается с помощью Pod.

Я думаю, что происходит mountPath использует root и PGDATA использует postgres, и каким-то образом mountPath пытается использовать postgres ???

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

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

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

{ ссылка }

Итак, я добавил следующее:

- name: postgres
  image: postgres
  command: 
  - /bin/chown
  - -R
  - "1000"
  - /var/lib/postgresql/data

Но это приводит к новой ошибке:

The selected container has not logged any messages yet.

Progress, I думаю.

1 Ответ

1 голос
/ 20 февраля 2020

Я думаю, что ваша проблема может быть связана с тем, что вы пытаетесь использовать subPath как часть вашего объекта развертывания

Пожалуйста, повторите вашу первую конфигурацию без этой строки:

subPath: postgres -storage

Это должно привести к этому объему Монтирует: - имя: postgres -storage mountPath: / var / lib / postgresql / data / pgdata

Дайте мне знать, если это поможет .

ОБНОВЛЕНИЕ: Изображение docker для postgresql требует особого внимания при использовании постоянного хранилища

https://hub.docker.com/_/postgres

Основная оговорка Следует отметить, что postgres не волнует, какой UID он использует (если владелец / var / lib / postgresql / data соответствует), но initdb заботится (и ему нужно, чтобы пользователь существовал в / etc / passwd ):

Три самых простых способа обойти это:

  1. использовать варианты Debian (не варианты Alpine) и, таким образом, разрешить образу использовать библиотеку nss_wrapper для «фальшивое» содержимое / etc / passwd для вас (см. docker -library / postgres # 448 для m или подробности)

  2. bind-mount / etc / passwd только для чтения с хоста (если желаемый UID является действительным пользователем на вашем хосте):

$ docker run -it --rm --user "$ (id -u): $ (id -g)" -v / etc / passwd: / etc / passwd: ro -e POSTGRES_PASSWORD = mysecretpassword postgres Файлы, принадлежащие этой системе баз данных, будут принадлежать пользователю "jsmith"

Инициализируйте целевой каталог отдельно от конечного времени выполнения (с промежуточным сокращением):

$ docker том create pgdata $ docker run -it --rm -v pgdata: / var / lib / postgresql / data -e POSTGRES_PASSWORD = mysecretpassword postgres Файлы, принадлежащие этой системе баз данных, будут принадлежать пользователю "postgres". (как только он успешно завершит инициализацию и ожидает подключения, остановите его) $ docker run -it --rm -v pgdata: / var / lib / postgresql / data bash chown -R 1000: 1000 / var / lib / postgresql / data $ docker run -it --rm --user 1000: 1000 -v pgdata: / var / lib / postgresql / data postgres LOG: система базы данных была закрыта в 2017-01-20 00: 03:23 UTC LOG: защита от многократного включения элементов теперь включена. LOG: автоматическая установка запуска запущена. LOG: система баз данных готова к приему соединений.

. Одним из решений было бы использование диаграммы управления, созданной bitnami, которую они разработали. значение по умолчанию для сложных конфигураций постоянного хранения с использованием контейнера init, и они также поддерживают конфигурацию / dev / shm, необходимую для исправления

. Также обратите внимание, что размер / dev / shm по умолчанию для контейнеров составляет 64 МБ. Если общая память исчерпана, вы столкнетесь с ОШИБКОЙ: невозможно изменить размер сегмента общей памяти. , , : На устройстве не осталось свободного места. Вы захотите передать --shm-size = 256MB, например, в docker run или, альтернативно, в docker -compose

Вот пример контейнера init, используемого диаграммой.

https://github.com/helm/charts/blob/master/stable/postgresql/templates/statefulset.yaml#L74 -L115

Рекомендуется использовать helm для установки диаграммы Postgres (которая использует набор состояний) вместо попытки развертывания БД с использованием объекта развертывания , (обычно вы хотите использовать объекты развертывания для приложения без сохранения состояния).

...