Score:0

PostgreSQL เป็นแอปพลิเคชัน stateful k8s - ปัญหาเกี่ยวกับไดรฟ์ข้อมูลที่ติดตั้ง (เกี่ยวกับความเป็นเจ้าของ)

ธง de

ฉันกำลังพยายามนำคลัสเตอร์ PostgreSQL ของ k8s มาใช้ ตามบทความนี้ ต่อสภาพแวดล้อมในท้องถิ่นในบริษัทของฉัน

แก้ไข
นี่คือคลัสเตอร์ vmware tanzu ซึ่งฉันไม่ได้ตั้งค่าเอง ดังนั้นฉันจึงไม่มีรายละเอียดเพิ่มเติมเกี่ยวกับธรรมชาติของคลัสเตอร์เอง ฉันได้เพิ่ม StorageClass ที่ฉันกำลังอ้างถึง

> รุ่น kubectl
เวอร์ชันไคลเอนต์: version.Info{หลัก:"1", รอง:"20", GitVersion:"v1.20.8", GitCommit:"5575935422cc1cf5169dfc8847cb587aa47bac5a", GitTreeState:"สะอาด", BuildDate:"2021-06-16T13:00: 45Z", GoVersion:"go1.15.13", คอมไพเลอร์:"gc", แพลตฟอร์ม:"linux/amd64"}
เวอร์ชันเซิร์ฟเวอร์: version.Info{หลัก:"1", รอง:"20", GitVersion:"v1.20.8+vmware.1", GitCommit:"3e397df2f5dadadfa35958ec45c14b0e81abc25f", GitTreeState:"สะอาด", BuildDate:"2021-06- 21T16:59:40Z", GoVersion:"go1.15.13", คอมไพเลอร์:"gc", แพลตฟอร์ม:"linux/amd64"}

PostgreSQL ทำงานในฐานะผู้ใช้ postgres ไม่ใช่รูท นี่อาจเป็นส่วนหนึ่งของปัญหาของฉัน

สิ้นสุดการแก้ไข

มีอิมเมจ PostgreSQL แบบกำหนดเองซึ่งเมานต์ 3 วอลุ่มเป็น

  • /opt/db/data/postgres/data
  • /opt/db/backup/postgres/backups
  • /opt/db/backup/postgres/ไฟล์เก็บถาวร

เมื่อใช้ไฟล์เหล่านั้น (ตามลำดับตามรายการด้านล่าง) ขึ้นคลัสเตอร์ postgres pod ไม่หมุนและบันทึกรายงานปัญหาเกี่ยวกับสิทธิ์การเข้าถึง

> บันทึก kcl pod/postgres-stateful-0
เริ่มต้นอิมเมจนักเทียบท่า postgres:
postgres -D /opt/db/data/postgres/data
+ echo 'เริ่มสร้างอิมเมจนักเทียบท่า postgres:'
+ 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: การเปลี่ยนสิทธิ์ของ '/opt/db/data/postgres/data': ไม่อนุญาตให้ดำเนินการ

สิ่งนี้เกิดจาก docker-entrypoint.sh ทำงานบนการสร้างคอนเทนเนอร์

สคริปต์ตรวจสอบว่ามี $PGDATA dir (/opt/db/data/postgres/data) อยู่หรือไม่และเป็นเจ้าของผู้ใช้ postgres ของฉันหรือไม่ ที่จริงแล้ว ไฟล์นักเทียบท่า จากภาพที่กำหนดเองสร้างสิ่งนี้อย่างถูกต้องดังนั้น มคเดียร์ และ chmod ควรข้ามการดำเนินการและควรเริ่มต้นคอนเทนเนอร์

ใช้งานได้เมื่อคุณเรียกใช้พ็อดเดียวตามภาพนั้น

ดังนั้นฉันเดาว่าการติดตั้ง Volums ภายในคอนเทนเนอร์จะทำให้ความเป็นเจ้าของเสียหายและฉันสงสัยว่าจะแก้ไขสิ่งนี้ได้อย่างไรหรืออีกนัยหนึ่งคือกำหนด เจ้าของ และสิทธิ์การเข้าถึงสำหรับเส้นทางเมานต์ภายในคอนเทนเนอร์ที่จะสร้าง

