С тех пор, как я начал с докера, меня преследует один вопрос, на который я пока не могу получить хорошего ответа.
Предположим, у меня есть файл .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 диаграмм, сделайте первую часть изображения ссылкой на переменную и передайте реестр как переменную диаграмме.
Любые идеи и информация приветствуются. Заранее спасибо :)
Есть некоторые обходные пути для достижения результата, описанного в вашем вопросе:
Как вы сказал в вопросе:
Единственное другое решение, которое я могу придумать, это встроить все в диаграммы руля, сделать первую часть изображения ссылкой на переменную и передать реестр как переменную в диаграмму.
Субъективно это самый удобный способ указать репозитории для 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
для «рендеринга» развертывания
с соответствующими репозиториями и образами.
Существует довольно подробное объяснение того, как это можно сделать, в сообщении ниже в блоге:
Пример такого решения (перейдя по ссылке выше) можно кипятить вплоть до:
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
Вы должны увидеть изменения в образе:
image: foo/bar:latest
image: eu.gcr.io/ubuntu:latest
Вы также можете взглянуть на этот ответ StackOverflow:
Вы также можете взглянуть на проект реестра, такой как Harbour.
Вы можете прочитать на их странице github:
Harbour — это проект доверенного облачного реестра с открытым исходным кодом, который хранит, подписывает и сканирует контент. Harbour расширяет дистрибутив Docker с открытым исходным кодом, добавляя функции, обычно необходимые пользователям, такие как безопасность, идентификация и управление.
Функции
Облачный собственный реестр: благодаря поддержке как образов контейнеров, так и диаграмм Helm, Harbour служит реестром для собственных облачных сред, таких как среды выполнения контейнеров и платформы оркестровки.
Управление доступом на основе ролей: пользователи получают доступ к различным репозиториям через «проекты», и у пользователя могут быть разные разрешения для изображений или диаграмм Helm в рамках проекта.
Репликация на основе политик: изображения и диаграммы можно реплицировать (синхронизировать) между несколькими экземплярами реестра на основе политик с использованием фильтров (репозиторий, тег и метка). Harbour автоматически повторяет репликацию, если обнаруживает какие-либо ошибки. Это можно использовать для балансировки нагрузки, достижения высокой доступности и упрощения развертывания с несколькими центрами обработки данных в гибридных и мультиоблачных сценариях.
...
С его помощью вы могли:
Кроме того, вы также можете просмотреть прокси-сервер реестра Docker, как показано ниже:
Дополнительные ресурсы: