Puncte:0

PostgreSQL ca aplicație k8s cu stare - problemă cu volumele montate (în ceea ce privește proprietatea)

drapel de

Î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
Mikołaj Głodziak avatar
drapel id
Ce versiune de Kubernetes ați folosit și cum exact ați configurat clusterul? Este important să vă reproduceți problema. De asemenea, evitați utilizarea pastebin sau orice alte instrumente și atașați fișierele de configurare ca text formatat direct la întrebare.
vrms avatar
drapel de
vă rugăm să rețineți adăugările de mai sus @MikoÅajGÅodziak
Mikołaj Głodziak avatar
drapel id
Utilizați [versiune neacceptată de Kubernetes](https://endoflife.date/kubernetes). Ai putea să-l actualizezi?
vrms avatar
drapel de
Nu sunt în posesia unor astfel de superputeri în mediul meu corporativ (și mai rău: administrația de stat) mă tem .-). Dar dacă îmi spuneți că problema în discuție aici ar putea să nu mai fie nicio problemă cu un k8s mai recent, s-ar putea să îl folosesc ca unghi pentru o solicitare de actualizare
Mikołaj Głodziak avatar
drapel id
Ar fi bine dacă clusterul ar putea fi actualizat. Fără el, va fi greu să ajuți. În plus, este posibil să modificați permisiunile relevante care sunt problematice în etapa creării imaginii?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.