Интеграция с ArgoCD Image Updater
Это руководство охватывает интеграцию NORA с ArgoCD Image Updater для автоматического обновления образов в GitOps-процессах.
Предварительные требования
Заголовок раздела «Предварительные требования»- Реестр NORA доступен по HTTPS с валидным сертификатом
- ArgoCD Image Updater установлен в вашем кластере
- DNS-имя настроено для NORA (не просто IP-адрес)
Конфигурация
Заголовок раздела «Конфигурация»Важно: используйте имя хоста, а не IP-адрес
Заголовок раздела «Важно: используйте имя хоста, а не IP-адрес»Всегда настраивайте ArgoCD Image Updater с DNS-именем хоста, никогда не с IP-адресом.
Правильная конфигурация
Заголовок раздела «Правильная конфигурация»# argocd-image-updater-config ConfigMapapiVersion: v1kind: ConfigMapmetadata: name: argocd-image-updater-config namespace: argocddata: registries.conf: | registries: - name: nora api_url: https://nora.example.com # ✅ Use hostname prefix: nora.example.com # ✅ Use hostname insecure: no default: yesНеправильная конфигурация
Заголовок раздела «Неправильная конфигурация»# DO NOT USE IP ADDRESSregistries: - name: nora api_url: https://10.0.202.20 # ❌ IP address causes issues prefix: 10.0.202.20 # ❌ Will create .meta tagsПочему это важно: Использование 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.example.com prefix: nora.example.com insecure: no default: yes
log.level: debug # Optional: for troubleshootingПрименение:
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.example.com/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. Проверка конфигурации»# Check Image Updater logskubectl logs -n argocd -l app.kubernetes.io/name=argocd-image-updater -f
# Expected output:# level=info msg="Initialized registry endpoint https://nora.example.com"Аутентификация
Заголовок раздела «Аутентификация»Вариант 1: Без аутентификации (внутренняя сеть)
Заголовок раздела «Вариант 1: Без аутентификации (внутренняя сеть)»Если NORA работает без аутентификации (только внутренняя сеть):
registries: - name: nora api_url: https://nora.example.com prefix: nora.example.com insecure: no # No credentials neededВариант 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=<your-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-адресом вместо имени хоста. При использовании IP-адресов Image Updater не может корректно сопоставлять метаданные образов и создаёт рекурсивные теги отслеживания.
Решение:
- Обновите ConfigMap, используя имя хоста:
registries: - name: nora api_url: https://nora.example.com # Change from IP to hostname 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"
# Get all .meta tagsMETA_TAGS=$(curl -s "${REGISTRY}/v2/${REPO}/tags/list" | \ jq -r '.tags[] | select(contains(".meta"))')
# Delete each .meta tagfor TAG in $META_TAGS; do # Get manifest digest 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')
# Delete manifest curl -X DELETE "${REGISTRY}/v2/${REPO}/manifests/${DIGEST}" echo "Deleted ${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- Проверьте доступ к реестру из пода Image Updater:
kubectl exec -n argocd deployment/argocd-image-updater -- \ wget -O- https://nora.example.com/v2/_catalogРешение: Убедитесь, что имя хоста разрешается и сертификат является доверенным
Проблема: ошибки 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- Смонтируйте в Deployment 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- Перезапустите Deployment:
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
- Ограничьте частоту обновлений — настройте разумные интервалы опроса
- Мониторьте логи — следите за проблемами аутентификации или сети
- Паттерны тегов — используйте конкретные паттерны тегов для предотвращения нежелательных обновлений
- Тестируйте в staging — проверьте конфигурацию перед продакшен-развёртыванием
Пример: полная рабочая конфигурация
Заголовок раздела «Пример: полная рабочая конфигурация»Конфигурация NORA
Заголовок раздела «Конфигурация NORA»# Docker run commanddocker run -d --name nora \ --restart unless-stopped \ -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 or DNS server10.0.202.20 nora.example.comОбратный прокси Caddy
Заголовок раздела «Обратный прокси Caddy»nora.example.com:443 { tls /etc/ssl/certs/nora.crt /etc/ssl/private/nora.key reverse_proxy localhost:4000}Конфигурация 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.example.com prefix: nora.example.com insecure: no default: yesАннотация приложения
Заголовок раздела «Аннотация приложения»metadata: annotations: argocd-image-updater.argoproj.io/image-list: | backend=nora.example.com/lms-backend:latest, frontend=nora.example.com/lms-frontend:latestРезультат: Image Updater успешно обнаруживает новые образы и обновляет приложения без создания тегов .meta.