Рейтинг:0

Частный реестр Docker в виде модуля kubernetes — удаленные изображения автоматически воссоздаются

флаг es

Я запускаю частный реестр докеров v2.7.0 как kubernetes pod со службой и постоянным томом благодаря руководству Varun Kumar G, который был единственным успешным методом в моей настройке, чтобы kubernetes извлекал данные из моего частного реестра докеров на моем 3 узла — локальный — кластер с Ubuntu 20.04 lts kvms.

Проблема с удалением образов из реестра kubernetes pod docker v2.7.0 (пришлось использовать предыдущую версию, потому что последняя версия v2.7.1 не работает с htpasswd). Кроме того, я прочитал много подобных тем, таких как это, это и это.

С запуском реестра докеров v2.7.1 как докер-контейнер, у меня не было проблем с удалением изображений,

но с запуском реестра докеров v2.7.0 как kubernetes pod, обычные шаги удаления в результате невозможно снова отправить удаленное изображение, даже после успешного удаления больших двоичных объектов и удаления папок изображений вручную под /var/lib/реестр/докер/реестр/v2/репозитории/.

Ниже находится модуль реестра yaml.

апиВерсия: v1
вид: стручок
метаданные:
  имя: докрег-стручок
  этикетки:
    приложение: mregistry
спецификация:
  контейнеры:
  - название: реестр
    изображение: реестр: 2.7.0
    imagePullPolicy: Ифноптресент
    томМаунты:
    - имя: репо-том
      mountPath: "/var/lib/registry"
    - имя: сертификаты-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
      значение: "истина"
  тома:
  - имя: репо-том
    персистентволумеклайм:
      претензияНазвание: репо-пвх
  - имя: сертификаты-vol
    секрет:
      secretName: сертификаты-секрет
  - имя: автор-том
    секрет:
      secretName: секрет авторизации
  политика перезапуска: всегда
  имя_узла: весна

и ниже приведен постоянный объем yaml

апиВерсия: v1
вид: персистентволуме
метаданные:
  имя: репо-pv
  этикетки:
    тип: магазин
спецификация:
  емкость:
    хранилище: 7Gi
  VolumeMode: файловая система
  режимы доступа:
  - ReadWriteOnce
  персистентволумереклаймполици: сохранить
  storageClassName: локальное хранилище
  местный:
    Тип фс: ext4
    путь: /корень/репо
  сродство узлов:
    обязательный:
      нодселектортермс:
      - matchExpressions:
        - ключ: kubernetes.io/имя хоста
          оператор: В
          ценности:
          - весна
---
апиВерсия: v1
вид: Персистентволумеклаим
метаданные:
  имя: репо-ПВХ
  этикетки:
    тип: магазин
спецификация:
  селектор:
    метки соответствия: 
      тип: магазин
  VolumeMode: файловая система
  storageClassName: локальное хранилище
  режимы доступа:
  - ReadWriteOnce
  Ресурсы:
    Запросы:
      хранилище: 7Gi

Скажем, я помещаю образ в новый модуль реестра, предварительно очистив постоянное хранилище.

root@sea:scripts# docker push dockerreg:5000/mubu4:v4
Пуш ссылается на репозиторий [dockreg:5000/mubu4].
9f54eef41275: Нажал 
v4: дайджест: sha256:7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17f размер: 529

Удаление изображений работает по назначению, пока я не попытаюсь снова отправить удаленное изображение, и в этот момент я получаю ужасный Слой уже существует ошибка.

Как вы могли видеть выше, я включил в среду модуля реестра следующее:

- имя: REGISTRY_STORAGE_DELETE_ENABLED
      значение: "истина"

иначе я бы получил неподдерживаемый ошибка из завиток -X УДАЛИТЬ вызов, даже после добавления

удалять:
    включено: правда

в /etc/docker/registry/config.yml внутри стручка,

версия: 0.1
журнал:
  поля:
    услуга: реестр
место хранения:
  кеш:
    blob-дескриптор: в памяти
  файловая система:
    корневой каталог: /var/lib/registry
  удалять:
    включено: правда
http:
  адрес: :5000
  заголовки:
    X-Content-Type-Options: [nosniff]
здоровье:
  Драйвер хранилища:
    включено: правда
    интервал: 10 с
    порог: 3

это, кажется, не имеет значения в моем случае использования.

Ниже приведены шаги удаления.

curl -u александр: софианос \
> -vsk -H "Принять: \
> приложение/vnd.docker.distribution.manifest.v2+json" \
> -X УДАЛИТЬ \
> https://dockreg:5000/v2/mubu4/manifests/sha256:\
> 7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17f

Вышеприведенное печатает, среди прочего, следующее

> УДАЛИТЬ /v2/mubu4/манифесты/sha256:7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17f HTTP/2
> Хост: докрег:5000
> авторизация: Basic YWxleGFuZGVyOnNvZmlhbm9z
> пользовательский агент: curl/7.68.0
> принять: приложение/vnd.docker.distribution.manifest.v2+json
> 
* Состояние соединения изменено (MAX_CONCURRENT_STREAMS == 250)!
< HTTP/2 202 
<докер-дистрибутив-api-версия: реестр/2.0
< x-content-type-options: nosniff
<длина содержимого: 0
<дата: суббота, 30 октября 2021 г., 13:25:53 по Гринвичу
< 
* Соединение №0 с хостом Dockreg осталось нетронутым

