Score:0

รีจิสทรีส่วนตัวของ Docker เป็น kubernetes pod - ภาพที่ถูกลบสร้างขึ้นใหม่โดยอัตโนมัติ

ธง es

ฉันเรียกใช้รีจิสทรีส่วนตัวของนักเทียบท่า v2.7.0 เป็น kubernetes pod พร้อมบริการและวอลุ่มถาวร ขอบคุณบทช่วยสอน Varun Kumar Gซึ่งเป็นวิธีเดียวที่ประสบความสำเร็จในการตั้งค่าของฉัน เพื่อให้ kubernetes ดึงจากรีจิสทรีนักเทียบท่าส่วนตัวใน my 3 โหนด - ในองค์กร - คลัสเตอร์พร้อม Ubuntu 20.04 lts kvms.

ปัญหาคือการลบรูปภาพออกจากรีจิสทรี kubernetes pod docker v2.7.0 (ต้องใช้เวอร์ชันก่อนหน้าเนื่องจาก v2.7.1 ล่าสุดไม่ทำงานกับ htpasswd). นอกจากนี้ฉันได้อ่านกระทู้ที่คล้ายกันมากมายเช่น นี้, นี้ และ นี้.

ด้วยการรัน docker Registry v2.7.1 เป็นคอนเทนเนอร์นักเทียบท่า, ฉันไม่มีปัญหาในการลบรูปภาพ ,

แต่ด้วยการรัน docker Registry v2.7.0 เป็นพ็อด kubernetesขั้นตอนการลบตามปกติ ทำให้ดันภาพที่ลบไปไม่ได้อีก, สม่ำเสมอ หลังจากลบ blobs สำเร็จและลบโฟลเดอร์รูปภาพด้วยตนเอง ภายใต้ /var/lib/registry/docker/registry/v2/repositories/.

ด้านล่างนี้คือ yaml พ็อดรีจิสตรี

api เวอร์ชัน: v1
ชนิด: ฝัก
ข้อมูลเมตา:
  ชื่อ: dockreg-pod
  ป้ายกำกับ:
    แอพ: mregistry
ข้อมูลจำเพาะ:
  ตู้คอนเทนเนอร์:
  - ชื่อ: รีจิสทรี
    ภาพ: รีจิสทรี:2.7.0
    imagePullPolicy: ถ้าไม่ใช่ปัจจุบัน
    ปริมาณการติดตั้ง:
    - ชื่อ: repo-vol
      mountPath: "/var/lib/registry"
    - ชื่อ: certs-vol
      mountPath: "/ ใบรับรอง"
      อ่านอย่างเดียว: จริง
    - ชื่อ: auth-vol
      mountPath: "/ รับรองความถูกต้อง"
      อ่านอย่างเดียว: จริง
    สภาพแวดล้อม:
    - ชื่อ: REGISTRY_AUTH
      ค่า: "htpasswd"
    - ชื่อ: REGISTRY_AUTH_HTPASSWD_REALM
      ค่า: "ขอบเขตรีจิสทรี"
    - ชื่อ: REGISTRY_AUTH_HTPASSWD_PATH
      ค่า: "/auth/htpasswd"
    - ชื่อ: REGISTRY_HTTP_TLS_CERTIFICATE
      ค่า: "/certs/tls.crt"
    - ชื่อ: REGISTRY_HTTP_TLS_KEY
      ค่า: "/certs/tls.key"
    - ชื่อ: REGISTRY_STORAGE_DELETE_ENABLED
      ค่า: "จริง"
  ปริมาณ:
  - ชื่อ: repo-vol
    ถาวรVolumeClaim:
      ชื่อการอ้างสิทธิ์: repo-pvc
  - ชื่อ: certs-vol
    ความลับ:
      ชื่อลับ: certs-secret
  - ชื่อ: auth-vol
    ความลับ:
      ชื่อลับ: รับรองความถูกต้อง
  นโยบายรีสตาร์ท: เสมอ
  ชื่อโหนด: ฤดูใบไม้ผลิ

และต่อไปนี้คือ yaml ปริมาณถาวร

api เวอร์ชัน: v1
ชนิด: PersistentVolume
ข้อมูลเมตา:
  ชื่อ: repo-pv
  ป้ายกำกับ:
    ประเภท: prstore
ข้อมูลจำเพาะ:
  ความจุ:
    ความจุ: 7Gi
  VolumeMode: ระบบไฟล์
  โหมดการเข้าถึง:
  - ReadWriteOnce
  PersistentVolumeReclaimPolicy: เก็บรักษา
  storageClassName: ที่เก็บข้อมูลในเครื่อง
  ท้องถิ่น:
    fsประเภท: ext4
    เส้นทาง: /root/repo
  ความเกี่ยวข้องของโหนด:
    ที่จำเป็น:
      nodeSelectorเงื่อนไข:
      - การจับคู่นิพจน์:
        - รหัส: kubernetes.io/hostname
          ผู้ดำเนินการ: ใน
          ค่า:
          - ฤดูใบไม้ผลิ
