Рейтинг:0

PostgreSQL как приложение k8s с отслеживанием состояния — проблема с подключенными томами (в отношении владения)

флаг de

Я пытаюсь внедрить кластер PostgreSQL k8s с отслеживанием состояния. на основе этой статьи к местной среде в моей компании.

РЕДАКТИРОВАТЬ
это кластер vmware tanzu, который я не настраивал сам, поэтому у меня нет никаких дополнительных сведений о природе самого кластера. Я добавил StorageClass, на который я ссылаюсь

> кубектл версия
Версия клиента: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.8", GitCommit:"5575935422cc1cf5169dfc8847cb587aa47bac5a", GitTreeState:"clean", BuildDate:"2021-06-16T13:00: 45Z", версия Go: "go1.15.13", компилятор: "gc", платформа: "linux/amd64"}
Версия сервера: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.8+vmware.1", GitCommit:"3e397df2f5dadadfa35958ec45c14b0e81abc25f", GitTreeState:"clean", BuildDate:"2021-06- 21T16:59:40Z", GoVersion: "go1.15.13", компилятор: "gc", платформа: "linux/amd64"}

PostgreSQL работает от имени пользователя postgres, а не root. Это может быть частью моей проблемы.

конец РЕДАКТИРОВАТЬ

Существует собственный образ PostgreSQL, который монтирует 3 тома как

  • /opt/дб/данные/постгрес/данные
  • /опт/БД/резервное копирование/постгрес/резервные копии
  • /опт/БД/резервное копирование/постгрес/архивы

При применении этих файлов (в том порядке, в котором они перечислены ниже) вверх по кластеру модуль postgres не раскручивается, а журналы сообщают о проблеме с правами доступа.

> журналы kcl pod/postgres-stateful-0
запуск образа докера postgres:
postgres -D /opt/db/данные/postgres/данные
+ echo 'запуск образа докера postgres:'
+ эхо postgres -D /opt/db/data/postgres/data
+ '[' '!' -d /opt/db/data/postgres/data ']'
+ '[' '!' -O /opt/db/data/postgres/data ']'
+ mkdir -p /opt/db/data/postgres/data
+ chmod 700 /opt/db/data/postgres/data
chmod: изменение разрешений '/opt/db/data/postgres/data': операция не разрешена

это вытекает из докер-entrypoint.sh работает при создании контейнера.

скрипт проверяет, существует ли каталог $PGDATA (/opt/db/data/postgres/data) и принадлежит ли он моему пользователю postgres. На самом деле Докерфайл из пользовательского изображения создает это правильно, поэтому мкдир и chmod действие должно быть пропущено, а контейнер должен быть запущен.

Это работает, когда вы просто запускаете один модуль на основе этого образа.

Итак, я предполагаю, что установка Volums внутри контейнера каким-то образом разрушает право собственности, и мне интересно, как обойти это или, другими словами, определить владелец и права доступа для путей монтирования внутри создаваемого контейнера.

Может ли кто-нибудь указать мне правильное направление, как решить эту проблему? Я даже не мог сказать, это statefulset.yml или storage.yaml нужно настроить


Создание образа

РЕГИСТРАЦИЯ ARG=docker-dev-local.intern.net
ARG BASE_IMAGE_REPO=скм
ARG BASE_IMAGE_NAME=debian-яблочко
ARG BASE_IMAGE_TAG=последний

# Второй этап - создаем runtime-образ
# ---------------------------------------------
#FROM debian:11 в качестве основы
#FROM docker-dev-local.intern.net/scm/debian-bullseye:build-74 в качестве основы
ИЗ $REGISTRY/$BASE_IMAGE_REPO/$BASE_IMAGE_NAME:$BASE_IMAGE_TAG

# Сопровождающий
# ----------
ЭТИКЕТКА org.opencontainers.image.authors="<[email protected]>"

# Создайте переменные среды, измените по мере необходимости
# --------------------------------------------- ------------
АРГ PG_MAJOR=14
АРГ PG_VERSION=14.1
ARG DIST_VERSION=deb11
АРГ DVZ_BUILD=dvz1
ENV DVZ_REPO_URL=http://dvzsn-rd1115.dbmon.rz-dvz.cn-mv.de/scb-repo

# Переменные среды, необходимые для этой сборки (НЕ меняйте)
# --------------------------------------------- ------------
ОКРУГ PG_MAJOR=${PG_MAJOR}
ENV PG_VERSION=${PG_VERSION}
ENV PGUSER=postgres
ENV PGDATABASE=postgres
ENVPGPORT=5432
ENV DBBASE=/opt/дБ
ENV PGBASE=$DBBASE/postgres
ENV PGBIN=$PGBASE/бин
ENV PGHOME=$PGBASE/postgresql
ENV PGDATA=$DBBASE/данные/postgres/данные
ENV PGLOG=$PGDATA/журнал
ENV PGBACK=$DBBASE/резервная копия/postgres/резервные копии
ENV PGARCH=$DBBASE/резервная копия/postgres/архивы

ПУТЬ ОКРУЖАЮЩЕЙ СРЕДЫ=$PGHOME/bin:$ПУТЬ

