Интеграция с ArgoCD Image Updater
Данное руководство описывает интеграцию NORA с ArgoCD Image Updater для автоматического обновления образов в рамках GitOps-процессов.
Требования
Заголовок раздела «Требования»- Реестр NORA доступен по HTTPS с действительным сертификатом
- ArgoCD Image Updater установлен в кластере
- Для NORA настроено DNS-имя (не просто IP-адрес)
Настройка
Заголовок раздела «Настройка»⚠️ Важно: используйте DNS-имя, а не IP-адрес
Заголовок раздела «⚠️ Важно: используйте DNS-имя, а не IP-адрес»Всегда настраивайте ArgoCD Image Updater с DNS-именем, никогда не используйте IP-адрес.
✅ Правильная настройка
Заголовок раздела «✅ Правильная настройка»# ConfigMap для argocd-image-updater-configapiVersion: v1kind: ConfigMapmetadata: name: argocd-image-updater-config namespace: argocddata: registries.conf: | registries: - name: nora api_url: https://nora.example.com # ✅ Используйте DNS-имя prefix: nora.example.com # ✅ Используйте DNS-имя insecure: no default: yes❌ Неправильная настройка
Заголовок раздела «❌ Неправильная настройка»# НЕ ИСПОЛЬЗУЙТЕ IP-АДРЕСregistries: - name: nora api_url: https://10.0.202.20 # ❌ IP-адрес приводит к проблемам prefix: 10.0.202.20 # ❌ Будут создаваться теги .metaПочему это важно: использование IP-адресов приводит к тому, что ArgoCD Image Updater некорректно отслеживает метаданные образов, что вызывает рекурсивное создание тегов .meta (см. раздел «Известные проблемы» ниже).
Полный пример настройки
Заголовок раздела «Полный пример настройки»1. Создание ConfigMap
Заголовок раздела «1. Создание ConfigMap»apiVersion: v1kind: ConfigMapmetadata: name: argocd-image-updater-config namespace: argocddata: registries.conf: | registries: - name: nora api_url: https://nora.devitacademy.lab prefix: nora.devitacademy.lab insecure: no default: yes
log.level: debug # Необязательно: для устранения неполадокПрименение:
kubectl apply -f argocd-image-updater-config.yaml2. Настройка аннотаций приложения
Заголовок раздела «2. Настройка аннотаций приложения»apiVersion: argoproj.io/v1alpha1kind: Applicationmetadata: name: myapp namespace: argocd annotations: argocd-image-updater.argoproj.io/image-list: myapp=nora.devitacademy.lab/myapp argocd-image-updater.argoproj.io/myapp.update-strategy: latest argocd-image-updater.argoproj.io/myapp.allow-tags: regexp:^[0-9a-f]{7}$spec: source: repoURL: https://gitlab.example.com/myorg/myapp-infra.git path: overlays/prod3. Перезапуск Image Updater
Заголовок раздела «3. Перезапуск Image Updater»kubectl rollout restart deployment argocd-image-updater -n argocd4. Проверка настройки
Заголовок раздела «4. Проверка настройки»# Проверка логов Image Updaterkubectl logs -n argocd -l app.kubernetes.io/name=argocd-image-updater -f
# Ожидаемый вывод:# level=info msg="Initialized registry endpoint https://nora.devitacademy.lab"Аутентификация
Заголовок раздела «Аутентификация»Вариант 1: Без аутентификации (внутренняя сеть)
Заголовок раздела «Вариант 1: Без аутентификации (внутренняя сеть)»Если NORA работает без аутентификации (только во внутренней сети):
registries: - name: nora api_url: https://nora.example.com prefix: nora.example.com insecure: no # Учётные данные не требуютсяВариант 2: Базовая аутентификация
Заголовок раздела «Вариант 2: Базовая аутентификация»Создание секрета:
kubectl create secret generic nora-creds \ --namespace argocd \ --from-literal=username=admin \ --from-literal=password=secretСсылка в ConfigMap:
registries: - name: nora api_url: https://nora.example.com prefix: nora.example.com credentials: secret:argocd/nora-credsВариант 3: Аутентификация по токену
Заголовок раздела «Вариант 3: Аутентификация по токену»kubectl create secret generic nora-token \ --namespace argocd \ --from-literal=token=<ваш-токен>registries: - name: nora api_url: https://nora.example.com prefix: nora.example.com credentials: secret:argocd/nora-tokenИзвестные проблемы
Заголовок раздела «Известные проблемы»Проблема: рекурсивные теги .meta
Заголовок раздела «Проблема: рекурсивные теги .meta»Симптом:
В реестре накапливаются теги вида:
latestlatest.metalatest.meta.metalatest.meta.meta.meta...Причина:
ArgoCD Image Updater был настроен с IP-адресом вместо DNS-имени. При использовании IP-адресов Image Updater не может корректно сопоставить метаданные образов и создаёт рекурсивные теги отслеживания.
Решение:
- Обновите ConfigMap, указав DNS-имя:
registries: - name: nora api_url: https://nora.example.com # Замените IP-адрес на DNS-имя prefix: nora.example.com- Перезапустите Image Updater:
kubectl delete pod -n argocd -l app.kubernetes.io/name=argocd-image-updater- Удалите существующие теги .meta:
#!/bin/bashREGISTRY="https://nora.example.com"REPO="myapp"
# Получить все теги .metaMETA_TAGS=$(curl -s "${REGISTRY}/v2/${REPO}/tags/list" | \ jq -r '.tags[] | select(contains(".meta"))')
# Удалить каждый тег .metafor TAG in $META_TAGS; do # Получить дайджест манифеста DIGEST=$(curl -sI \ -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \ "${REGISTRY}/v2/${REPO}/manifests/${TAG}" | \ grep Docker-Content-Digest | awk '{print $2}' | tr -d '\r')
# Удалить манифест curl -X DELETE "${REGISTRY}/v2/${REPO}/manifests/${DIGEST}" echo "Удалён ${TAG} (${DIGEST})"doneПрофилактика:
Всегда используйте DNS-имена в настройке ArgoCD Image Updater, никогда не используйте IP-адреса.
Устранение неполадок
Заголовок раздела «Устранение неполадок»Проблема: Image Updater не обнаруживает новые образы
Заголовок раздела «Проблема: Image Updater не обнаруживает новые образы»Проверьте:
- Убедитесь в правильности настройки реестра:
kubectl get cm argocd-image-updater-config -n argocd -o yaml- Проверьте логи Image Updater:
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-image-updater | grep nora- Протестируйте доступ к реестру из Pod Image Updater:
kubectl exec -n argocd deployment/argocd-image-updater -- \ wget -O- https://nora.example.com/v2/_catalogРешение: убедитесь, что DNS-имя разрешается и сертификат является доверенным.
Проблема: ошибки TLS-сертификата
Заголовок раздела «Проблема: ошибки TLS-сертификата»Ошибка:
x509: certificate signed by unknown authorityРешение:
Добавьте сертификат удостоверяющего центра в Image Updater:
- Создайте ConfigMap с сертификатом УЦ:
kubectl create configmap nora-ca \ --namespace argocd \ --from-file=ca.crt=/path/to/ca.crt- Смонтируйте в развёртывание Image Updater:
spec: template: spec: containers: - name: argocd-image-updater volumeMounts: - name: nora-ca mountPath: /etc/ssl/certs/nora-ca.crt subPath: ca.crt volumes: - name: nora-ca configMap: name: nora-ca- Перезапустите развёртывание:
kubectl rollout restart deployment argocd-image-updater -n argocdПроблема: ошибки ограничения частоты запросов
Заголовок раздела «Проблема: ошибки ограничения частоты запросов»Ошибка:
429 Too Many RequestsРешение:
Увеличьте лимиты NORA (см. руководство по ограничениям запросов):
NORA_RATE_LIMIT_GENERAL_RPS=1000NORA_RATE_LIMIT_GENERAL_BURST=2000Image Updater часто опрашивает реестры; убедитесь, что общие лимиты это учитывают.
Рекомендации
Заголовок раздела «Рекомендации»- Всегда используйте HTTPS — никогда не используйте незащищённые реестры в рабочей среде
- Используйте DNS-имена — избегайте IP-адресов для предотвращения проблем с тегами .meta
- Ограничьте частоту обновлений — настройте разумные интервалы опроса
- Следите за логами — отслеживайте проблемы с аутентификацией и сетью
- Паттерны тегов — используйте конкретные шаблоны тегов, чтобы избежать нежелательных обновлений
- Тестируйте на стенде — проверяйте конфигурацию перед развёртыванием в рабочей среде
Пример: полная рабочая конфигурация
Заголовок раздела «Пример: полная рабочая конфигурация»Настройка NORA
Заголовок раздела «Настройка NORA»# Запуск через Dockerdocker run -d --name nora \ --restart unless-stopped \ -p 5000:5000 -p 4000:4000 \ -v /data/nora:/data \ -e NORA_STORAGE_PATH=/data \ -e NORA_RATE_LIMIT_GENERAL_RPS=1000 \ -e NORA_RATE_LIMIT_GENERAL_BURST=2000 \ ghcr.io/getnora-io/nora:latest serveНастройка DNS
Заголовок раздела «Настройка DNS»# /etc/hosts или DNS-сервер10.0.202.20 nora.devitacademy.labОбратный прокси Caddy
Заголовок раздела «Обратный прокси Caddy»nora.devitacademy.lab:443 { tls /etc/ssl/certs/nora.crt /etc/ssl/private/nora.key reverse_proxy localhost:5000}Конфигурация ArgoCD Image Updater
Заголовок раздела «Конфигурация ArgoCD Image Updater»apiVersion: v1kind: ConfigMapmetadata: name: argocd-image-updater-config namespace: argocddata: registries.conf: | registries: - name: nora api_url: https://nora.devitacademy.lab prefix: nora.devitacademy.lab insecure: no default: yesАннотации приложения
Заголовок раздела «Аннотации приложения»metadata: annotations: argocd-image-updater.argoproj.io/image-list: | backend=nora.devitacademy.lab/lms-backend:latest, frontend=nora.devitacademy.lab/lms-frontend:latestРезультат: Image Updater успешно обнаруживает новые образы и обновляет приложения без создания тегов .meta.