что вроде в порядке вещей.

Ниже показано удаление больших двоичных объектов из модуля реестра.

root@sea:scripts# kubectl exec -it докрег-под -- sh
/ # bin/registry сборщик мусора /etc/docker/registry/config.yml
Мубу4

Отмечено 0 больших двоичных объектов, 3 больших двоичных объекта и 0 манифестов, которые можно удалить.
Большой двоичный объект, подходящий для удаления: sha256:7b1a6ab2e44dbac178598dabe7cff59bd67233dba0b27e4fbd1f9d4b3c877a54
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/7b/7b1a6ab2e44dbac178598dabe7cff59bd67233dba0b27e4fbd1f9d4b3c877a54  go.version=go1.11.2 instance.id=82a101ee-47f4-4f4f-bc79-76d774b0924b service=registry
Большой двоичный объект, подходящий для удаления: sha256:7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17f
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/7b/7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17f  go.version=go1.11.2 instance.id=82a101ee-47f4-4f4f-bc79-76d774b0924b service=registry
Большой двоичный объект, подходящий для удаления: sha256:ecb35fc8715f5ab1d9053ecb2f2d9ebbec4a59c0a0615d98de53bc29f7285085
INFO[0000] Удаление большого двоичного объекта: /docker/registry/v2/blobs/sha256/ec/ecb35fc8715f5ab1d9053ecb2f2d9ebbec4a59c0a0615d98de53bc29f7285085

Наконец, ручное удаление образа репозитория

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

В моем постоянном хранилище реестр теперь выглядит так

дерево root@spring:repo#
.
âââ докер
    ✓ реестр
        âââ v2
            ââ капли
            âââ sha256
            â âââ 7b
            â âââ ек
            âââ репозитории

8 каталогов, 0 файлов

Но когда я снова пытаюсь отправить удаленное изображение, я получаю

root@sea:scripts# docker push dockerreg:5000/mubu4:v4
Пуш ссылается на репозиторий [dockreg:5000/mubu4].
9f54eef41275: слой уже существует 
v4: дайджест: sha256:7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17f размер: 529

и в моем реестре папка изображений mubu4, которую я ранее удалил, была таинственным образом воссоздана с помощью приведенной выше команды push.

дерево root@spring:repo#
.
âââ докер
    ✓ реестр
        âââ v2
            ââ капли
            âââ sha256
            â âââ 7b
            â âââ ек
            âââ репозитории
                âââ мубу4
                    âââ _manifests
                        ✓ ревизии
                        âââ sha256
                        âââ 7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17f
                        🔸Ссылка
                        ââ теги
                            âââ v4
                                âââ текущий
                                🔸Ссылка
                                ✓ индекс
                                    âââ sha256
                                        âââ 7bd0d9a9821815dccb5c53c18cea04591ec633e2e529c5cdd39681169589c17f
                                            ââ ссылка

19 каталогов, 3 файла

Я также попытался стереть постоянное хранилище с помощью

root@spring:repo# rm -rf *

но безрезультатно. После этого пытаюсь отправить удаленное изображение, все равно выводит то же самое Слой уже существует ошибка, и дерево реестра снова автоматически воссоздается, выглядя точно так же, как в выходных данных дерева выше.

Вопрос в том что еще я могу попытаться сделать для этой работы и/или, альтернативно,

из приведенного выше тестирования следует, что в модуле kubernetes реестра докеров есть другие файлы, содержащие конфигурацию, в которой удаленные изображения не удаляются., и эти файлы активируют воссоздание удаленного образа с помощью push-вызова Docker. Куда мне смотреть кроме дерева

/var/lib/реестр/докер/реестр/v2/

чтобы я мог удалить все ссылки на удаленные изображения?

Рейтинг:1
флаг es

Похоже, что существует проблема кэширования, по крайней мере, с версией реестра 2.7.0, которая описана здесь и здесь.

В приведенных выше темах рекомендуется полностью отключать кеш или каждый раз перезапускать контейнер.

Поскольку я использую реестр докеров в качестве модуля kubernetes, изменения в файле конфигурации реестра по умолчанию, т.е. /etc/docker/registry/config.yml не имеют никакого эффекта, потому что yaml модуля реестра kubernetes имеет приоритет, то есть конфигурация должна быть установлена ​​в yaml модуля как переменные среды в виде РЕГИСТР_переменная где подчеркивание представляет уровни отступа, как объяснено в документы.

Таким образом, решение состоит в том, чтобы добавить

- имя: REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR
  стоимость: ""

в среду контейнера в pod yaml, чтобы полностью отключить кеш, в противном случае, если реестр запускается как контейнер докера, мы можем использовать следующее в config.yml:

место хранения:
  кеш:
    блобдескриптор: ""

Альтернативой является перезапуск модуля каждый раз, когда мы удаляем изображение с помощью:

kubectl exec <имя_пода> -c <имя_контейнера> -- перезагрузить

или если это док-контейнер

перезапуск докера <registry_container>

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.