---
api เวอร์ชัน: v1
ชนิด: PersistentVolumeClaim
ข้อมูลเมตา:
  ชื่อ: repo-pvc
  ป้ายกำกับ:
    ประเภท: prstore
ข้อมูลจำเพาะ:
  ตัวเลือก:
    ป้ายกำกับการแข่งขัน: 
      ประเภท: prstore
  VolumeMode: ระบบไฟล์
  storageClassName: ที่เก็บข้อมูลในเครื่อง
  โหมดการเข้าถึง:
  - ReadWriteOnce
  ทรัพยากร:
    คำขอ:
      ความจุ: 7Gi

สมมติว่าฉันกำลังส่งอิมเมจบนรีจิสตรีพ็อดใหม่ล่าสุดโดยล้างพื้นที่เก็บข้อมูลถาวรออกด้วย

root@sea:scripts# นักเทียบท่ากด docreg:5000/mubu4:v4
การพุชอ้างถึงที่เก็บ [dockreg:5000/mubu4]
9f54eef41275: ผลัก 
v4: ไดเจสต์: sha256:7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17fขนาด: 529

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

ตามที่คุณอาจเห็นข้างต้น ฉันได้รวมไว้ในสภาพแวดล้อมของพ็อดรีจิสทรีดังต่อไปนี้

- ชื่อ: REGISTRY_STORAGE_DELETE_ENABLED
      ค่า: "จริง"

มิฉะนั้นฉันจะได้รับ ไม่รองรับ ข้อผิดพลาดจาก ขด -X ลบ โทรแม้หลังจากเพิ่ม

ลบ:
    เปิดใช้งาน: จริง

ใน /etc/docker/registry/config.yml ภายในฝัก

รุ่น: 0.1
บันทึก:
  เขตข้อมูล:
    บริการ: รีจิสทรี
พื้นที่จัดเก็บ:
  แคช:
    blobdescriptor: inmemory
  ระบบไฟล์:
    ไดเรกทอรีราก: /var/lib/registry
  ลบ:
    เปิดใช้งาน: จริง
http:
  เพิ่ม: :5000
  ส่วนหัว:
    X-Content-Type-Options: [nosniff]
สุขภาพ:
  ไดร์เวอร์สตอเรจ:
    เปิดใช้งาน: จริง
    ช่วงเวลา: 10 วินาที
    เกณฑ์: 3

ดูเหมือนว่าจะไม่สร้างความแตกต่างในกรณีการใช้งานของฉัน

ดังต่อไปนี้ ขั้นตอนการลบ.

ขด -u อเล็กซานเดอร์:โซเฟียนอส \
> -vsk -H "ยอมรับ: \
> แอปพลิเคชัน/vnd.docker.distribution.manifest.v2+json" \
> -X ลบ \
> https://dockreg:5000/v2/mubu4/manifests/sha256:\
>7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17f

พิมพ์ด้านบนเหนือสิ่งอื่น ๆ ต่อไปนี้

> ลบ /v2/mubu4/manifests/sha256:7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17f HTTP/2
> โฮสต์: Dockreg:5000
> การอนุญาต: พื้นฐาน YWxleGFuZGVyOnNvZmlhbm9z
> user-agent: curl/7.68.0
> ยอมรับ: application/vnd.docker.distribution.manifest.v2+json
> 
* เปลี่ยนสถานะการเชื่อมต่อ (MAX_CONCURRENT_STREAMS == 250)!
< HTTP/2 202 
< docker-distribution-api-version: รีจิสตรี/2.0
< x-content-type-options: nosniff
< ความยาวเนื้อหา: 0
< date: เสาร์ 30 ต.ค. 2564 13:25:53 GMT
< 
* การเชื่อมต่อ #0 ไปยังโฮสต์ Dockreg ยังคงอยู่

ซึ่งดูเหมือนว่าจะเป็นไปตามลำดับ

ด้านล่างนี้เป็นการลบ blobs จากภายในพ็อดรีจิสตรี

root@sea:scripts# kubectl exec -it docreg-pod -- sh
/ # bin/registry เก็บขยะ /etc/docker/registry/config.yml
มูบู4

0 blobs ทำเครื่องหมาย 3 blobs และ 0 รายการที่มีสิทธิ์สำหรับการลบ
Blob ที่มีสิทธิ์ลบ: sha256:7b1a6ab2e44dbac178598dabe7cff59bd67233dba0b27e4fbd1f9d4b3c877a54
ข้อมูล [0000] การลบ Blob:/Docker/Registry/v2/blobs/sha256/7b/7b1a6ab2e44dbac178598dabe7cff59bd67233dba0b27e4fbd1f9d4b3c877a5443
Blob ที่มีสิทธิ์ลบ: sha256:7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17f
ข้อมูล [0000] การลบ Blob:/Docker/Registry/v2/blobs/sha256/7b/7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cd39681169589c17f
Blob ที่มีสิทธิ์ลบ: sha256:ecb35fc8715f5ab1d9053ecb2f2d9ebbec4a59c0a0615d98de53bc29f7285085
ข้อมูล [0000] การลบ Blob:/Docker/Registry/v2/blobs/sha256/ec/ecb35fc8715f5ab1d9053ecb2f2d9ebec4a59c0a0615d98de53bc29f72850555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555550

