Încerc să adopt un cluster PostgreSQL k8s cu stare pe baza acestui articol la mediul local din compania mea.
EDITAȚI | ×
acesta este un cluster vmware tanzu, pe care nu l-am configurat eu însumi, deci nu am alte detalii despre natura clusterului în sine. Am adăugat un StorageClass la care mă refer
> versiunea kubectl
Versiune client: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.8", GitCommit:"5575935422cc1cf5169dfc8847cb587aa47bac5a", GitTreeState:"clean", BuildDate:"-026T:"-026T:" 45Z", GoVersion:"go1.15.13", Compiler:"gc", Platforma:"linux/amd64"}
Versiune server: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.8+vmware.1", GitCommit:"3e397df2f5dadadfa35958ec45c14b0e81abc25f", GitTreeState:"clean",-2021ate 21T16:59:40Z", GoVersion:"go1.15.13", Compiler:"gc", Platforma:"linux/amd64"}
PostgreSQL rulează ca utilizator postgres, nu ca root. Aceasta poate face parte din problema mea.
termina EDITARE
Există o imagine PostgreSQL personalizată care montează 3 volume ca
/opt/db/data/postgres/data
/opt/db/backup/postgres/backups
/opt/db/backup/postgres/archives
La aplicarea acelor fișiere (în ordinea în care sunt listate mai jos) în cluster, podul postgres nu se rotește și jurnalele raportează o problemă cu drepturile de acces.
> kcl înregistrează pod/postgres-stateful-0
pornirea imaginii postgres docker:
postgres -D /opt/db/data/postgres/data
+ echo „pornirea imaginii postgres docker:”
+ echo 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: modificarea permisiunilor pentru „/opt/db/data/postgres/data”: operațiunea nu este permisă
aceasta provine din docker-entrypoint.sh
rulează la crearea containerului.
scriptul verifică dacă directorul $PGDATA (/opt/db/data/postgres/data) există și dacă este deținut de utilizatorul postgres. De fapt, cel Dockerfile din imaginea personalizată creează acest lucru corect, astfel încât mkdir
și chmod
acțiunea trebuie sărită și containerul trebuie pornit.
Acest lucru funcționează atunci când rulați un singur pod pe baza acelei imagini.
Deci presupun că montarea volumelor în interiorul containerului distruge cumva proprietatea și mă întreb cum să ocolesc acest lucru sau, cu alte cuvinte, cum să definesc proprietar
și drepturi de acces pentru căile de montare din interiorul containerului care urmează să fie creat.
Îmi poate indica cineva direcția corectă despre cum să rezolv asta? Nici nu aș putea spune dacă statefulset.yml sau storage.yaml trebuie ajustat
Crearea imaginii
ARG REGISTRY=docker-dev-local.intern.net
ARG BASE_IMAGE_REPO=scm
ARG BASE_IMAGE_NAME=debian-bullseye
ARG BASE_IMAGE_TAG=cele mai recente
# A doua etapă - creați imaginea de rulare
# ------------------------------------
#FROM debian:11 ca bază
#FROM docker-dev-local.intern.net/scm/debian-bullseye:build-74 ca bază
DIN $REGISTRY/$BASE_IMAGE_REPO/$BASE_IMAGE_NAME:$BASE_IMAGE_TAG
# Întreținetor
# ----------
LABEL org.opencontainers.image.authors="<[email protected]>"
# Construiți variabile de mediu, modificați după cum este necesar
# --------------------------------------------- ------------
ARG PG_MAJOR=14
ARG PG_VERSION=14.1
ARG DIST_VERSION=deb11
ARG DVZ_BUILD=dvz1
ENV DVZ_REPO_URL=http://dvzsn-rd1115.dbmon.rz-dvz.cn-mv.de/scb-repo
# Variabilele de mediu necesare pentru această versiune (NU modificați)
# --------------------------------------------- ------------
ENV PG_MAJOR=${PG_MAJOR}
ENV PG_VERSION=${PG_VERSION}
ENV PGUSER=postgres
ENV PGDATABASE=postgres
ENV PGPORT=5432
ENV DBBASE=/opt/db
ENV PGBASE=$DBBASE/postgres
ENV PGBIN=$PGBASE/bin
ENV PGHOME=$PGBASE/postgresql
ENV PGDATA=$DBBASE/data/postgres/data
ENV PGLOG=$PGDATA/log
ENV PGBACK=$DBBASE/backup/postgres/backups
ENV PGARCH=$DBBASE/backup/postgres/archives
ENV PATH=$PGHOME/bin:$CALE
ENV LANG=de_DE.UTF-8
ENV LC_MESSAGES=en_US.UTF-8
ENV TZ=Europa/Berlin
RUN env | fel
# Instalați pachete și dependențe suplimentare
# --------------------------------------------
RUN set -ex; \
apt-get update && \
apt-get upgrade && \
apt-get install -y --no-install-recommends \
certificate ca \
curl \
dirmngr \
gnupg \
iproute2 \
Mai puțin \
libnss-wrapper \
libpam0g \
libreadline8 \
libselinux1 \
libsystemd0 \
libxml2 \
localități \
openssl \
procps \
vim-tiny \
wget \
xz-utils \
zlib1g \
&& \
apt-a face curat
# creați locale pentru en_US și 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 && \
local -a
# Configurați utilizatorul și directoarele
# ---------------------------
RUN 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/date && \
chmod a+xr $PGBASE
# configurați mediul utilizatorului
# ---------------
USER postgres
COPIEAZĂ --chown=postgres:postgres [„fișiere/.alias”, „fișiere/.bashrc”, „fișiere/postgresql.conf.${PG_MAJOR}”, „fișiere/conf.d/00-ina-default.conf ", "/hom
COPY [„fișiere/docker-entrypoint.sh”, „/”]
ADAUGĂ [„files/pg-docker-env.tar.gz”, „$PGBASE/”]
# instalați postgres
# --------------------
# copiați pachetul postgres din etapa de constructor
#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_
# descărcați versiunea postgres
WORKDIR $PGBASE
RUN curl -sSL $DVZ_REPO_URL/postgres/Linux/$DIST_VERSION/postgresql-$PG_VERSION-$DIST_VERSION-dvz1.tar.gz | tar xzf - -C $PGBASE
RUN ln -s $PGBASE/postgresql-$PG_VERSION-$DIST_VERSION-$DVZ_BUILD postgresql
# legături
# --------
VOLUM [„$PGDATA”, „$PGBACK”, „$PGARCH”]
SEMNAL DE OPRIRE
EXPUNERE 5432
VERIFICARE SĂNĂTATE --interval=1m --start-period=5m \
CMD pg_ctl status >>/dev/null || iesirea 1
# Definiți comanda implicită pentru a porni baza de date.
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["postgres", "-D", "/opt/db/data/postgres/data"]
#!/bin/bash
set -xeEuo pipefail
echo „pornirea imaginii postgres docker:”
ecou „$@”
# verificați directorul PGDATA și creați dacă este necesar
dacă [ \! -d $PGDATA ] || [ \! -O $PGDATA ]
atunci
mkdir -p $PGDATA
chmod 700 $PGDATA
fi
# verificați clusterul bazei de date în directorul PGDATA și creați un nou cluster db, dacă este necesar
dacă [ \! -s $PGDATA/PG_VERSION ] || ! pg_controldata
atunci
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” )
mv $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 „# permit conexiunile prin gateway sau bridge Docker”
echo „găzduiește toate 172.16.0.0/14 md5”
} >> „$PGDATA/pg_hba.conf”
fi
# arată versiunea PGDATA și datele de control
echo "PGDATA/PGVERSION=`cat $PGDATA/PG_VERSION`"
# porniți postgres rdbms acum
exec „$@”
declarații kubernetes
fel: PersistentVolume
apiVersion: v1
metadate:
nume: postgres-pgdata33
etichete:
aplicație: postgres
tip: local
specificație:
storageClassName: ina01
capacitate:
stocare: 1Gi
Moduri de acces:
- ReadWriteOnce
hostPath:
cale: "/var/data"
---
fel: PersistentVolume
apiVersion: v1
metadate:
nume: postgres-pgbackup33
etichete:
aplicație: postgres
tip: local
specificație:
storageClassName: ina01
capacitate:
stocare: 1Gi
Moduri de acces:
- ReadWriteOnce
hostPath: cale: „/var/data”
---
fel: PersistentVolume
apiVersion: v1
metadate:
nume: postgres-pgarch33
etichete:
aplicație: postgres
tip: local
specificație:
storageClassName: ina01
capacitate:
stocare: 1Gi
Moduri de acces:
- ReadWriteOnce
hostPath:
cale: "/var/data"
# ################################################# ###################################
---
fel: PersistentVolumeClaim
apiVersion: v1
metadate:
nume: pgdata33-pvc
etichete:
aplicație: postgres
specificație:
storageClassName: ina01
capacitate:
Moduri de acces:
- ReadWriteOnce
resurse:
cereri:
stocare: 1Gi
---
fel: PersistentVolumeClaim
apiVersion: v1
metadate:
nume: pgbackup33-pvc
etichete:
aplicație: postgres
specificație:
storageClassName: ina01
capacitate:
Moduri de acces:
- ReadWriteOnce
resurse:
cereri:
stocare: 1Gi
---
fel: PersistentVolumeClaim
apiVersion: v1
metadate:
nume: pgarch33-pvc
etichete:
aplicație: postgres
specificație:
storageClassName: ina01
capacitate:
Moduri de acces:
- ReadWriteOnce
resurse:
cereri:
stocare: 1Gi
apiVersion: v1
fel: ConfigMap
metadate:
nume: postgres-configuration
etichete:
aplicație: postgres
date:
POSTGRES_DB: awesomedb
POSTGRES_USER: utilizator uimitor
POSTGRES_PASSWORD: parolă perfectă
---
apiVersion: apps/v1
fel: StatefulSet
metadate:
nume: postgres-stateful
etichete:
aplicație: postgres
specificație:
serviceName: „postgres”
replici: 1
selector:
matchLabels:
aplicație: postgres
șablon:
metadate:
etichete:
aplicație: postgres
specificație:
containere:
- nume: postgres
imagine: docker-dev-local.intern.net/ina/postgresql:14.1-scm-debian-bullseye-build-74-4
envFrom:
- configMapRef:
nume: postgres-configuration
porturi:
- containerPort: 5432
nume: postgresdb
volumMonturi:
- nume: pv-data
mountPath: /opt/db/data/postgres/data # /var/lib/postgresql/data
- nume: pv-backup
mountPath: /opt/db/backup/postgres
- denumire: pv-arh
mountPath: /opt/db/backup/postgres/arch
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
volume:
- nume: pv-data
persistentVolumeClaim:
claimName: pgdata33-pvc
- nume: pv-backup
persistentVolumeClaim:
claimName: pgbackup33-pvc
- denumire: pv-arh
persistentVolumeClaim:
claimName: pgarch33-pvc
apiVersion: v1
fel: Serviciu
metadate:
nume: postgres-service
etichete:
aplicație: postgres
specificație:
porturi:
- port: 5432
nume: postgres
tip: NodePort
selector:
aplicație: postgres