ЯЗЫК ENV=de_DE.UTF-8
ENV LC_MESSAGES=en_US.UTF-8
ENV TZ=Европа/Берлин

ВЫПОЛНИТЬ окружение | Сортировать

# Установите дополнительные пакеты и зависимости
# ---------------------------------------------
ВЫПОЛНИТЬ набор -ex; \
    apt-получить обновление && \
    apt-получить обновление && \
    apt-get install -y --no-install-recommends \
        ca-сертификаты \
        завиток \
        дирмнгр \
        гнупг \
        iproute2 \
        меньше \
        libnss-обертка \
        libpam0g \
        libreadline8 \
        libselinux1 \
        libsystemd0 \
        libxml2 \
        локали \
        OpenSSL \
        процедуры \
        vim-крошечный \
        wget \
        xz-утилиты \
        zlib1g \
    && \
    apt-получить чистый

# создаем локали для en_US и de_DE
RUN localedef -i en_US -f UTF-8 en_US.UTF-8 && \
    localedef -i de_DE -f UTF-8 de_DE.UTF-8 && \
    локаль -а

# Настраиваем пользователя и каталоги
# ------------------------------------------
ВЫПОЛНИТЬ mkdir -p $PGBASE $PGBIN $PGDATA $PGBACK $PGARCH && \
    useradd -d /home/postgres -m -s /bin/bash --no-log-init postgres && \
    chown -R postgres:postgres $PGBASE $PGDATA $PGBACK $PGARCH $DBBASE/данные && \
    chmod a+xr $PGBASE

# настроить пользовательскую среду
# ---------------
ПОЛЬЗОВАТЕЛЬ
КОПИРОВАТЬ --chown=postgres:postgres ["files/.alias", "files/.bashrc", "files/postgresql.conf.${PG_MAJOR}", "files/conf.d/00-ina-default.conf ", "/ хом
КОПИРОВАТЬ ["файлы/docker-entrypoint.sh", "/"]
ДОБАВИТЬ ["files/pg-docker-env.tar.gz", "$PGBASE/"]

# устанавливаем постгрес
# --------------------
# копируем пакет postgres со стадии сборки
#RUN mkdir -p $PGBASE/postgresql-$PG_VERSION-$DIST_VERSION-$DVZ_BUILD
#COPY --from=build --chown=postgres:postgres ["$PGBASE/postgresql-$PG_VERSION-$DIST_VERSION-$DVZ_BUILD", "$PGBASE/postgresql-$PG_VERSION-$DIST_
# скачать сборку postgres
РАБОЧИЙ КАТАЛОГ $PGBASE
RUN curl -sSL $DVZ_REPO_URL/postgres/Linux/$DIST_VERSION/postgresql-$PG_VERSION-$DIST_VERSION-dvz1.tar.gz | смола xzf - -C $PGBASE
RUN ln -s $PGBASE/postgresql-$PG_VERSION-$DIST_VERSION-$DVZ_BUILD postgresql

# привязки
# --------
ОБЪЕМ ["$PGDATA", "$PGBACK", "$PGARCH"]
СТОП-СИГНАЛ
ВЫСТАВИТЬ 5432
HEALTHCHECK --interval=1m --start-period=5m \
   Статус CMD pg_ctl >/dev/null || выход 1

# Определить команду по умолчанию для запуска базы данных.
ТОЧКА ВХОДА ["/docker-entrypoint.sh"]
CMD ["postgres", "-D", "/opt/db/data/postgres/data"]
#!/бин/баш
установить -xeEuo pipefail

echo "запуск образа докера postgres:"
эхо "$@"

# проверить каталог PGDATA и создать его при необходимости
если [ \! -d $PGDATA] || [\! -O $PGDATA]
тогда
    mkdir -p $PGDATA
    chmod 700 $PGDATA
фи

# проверить кластер базы данных в каталоге PGDATA и при необходимости создать новый кластер базы данных
если [ \! -s $PGDATA/PG_VERSION ] || ! pg_controldata
тогда
    POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-"Start1234"}
    initdb -D $PGDATA --locale=de_DE.UTF-8 --lc-messages=en_US.UTF-8 --auth-local=trust --auth-host=md5 --pwfile=<(echo "$POSTGRES_PASSWORD" )
    МВ $PGDATA/postgresql.conf $PGDATA/postgresql.conf.orig
    cp ~/postgresql.conf.${PG_MAJOR} $PGDATA/postgresql.conf
    mkdir -p $PGDATA/conf.d
    cp ~/00-ina-default.conf $PGDATA/conf.d/
    {
        echo "# разрешить подключения через шлюз или мост докеров"
        echo "хост все все 172.16.0.0/14 md5"
    } >> "$PGDATA/pg_hba.conf"
фи

# показать версию PGDATA и управляющие данные
echo "PGDATA/PGVERSION=`cat $PGDATA/PG_VERSION`"

# запустить postgres rdbms сейчас
выполнить "$@"

декларации кубернета

вид: персистентволуме
апиВерсия: v1
метаданные:
  имя: postgres-pgdata33
  этикетки:
    приложение: постгрес
    тип: местный