สุดท้าย การลบอิมเมจที่เก็บด้วยตนเอง

/ # rm -rf /var/lib/registry/docker/registry/v2/repositories/mubu4

ในที่เก็บข้อมูลถาวรของฉัน รีจิสทรีตอนนี้มีลักษณะดังนี้

root@spring:repo# ต้นไม้
.
âââ นักเทียบท่า
    âââ รีจิสทรี
        âââ v2
            âââ หยด
            â âââ sha256
            â âââ 7b
            â âââ เป็นต้น
            âââ ที่เก็บ

8 ไดเร็กทอรี 0 ไฟล์

แต่เมื่อฉันพยายามกดลบรูปภาพอีกครั้ง ฉันได้รับ

root@sea:scripts# นักเทียบท่ากด docreg:5000/mubu4:v4
การพุชอ้างถึงที่เก็บ [dockreg:5000/mubu4]
9f54eef41275: มีเลเยอร์อยู่แล้ว 
v4: ไดเจสต์: sha256:7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17fขนาด: 529

และในทะเบียนบ้านของฉัน โฟลเดอร์อิมเมจ mubu4 ที่ฉันลบไปก่อนหน้านี้ได้ถูกสร้างขึ้นใหม่อย่างลึกลับผ่านคำสั่ง push ด้านบน.

root@spring:repo# ต้นไม้
.
âââ นักเทียบท่า
    âââ รีจิสทรี
        âââ v2
            âââ หยด
            â âââ sha256
            â âââ 7b
            â âââ เป็นต้น
            âââ ที่เก็บ
                âââ mubu4
                    âââ _ประจักษ์
                        âââ การแก้ไข
                        â âââ sha256
                        â  âââ
                        â  âââ ลิงค์
                        แท็ก âââ
                            âââ v4
                                âââ ปัจจุบัน
                                â  âââ ลิงค์
                                âââ ดัชนี
                                    âââ sha256
                                        âââ 7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17f
                                            âââ ลิงก์

19 ไดเร็กทอรี 3 ไฟล์

ฉันยังพยายามล้างที่เก็บข้อมูลถาวรด้วย

root@spring:repo# rm -rf *

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

คำถามคือ ฉันจะพยายามทำอะไรได้อีกเพื่อให้งานนี้สำเร็จ และ/หรืออีกทางหนึ่ง

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

/var/lib/registry/docker/registry/v2/

ฉันจึงสามารถลบการอ้างอิงถึงรูปภาพที่ถูกลบทั้งหมดได้หรือไม่

Score:1
ธง es

ดูเหมือนว่าจะมีปัญหาในการแคชอย่างน้อยกับรีจิสตรีเวอร์ชัน 2.7.0 ที่อธิบายไว้ ที่นี่ และ ที่นี่.

ขอแนะนำในหัวข้อข้างต้นให้ปิดใช้งานแคชโดยสมบูรณ์หรือรีสตาร์ทคอนเทนเนอร์ทุกครั้ง

เนื่องจากฉันใช้รีจิสตรีนักเทียบท่าเป็นพ็อด kubernetes จึงเปลี่ยนเป็นไฟล์กำหนดค่ารีจิสตรีเริ่มต้น เช่น /etc/docker/registry/config.yml ไม่มีผลกระทบใดๆ เนื่องจาก yaml pod รีจิสทรีของ kubernetes มีผลเหนือกว่า หมายความว่าต้องตั้งค่าคอนฟิกูเรชันใน pod yaml เป็นตัวแปรสภาพแวดล้อมในรูปแบบ REGISTRY_variable โดยที่ขีดล่างแสดงถึงระดับการเยื้องตามที่อธิบายไว้ใน เอกสาร.

ดังนั้นวิธีแก้ไขคือการเพิ่ม

- ชื่อ: REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR
  ค่า: ""

ไปยังสภาพแวดล้อมคอนเทนเนอร์ใน pod yaml เพื่อปิดใช้งานแคชอย่างสมบูรณ์ มิฉะนั้น หากเรียกใช้รีจิสทรีเป็นคอนเทนเนอร์นักเทียบท่า เราสามารถใช้สิ่งต่อไปนี้ใน config.yml:

พื้นที่จัดเก็บ:
  แคช:
    ตัวอธิบายบล็อก: ""

อีกทางเลือกหนึ่งคือการรีสตาร์ทพ็อดทุกครั้งที่เราลบรูปภาพด้วย:

kubectl exec <pod_name> -c <container_name> -- รีบูต

หรือถ้าเป็นคอนเทนเนอร์นักเทียบท่า

นักเทียบท่ารีสตาร์ท <registry_container>

โพสต์คำตอบ

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