Размещение образов докеров в нескольких реестрах, но ссылка на них одинаковая, например, в развертывании k8s

С тех пор, как я начал с докера, меня преследует один вопрос, на который я пока не могу получить хорошего ответа.

Предположим, у меня есть файл .yaml, определяющий развертывание k8s. Мы создаем наши образы докеров на локальном сервере сборки, и они отправляются в локальный реестр, например. register.mycompany.com, который доступен только в нашей локальной сети компании. Итак, в моем .yaml я буду ссылаться на этот образ с помощью «image: registry.mycompany.com/myrepo/myimage:1.0".

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

Как обычно решаются подобные проблемы? Прямо сейчас я настраиваю другой реестр либо у своих клиентов, либо в облачной учетной записи, повторно помечаю все свои образы и отправляю их в этот реестр, а также меняю все ссылки на образы в .yamls при развертывании у клиентов или в облаке. Поэтому необходимо поддерживать множество наборов файлов, которые на 99% одинаковы. Это не так, как должно работать?

Мое "желание" состояло бы в том, чтобы я мог указать только имя изображения и тег "myimage: 1.0", а кластер k8s просто проверяет все доступные реестры, если он может найти изображение, и извлекает Это. Но я также знаю, что нет «списка хорошо известных реестров», вы либо указываете реестр в имени образа, либо опускаете его, и будет запрашиваться docker hub. Однако было бы очень здорово, если бы я мог указать только

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: MyDeployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myimage
    spec:
      containers:
        - name: myimage
          image: 'myimage:1.0'
          ports: []

и список реестров:

registries:
    - registry.mycompany.com
    - registry.cloud.com
    - registry.localcustomer.com

Но ничего подобного, верно?

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

Любые идеи и информация приветствуются. Заранее спасибо :)

1
задан 24 November 2020 в 12:30
1 ответ

Есть некоторые обходные пути для достижения результата, описанного в вашем вопросе:

  • Таблица Helm
  • Настройка
  • Реестр

Таблица Helm

Как вы сказал в вопросе:

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

Субъективно это самый удобный способ указать репозитории для Deployment.

Пример этого может выглядеть следующим образом:

deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ubuntu
spec:
  selector:
    matchLabels:
      app: ubuntu
  replicas: 1
  template:
    metadata:
      labels:
        app: ubuntu
    spec:
      containers:
      - name: "{{ .Values.image.repo }}{{ .Values.image.name }}:{{ .Values.image.tag }}"  
        image: 
        command:
        - sleep 
        - "infinity"

Значения внутри шаблона могут быть предоставлены либо:

  • values.yaml файл:
image: 
  repo: gcr.io/ # <-- only an example
  name: ubuntu
  tag: latest
  • $ helm команда типа:

$ helm установить ubuntu. --set=image.repo=eu.gcr.io/

Совет!

Указание параметра --set с уже существующим значением в values.yaml переопределит его (в этом примере)!


Kustomize

Вы также можете использовать kustomize для «рендеринга» развертывания с соответствующими репозиториями и образами.

Существует довольно подробное объяснение того, как это можно сделать, в сообщении ниже в блоге:

Пример такого решения (перейдя по ссылке выше) можно кипятить вплоть до:

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sl-demo-app
spec:
  selector:
    matchLabels:
      app: sl-demo-app
  template:
    metadata:
      labels:
        app: sl-demo-app
    spec:
      containers:
      - name: app
        image: foo/bar:latest
        ports:
        - name: http
          containerPort: 8080
          protocol: TCP

custom-image.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sl-demo-app
spec:
  template:
    spec:
      containers:
        - name: app # IMPORTANT 
          image: eu.gcr.io/ubuntu:latest

kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - deployment.yaml

patchesStrategicMerge:
- custom-image.yaml

После запуска приведенного выше примера с:

  • kustomize build

Вы должны увидеть изменения в образе:

  • from: image: foo/bar:latest
  • to: image: eu.gcr.io/ubuntu:latest

Вы также можете взглянуть на этот ответ StackOverflow:


Реестр

Вы также можете взглянуть на проект реестра, такой как Harbour.

Вы можете прочитать на их странице github:

Harbour — это проект доверенного облачного реестра с открытым исходным кодом, который хранит, подписывает и сканирует контент. Harbour расширяет дистрибутив Docker с открытым исходным кодом, добавляя функции, обычно необходимые пользователям, такие как безопасность, идентификация и управление.

Функции

  • Облачный собственный реестр: благодаря поддержке как образов контейнеров, так и диаграмм Helm, Harbour служит реестром для собственных облачных сред, таких как среды выполнения контейнеров и платформы оркестровки.

  • Управление доступом на основе ролей: пользователи получают доступ к различным репозиториям через «проекты», и у пользователя могут быть разные разрешения для изображений или диаграмм Helm в рамках проекта.

  • Репликация на основе политик: изображения и диаграммы можно реплицировать (синхронизировать) между несколькими экземплярами реестра на основе политик с использованием фильтров (репозиторий, тег и метка). Harbour автоматически повторяет репликацию, если обнаруживает какие-либо ошибки. Это можно использовать для балансировки нагрузки, достижения высокой доступности и упрощения развертывания с несколькими центрами обработки данных в гибридных и мультиоблачных сценариях.

...

-- Github.com: Goharbor: Harbour

С его помощью вы могли:


Кроме того, вы также можете просмотреть прокси-сервер реестра Docker, как показано ниже:


Дополнительные ресурсы:

2
ответ дан 25 November 2020 в 11:29

Теги

Похожие вопросы