ใครสามารถชี้ให้ฉันเห็นทิศทางที่ถูกต้องเกี่ยวกับวิธีแก้ปัญหานี้ได้บ้าง ฉันไม่สามารถบอกได้ว่าเป็น statefulset.yml หรือ storage.yaml ที่ต้องปรับเปลี่ยน


การสร้างภาพ

ARG REGISTRY=นักเทียบท่า-dev-local.intern.net
ARG BASE_IMAGE_REPO=scm
ARG BASE_IMAGE_NAME=เดเบียน-บูลส์อาย
ARG BASE_IMAGE_TAG=ล่าสุด

# ขั้นตอนที่สอง - สร้างอิมเมจรันไทม์
# -----------------------------------
#FROM เดเบียน:11 เป็นฐาน
#FROM docker-dev-local.intern.net/scm/debian-bullseye:build-74 เป็นฐาน
จาก $REGISTRY/$BASE_IMAGE_REPO/$BASE_IMAGE_NAME:$BASE_IMAGE_TAG

#คนดูแล
# ----------
LABEL org.opencontainers.image.authors="<[email protected]>"

# สร้างตัวแปรสภาพแวดล้อมเปลี่ยนแปลงตามต้องการ
# --------------------------------------------- ------------
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

# ตัวแปรสภาพแวดล้อมที่จำเป็นสำหรับงานสร้างนี้ (ไม่เปลี่ยนแปลง)
# --------------------------------------------- ------------
ENV PG_MAJOR=${PG_MAJOR}
ENV PG_VERSION=${PG_VERSION}
ENV PGUSER=โพสเกรส
ENV PGDATABASE=postgres
ENV PGPORT=5432
ENV DBBASE=/opt/db
ENV PGBASE=$DBBASE/โพสต์เกรส
ENV PGBIN=$PGBASE/ถัง
ENV PGHOME=$PGBASE/postgresql
ENV PGDATA=$DBBASE/data/postgres/data
ENV PGLOG=$PGDATA/บันทึก
ENV PGBACK=$DBBASE/backup/postgres/backups
ENV PGARCH=$DBBASE/backup/postgres/archives

ENV PATH=$PGHOME/bin:$PATH

ENV LANG=de_DE.UTF-8
ENV LC_MESSAGES=th_US.UTF-8
ENV TZ=ยุโรป/เบอร์ลิน

เรียกใช้ env | เรียงลำดับ

# ติดตั้งแพ็คเกจเพิ่มเติมและการพึ่งพา
# --------------------------------------------
ชุด RUN -ex; \
    ฉลาดรับการปรับปรุง && \
    apt-รับการอัปเกรด && \
    apt-get install -y --no-install-recommends \
        ใบรับรอง ca \
        ขด \
        หรี่แสง \
        งุบงิบ \
        iproute2 \
        น้อย \
        libnss-wrapper \
        libpam0g \
        libreadline8 \
        libselinux1 \
        libsystemd0 \
        libxml2 \
        สถานที่ \
        opensl \
        อุปกรณ์ประกอบฉาก \
        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 && \
    สถานที่เกิดเหตุ -a

# ตั้งค่าผู้ใช้และไดเรกทอรี
# ---------------------------
เรียกใช้ 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/data && \
    chmod a+xr $PGBASE

