Установка Harbor Registry на Kubernetes
Опубликовано:
Используемые термины: Harbor, Docker, Kubernetes, Helm.
В этой инструкции разберем развертывание Harbor в Kubernetes: установим Harbor registry через официальный Helm-чарт, настроим доступ по HTTPS через Ingress и подключим прокси-кеш Docker Hub.
Предварительная настройка
Настройка приложения через файл values.yml
Установка Harbor через Helm Chart
Проксирование Docker Hub через Harbor
Проверка запуска и работы
Подготовка системы
Выполним предварительные настройки.
Подключение Helm-репозитория
Добавим зеркало официального чарта Harbor-helm — им удобно пользоваться, если основной репозиторий недоступен:
helm repo add harbor-mirror https://mirror.yandex.ru/helm/helm.goharbor.io/
* зеркало имеет смысл использовать, если официальный репозиторий helm.goharbor.io недоступен из-за блокировки (в России недоступен). Если доступ есть — используйте официальный источник, зеркало остается точкой доверия, за синхронизацию и целостность которой отвечает третья сторона.
Обновим список репозиториев, чтобы Helm подтянул актуальную версию чарта:
helm repo update
Репозиторий подключен.
Namespace и рабочий каталог
Создадим отдельный namespace для Harbor:
kubectl create namespace harbor
Создадим каталог для файлов конфигурации и перейдем в него:
mkdir -p /opt/harbor && cd /opt/harbor
Настройка values.yml
Опишем параметры Harbor Kubernetes-инсталляции — настройки для Ingress, хранилище и пароль администратора. Откроем файл:
vi values.yml
expose:
type: ingress
tls:
enabled: true
certSource: none
ingress:
ingressClassName: traefik
hosts:
core: registry.dmosk.ru
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web,websecure
traefik.ingress.kubernetes.io/router.tls: "true"
traefik.ingress.kubernetes.io/router.tls.certresolver: default
externalURL: https://registry.dmosk.ru
persistence:
enabled: true
resourcePolicy: "keep"
persistentVolumeClaim:
registry:
storageClass: "local-path"
size: 100Gi
jobservice:
jobLog:
storageClass: "local-path"
size: 5Gi
database:
storageClass: "local-path"
size: 10Gi
redis:
storageClass: "local-path"
size: 5Gi
trivy:
storageClass: "local-path"
size: 5Gi
harborAdminPassword: "YourAdminPassword123"
notary:
enabled: false
trivy:
enabled: true
chartmuseum:
enabled: false
internalTLS:
enabled: false
* где нужно обратить внимание на:
- expose.ingress.hosts.core — домен, на котором будет доступен Harbor (в нашем примере registry.dmosk.ru).
- ingressClassName — используемый Ingress-контроллер (в примере traefik).
- persistence.persistentVolumeClaim — объемы для каждого компонента, storageClass local-path нужно заменить на свой. Посмотреть можно командой kubectl get sc.
- harborAdminPassword — стандартный пароль администратора (Harbor default password). Если файл values.yml попадет в git, пароль попадет туда же. Для продакшена его обязательно нужно сменить сразу после первого входа.
** ingressClassName: traefik и аннотации traefik.ingress.kubernetes.io/... — специфичны для Traefik. Если в кластере используется другой контроллер (например, ingress-nginx), эти строки нужно заменить на свои: ingressClassName: nginx и аннотации nginx.ingress.kubernetes.io/...
*** storageClass: local-path хранит данные на диске конкретной ноды без репликации — при выходе ноды из строя образы будут потеряны вместе с ней. Для продакшена безопаснее реплицируемое хранилище: сетевой storageClass с репликацией или S3-совместимый бэкенд (например, Garage или MinIO).
**** certSource: none и certresolver: default предполагают, что выпуск сертификатов в кластере уже настроен — через Cert-Manager или встроенный ACME-резолвер Traefik с именем default. Если это не настроено заранее, браузер покажет ошибку сертификата, а docker login завершится с x509: certificate signed by unknown authority.
Файл values.yml готов.
Harbor Helm install: установка чарта
Установим Harbor через Helm с указанием подготовленного values.yml:
helm install harbor harbor-mirror/harbor --namespace harbor --values values.yml
* если мы еще раз сделали правки в файле values и хотим применить новую версию, вместо install используем upgrade:
helm upgrade harbor harbor-mirror/harbor --namespace harbor --values values.yml
Чтобы не хранить пароль администратора в values.yml в открытом виде, значение можно передать отдельным флагом прямо в команде установки — тогда пароль не попадет в файл конфигурации и, соответственно, в git:
helm install harbor harbor-mirror/harbor --namespace harbor --values values.yml --set harborAdminPassword=$HARBOR_ADMIN_PASSWORD
* переменную HARBOR_ADMIN_PASSWORD нужно предварительно экспортировать в shell (export HARBOR_ADMIN_PASSWORD=...) и не хранить в истории команд после установки.
Проксирование Docker Hub через Harbor
Если нужно, чтобы Harbor кешировал образы из Docker Hub — это отдельная функция, к скачиванию образов самого Harbor отношения не имеет и настраивается не в values.yml, а через интерфейс.
Зайдем в Harbor UI под администратором и откроем раздел Administration → Registries. Добавим новый endpoint: Provider — Docker Hub, Endpoint URL — https://hub.docker.com, при необходимости укажем логин и пароль от Docker Hub, чтобы увеличить лимит запросов к API.
Затем в разделе Projects создадим новый проект, включим галку Proxy Cache и выберем только что добавленный endpoint. Образы из Docker Hub станут доступны через путь вида registry.dmosk.ru/<имя-проекта>/library/nginx:latest.
* если логин и пароль от Docker Hub не указывать, прокси-кеш все равно будет работать, но с более низким лимитом анонимных запросов к API Docker Hub.
Проверка установки
Проверим, что все поды Harbor запустились:
kubectl get pods -n harbor
Проверим состояние Helm-релиза:
helm list -n harbor
Мы должны увидеть релиз harbor в статусе deployed.
Harbor готов к работе и доступен по адресу: https://registry.dmosk.ru.
Установка завершена.