спецификация:
  StorageClassName: ina01
  емкость:
    хранилище: 1Gi
  режимы доступа:
    - ReadWriteOnce
  путь хоста:
    путь: "/var/данные"
---
вид: персистентволуме
апиВерсия: v1
метаданные:
  имя: postgres-pgbackup33
  этикетки:
    приложение: постгрес
    тип: местный
спецификация:
  StorageClassName: ina01
  емкость:
    хранилище: 1Gi
  режимы доступа:
    - ReadWriteOnce
  hostPath: путь: "/var/data"
---
вид: персистентволуме
апиВерсия: v1
метаданные:
  имя: postgres-pgarch33
  этикетки:
    приложение: постгрес
    тип: местный
спецификация:
  StorageClassName: ina01
  емкость:
    хранилище: 1Gi
  режимы доступа:
    - ReadWriteOnce
  путь хоста:
    путь: "/var/данные"
# ################################################## #####################################
---
вид: Персистентволумеклаим
апиВерсия: v1
метаданные:
  имя: pgdata33-пвх
  этикетки:
    приложение: постгрес
спецификация:
  StorageClassName: ina01
  емкость:
  режимы доступа:
    - ReadWriteOnce
  Ресурсы:
    Запросы:
      хранилище: 1Gi
---
вид: Персистентволумеклаим
апиВерсия: v1
метаданные:
  имя: pgbackup33-pvc
  этикетки:
    приложение: постгрес
спецификация:
  StorageClassName: ina01
  емкость:
  режимы доступа:
    - ReadWriteOnce
  Ресурсы:
    Запросы:
      хранилище: 1Gi
---
вид: Персистентволумеклаим
апиВерсия: v1
метаданные:
  имя: pgarch33-пвх
  этикетки:
    приложение: постгрес
спецификация:
  StorageClassName: ina01
  емкость:
  режимы доступа:
    - ReadWriteOnce
  Ресурсы:
    Запросы:
      хранилище: 1Gi
апиВерсия: v1
вид: карта конфигурации
метаданные:
  имя: postgres-конфигурация
  этикетки:
    приложение: постгрес
данные:
  POSTGRES_DB: удивительная БД
  POSTGRES_USER: удивительный пользователь
  POSTGRES_PASSWORD: идеальный пароль
---
apiVersion: приложения/v1
вид: StatefulSet
метаданные:
  имя: postgres-состояние
  этикетки:
    приложение: постгрес
спецификация:
  имя_службы: "postgres"
  реплики: 1
  селектор:
    метки соответствия:
      приложение: постгрес
  шаблон:
    метаданные:
      этикетки:
        приложение: постгрес
    спецификация:
      контейнеры:
      - имя: постгрес
        образ: docker-dev-local.intern.net/ina/postgresql:14.1-scm-debian-bullseye-build-74-4
        envОт:
        - configMapRef:
            имя: postgres-конфигурация
        порты:
        - контейнерПорт: 5432
          имя: postgresdb
        томМаунты:
        - имя: pv-данные
          mountPath: /opt/db/data/postgres/data # /var/lib/postgresql/data
        - имя: pv-backup
          путь монтирования: /opt/db/backup/postgres
        - имя: pv-arch
          путь монтирования: /opt/db/backup/postgres/arch
      безопасностьКонтекст:
        запустить как пользователь: 1000
        группа запуска: 1000
        фсГрупп: 1000
      тома:
      - имя: pv-данные
        персистентволумеклайм:
          претензияИмя: pgdata33-pvc
      - имя: pv-backup
        персистентволумеклайм:
          претензияИмя: pgbackup33-pvc
      - имя: pv-arch
        персистентволумеклайм:
          претензияНазвание: pgarch33-pvc

апиВерсия: v1
вид: сервис
метаданные:
  имя: postgres-сервис
  этикетки:
    приложение: постгрес
спецификация:
  порты:
  - порт: 5432
    имя: постгрес
  тип: NodePort
  селектор:
    приложение: постгрес
Mikołaj Głodziak avatar
флаг id
Какую версию Kubernetes вы использовали и как именно настроили кластер? Важно воспроизвести вашу проблему. Также избегайте использования pastebin или любых других инструментов и прикрепляйте файлы конфигурации в виде форматированного текста непосредственно к вопросу.
vrms avatar
флаг de
обратите внимание на дополнения @MikoÅajGÅodziak
Mikołaj Głodziak avatar
флаг id
Вы используете [неподдерживаемую версию Kubernetes](https://endoflife.date/kubernetes). Не могли бы вы обновить его?
vrms avatar
флаг de
Боюсь, я не обладаю такими сверхспособностями в своей корпоративной (еще хуже: государственной администрации) среде.-). Но если вы скажете мне, что проблема здесь может больше не быть проблемой с более поздней версией k8, я могу использовать это как угол для запроса на обновление.
Mikołaj Głodziak avatar
флаг id
Было бы хорошо, если бы кластер можно было обновить. Без него будет сложно помочь. Кроме того, возможно ли изменить соответствующие разрешения, которые вызывают проблемы на этапе создания образа?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.