# ตั้งค่า env ผู้ใช้
# ---------------
USER โพสเกรส
COPY --chown=postgres:postgres ["files/.alias", "files/.bashrc", "files/postgresql.conf.${PG_MAJOR}", "files/conf.d/00-ina-default.conf ", "/โฮม
คัดลอก ["files/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_
# ดาวน์โหลด build ของ postgres
เวิร์คดีอาร์ $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

#ผูกพัน
#--------
ปริมาณ ["$PGDATA", "$PGBACK", "$PGARCH"]
STOPSIGNAL สัญญาณ
เปิดเผย 5432
การตรวจสุขภาพ --interval=1m --start-period=5m \
   CMD pg_ctl สถานะ >/dev/null || ทางออก 1

# กำหนดคำสั่งเริ่มต้นเพื่อเริ่มฐานข้อมูล
จุดเข้าใช้งาน ["/docker-entrypoint.sh"]
CMD ["postgres", "-D", "/opt/db/data/postgres/data"]
#!/bin/bash
ตั้งค่า -xeEuo ไปป์ไลน์ล้มเหลว

echo "เริ่มสร้างอิมเมจนักเทียบท่า postgres:"
เสียงสะท้อน "$@"

# ตรวจสอบไดเร็กทอรี PGDATA และสร้างหากจำเป็น
ถ้า [ \! -d $PGDATA ] || [ \! -O $PGDATA ]
แล้ว
    mkdir -p $PGDATA
    chmod 700 $PGDATA
ไฟ

# ตรวจสอบคลัสเตอร์ฐานข้อมูลในไดเร็กทอรี PGDATA และสร้างคลัสเตอร์ db ใหม่หากจำเป็น
ถ้า [ \! -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" )
    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 "# อนุญาตการเชื่อมต่อผ่าน docker gateway หรือ bridge"
        echo "โฮสต์ทั้งหมด 172.16.0.0/14 md5"
    } >> "$PGDATA/pg_hba.conf"
ไฟ

# แสดงเวอร์ชัน PGDATA และข้อมูลการควบคุม
echo "PGDATA/PGVERSION=`cat $PGDATA/PG_VERSION`"

# เริ่ม postgres rdbms ทันที
ผู้บริหาร "$@"

การประกาศ kubernetes

ชนิด: PersistentVolume
api เวอร์ชัน: v1
ข้อมูลเมตา:
  ชื่อ: postgres-pgdata33
  ป้ายกำกับ:
    แอพ: postgres
    ประเภท: ท้องถิ่น
ข้อมูลจำเพาะ:
  storageClassName: ina01
  ความจุ:
    ความจุ: 1Gi
  โหมดการเข้าถึง:
    - ReadWriteOnce
  เส้นทางโฮสต์:
    เส้นทาง: "/var/data"
---
ชนิด: PersistentVolume
api เวอร์ชัน: v1
ข้อมูลเมตา:
  ชื่อ: postgres-pgbackup33
  ป้ายกำกับ:
    แอพ: postgres
    ประเภท: ท้องถิ่น
ข้อมูลจำเพาะ:
  storageClassName: ina01
  ความจุ:
    ความจุ: 1Gi
  โหมดการเข้าถึง:
    - ReadWriteOnce
  hostPath: เส้นทาง: "/var/data"
---
ชนิด: PersistentVolume
api เวอร์ชัน: v1
ข้อมูลเมตา:
  ชื่อ: postgres-pgarch33
  ป้ายกำกับ:
    แอพ: postgres
    ประเภท: ท้องถิ่น
ข้อมูลจำเพาะ:
  storageClassName: ina01
  ความจุ:
    ความจุ: 1Gi
  โหมดการเข้าถึง:
    - ReadWriteOnce
  เส้นทางโฮสต์:
    เส้นทาง: "/var/data"
# ################################################# ####################################
---
ชนิด: PersistentVolumeClaim
api เวอร์ชัน: v1
ข้อมูลเมตา:
  ชื่อ: pgdata33-pvc
  ป้ายกำกับ:
    แอพ: postgres
ข้อมูลจำเพาะ:
  storageClassName: ina01
  ความจุ:
  โหมดการเข้าถึง:
    - ReadWriteOnce
  ทรัพยากร:
    คำขอ:
      ความจุ: 1Gi
---
ชนิด: PersistentVolumeClaim
api เวอร์ชัน: v1
ข้อมูลเมตา:
  ชื่อ: pgbackup33-pvc
  ป้ายกำกับ:
    แอพ: postgres
ข้อมูลจำเพาะ:
  storageClassName: ina01
  ความจุ:
  โหมดการเข้าถึง:
    - ReadWriteOnce
  ทรัพยากร:
    คำขอ:
      ความจุ: 1Gi
---
ชนิด: PersistentVolumeClaim
api เวอร์ชัน: v1
ข้อมูลเมตา:
  ชื่อ: pgarch33-pvc
  ป้ายกำกับ:
    แอพ: postgres
ข้อมูลจำเพาะ:
  storageClassName: ina01
  ความจุ:
  โหมดการเข้าถึง:
    - ReadWriteOnce
  ทรัพยากร:
    คำขอ:
      ความจุ: 1Gi
api เวอร์ชัน: v1
ประเภท: ConfigMap
ข้อมูลเมตา:
  ชื่อ: การกำหนดค่า postgres
  ป้ายกำกับ:
    แอพ: postgres
ข้อมูล:
  POSTGRES_DB: สุดยอด db
  POSTGRES_USER: ผู้ใช้ที่น่าทึ่ง
  POSTGRES_PASSWORD: รหัสผ่านที่สมบูรณ์แบบ
---
apiVersion: แอป/v1
ประเภท: StatefulSet
ข้อมูลเมตา:
  ชื่อ: postgres-stateful
  ป้ายกำกับ:
    แอพ: postgres
ข้อมูลจำเพาะ:
  ชื่อบริการ: "postgres"
  แบบจำลอง: 1
  ตัวเลือก:
    ป้ายกำกับการแข่งขัน:
      แอพ: postgres
  แม่แบบ:
    ข้อมูลเมตา:
      ป้ายกำกับ:
        แอพ: postgres
    ข้อมูลจำเพาะ:
      ตู้คอนเทนเนอร์:
      - ชื่อ: โพสเกรส
        ภาพ: docker-dev-local.intern.net/ina/postgresql:14.1-scm-debian-bullseye-build-74-4
        envจาก:
        - configMapRef:
            ชื่อ: การกำหนดค่า postgres
        พอร์ต:
        - พอร์ตคอนเทนเนอร์: 5432
          ชื่อ: postgresdb
        ปริมาณการติดตั้ง:
        - ชื่อ: pv-data
          mountPath: /opt/db/data/postgres/data # /var/lib/postgresql/data
        - ชื่อ: pv-backup
          mountPath: /opt/db/backup/postgres
        - ชื่อ: pv-arch
          mountPath: /opt/db/backup/postgres/arch
      บริบทความปลอดภัย:
        เรียกใช้ AsUser: 1,000
        เรียกใช้ AsGroup: 1,000
        fsGroup: 1,000
      ปริมาณ:
      - ชื่อ: pv-data
        ถาวรVolumeClaim:
          ชื่อการอ้างสิทธิ์: pgdata33-pvc
      - ชื่อ: pv-backup
        ถาวรVolumeClaim:
          ชื่อการอ้างสิทธิ์: pgbackup33-pvc
      - ชื่อ: pv-arch
        ถาวรVolumeClaim:
          ชื่อการอ้างสิทธิ์: pgarch33-pvc

api เวอร์ชัน: v1
ชนิด:บริการ
ข้อมูลเมตา:
  ชื่อ: postgres-service
  ป้ายกำกับ:
    แอพ: postgres
ข้อมูลจำเพาะ:
  พอร์ต:
  - พอร์ต: 5432
    ชื่อ: โพสเกรส
  ประเภท: NodePort
  ตัวเลือก:
    แอพ: postgres
Mikołaj Głodziak avatar
id flag
คุณใช้ Kubernetes เวอร์ชันใด และตั้งค่าคลัสเตอร์อย่างไร สิ่งสำคัญคือต้องทำซ้ำปัญหาของคุณ โปรดหลีกเลี่ยงการใช้ Pastebin หรือเครื่องมืออื่นๆ และแนบไฟล์การกำหนดค่าของคุณในรูปแบบข้อความที่จัดรูปแบบโดยตรงกับคำถาม
vrms avatar
de flag
โปรดทราบเพิ่มเติมข้างต้น @MikoÅajGÅodziak
Mikołaj Głodziak avatar
id flag
คุณกำลังใช้ [เวอร์ชัน Kubernetes ที่ไม่รองรับ](https://endoflife.date/kubernetes) คุณช่วยปรับปรุงได้ไหม
vrms avatar
de flag
ฉันไม่ได้ครอบครองมหาอำนาจดังกล่าวในสภาพแวดล้อมขององค์กร (แย่กว่านั้น: การบริหารของรัฐ) ฉันกลัว .-) แต่ถ้าคุณบอกฉันว่าปัญหาตรงนี้อาจไม่ใช่ปัญหาอีกต่อไปกับ k8s ที่ใหม่กว่า ฉันอาจใช้สิ่งนี้เป็นมุมสำหรับคำขออัปเดต
Mikołaj Głodziak avatar
id flag
จะเป็นการดีหากสามารถอัปเดตคลัสเตอร์ได้ หากไม่มีก็จะยากที่จะช่วย นอกจากนี้ เป็นไปได้ไหมที่คุณจะเปลี่ยนสิทธิ์ที่เกี่ยวข้องซึ่งเป็นปัญหาในขั้นตอนการสร้างภาพ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา