Я пытаюсь внедрить кластер 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
селектор:
приложение: постгрес