GitOps на EKS: Argo CD + Image Updater + ECR

Обзор архитектуры

Система работает по принципам GitOps: состояние, запущенное в Kubernetes, всегда соответствует желаемой конфигурации, которая хранится в Git.

Схема GitOps-процесса от публикации образа до деплоя

На высоком уровне процесс выглядит так:

  1. Новый Docker-образ публикуется в Amazon ECR.

  2. Argo CD Image Updater обнаруживает новый тег образа.

  3. Image Updater фиксирует новый тег в файле значений Helm в репозитории GitHub.

  4. Argo CD замечает изменение в Git.

  5. Argo CD синхронизирует конфигурацию приложения с кластером.

  6. Kubernetes скачивает новый образ и обновляет деплоймент.

Этот подход обеспечивает:

  • версионирование деплойментов;

  • прозрачную историю изменений;

  • полностью автоматические релизы;

  • Git как единственный источник истины.

Установка Argo CD

Сначала установите Argo CD в кластер Kubernetes:

kubectl create namespace argocd
kubectl apply -n argocd \
  --server-side \
  --force-conflicts \
  -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Доступ к Argo CD

Получите исходный пароль администратора:

kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath="{.data.password}" | base64 -d

Пробросьте порт сервера Argo CD на локальную машину:

kubectl port-forward svc/argocd-server -n argocd 8080:443

Войдите через CLI:

argocd login localhost:8080 \
  --username admin \
  --password <password> \
  --insecure

Подключение Git-репозитория

Добавьте репозиторий с вашим Helm-чартом:

argocd repo add https://github.com/<org>/<repo>.git \
  --username <github-user> \
  --password <PAT>

Рекомендуется использовать долгоживущий персональный токен доступа (Personal Access Token, PAT) со следующими правами:

  • чтение и запись содержимого репозитория (Contents);

  • доступ только на чтение к метаданным репозитория (Metadata).

Настройка прав Personal Access Token в GitHub

Создание приложения Argo CD

Приложения (Applications) в Argo CD описывают, как Git-репозитории синхронизируются с Kubernetes.

Пример манифеста приложения:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: sample-app
  namespace: argocd
spec:
  project: default
  destination:
    server: https://kubernetes.default.svc
    namespace: <application-namespace>
  source:
    repoURL: https://github.com/<org>/<repo>.git
    targetRevision: main
    path: .
    helm:
      valueFiles:
        - values.yaml
        - values-secrets.yaml
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Проверьте статус приложения — он должен быть Synced:

kubectl get applications.argoproj.io -n argocd

Пример вывода:

NAME                SYNC STATUS   HEALTH STATUS
sample-app          Synced        Healthy

Как только статус перешёл в Synced, любые изменения в репозитории GitHub Argo CD автоматически синхронизирует с Helm-чартом в кластере EKS. По умолчанию Argo CD опрашивает Git-репозиторий каждые 3 минуты.

Чтобы добиться почти мгновенного деплоя, можно настроить GitHub Webhook. Отправка уведомления о push-событии напрямую на API-эндпоинт Argo CD (/api/webhook) запускает немедленный цикл сверки в тот момент, когда Image Updater фиксирует новый тег в Git. Это сокращает задержку обновления с нескольких минут до секунд, гарантирует постоянную синхронизацию кластера и помогает избежать превышения лимитов GitHub API в крупных окружениях.

Примечание. Даже когда мы говорим «Helm-чарт», под капотом Argo CD использует Helm лишь для шаблонизации чарта, но не для его установки или обновления. Изменения применяются напрямую через Kubernetes API — по аналогии с kubectl, — поэтому чарт не будет виден в выводе helm ls.

Установка Argo CD Image Updater

Установите Argo CD Image Updater — компонент, который следит за реестрами контейнеров и обновляет Git при появлении новых образов. Рекомендуется устанавливать его в то же пространство имён, что и Argo CD.

kubectl apply -n argocd \
-f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/config/install.yaml

Доступ к реестру через IRSA

Чтобы Image Updater мог обращаться к образам в ECR, используйте механизм IAM Roles for Service Accounts (IRSA) — привязку IAM-ролей к сервисным аккаунтам Kubernetes.

Создайте IAM-политику, разрешающую доступ к ECR:

{
 "Version": "2012-10-17",
 "Statement": [
   {
     "Effect": "Allow",
     "Action": [
                "ecr:GetAuthorizationToken"
     ],
     "Resource": "*"
   },
   {
     "Effect": "Allow",
     "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetRepositoryPolicy",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecr:DescribeImages",
                "ecr:BatchGetImage",
                "ecr:GetLifecyclePolicy",
                "ecr:GetLifecyclePolicyPreview",
                "ecr:ListTagsForResource",
                "ecr:DescribeImageScanFindings"
     ],
     "Resource": "arn:aws:ecr:<region>:<account-id>:repository/<repository-name>"
   }
 ]
}

Настройте доверие: создайте роль, которая доверяет OIDC-провайдеру вашего кластера EKS, и свяжите её с сервисным аккаунтом argocd-image-updater.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<account-id>:oidc-provider/oidc.eks.<region>.amazonaws.com/id/<oidc_id>"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.<region>.amazonaws.com/id/<oidc_id>:sub": "system:serviceaccount:argocd:argocd-image-updater-controller",
          "oidc.eks.<region>.amazonaws.com/id/<oidc_id>:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}

Создайте IAM-роль и прикрепите политику:

aws iam create-role \
  --role-name argocd-image-updater \
  --assume-role-policy-document file://trust.json

aws iam attach-role-policy \
  --role-name argocd-image-updater \
  --policy-arn arn:aws:iam::<account-id>:policy/argocd-image-updater-ecr-policy

Добавьте аннотацию к сервисному аккаунту Image Updater:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: argocd-image-updater-controller
  namespace: argocd
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::<account-id>:role/argocd-image-updater

Настройка Argo CD Image Updater

В ноябре 2025 года вышел релиз v1.0.0, в котором конфигурация на основе аннотаций была заменена на конфигурацию на основе CRD (Custom Resource Definitions). Начиная с этой версии, настройка Image Updater выполняется через ресурс ImageUpdater.

Создайте ресурс ImageUpdater, описывающий, какие приложения и образы нужно отслеживать:

apiVersion: argocd-image-updater.argoproj.io/v1alpha1
kind: ImageUpdater
metadata:
  name: sample-app-updater
  namespace: argocd
spec:
  applicationRefs:
  - namePattern: sample-app
    images:
      - alias: sample-app
        imageName: <account>.dkr.ecr.<region>.amazonaws.com/sample-app
        commonUpdateSettings:
          updateStrategy: semver
          forceUpdate: false
        manifestTargets:
          helm:
            name: app.image.repository
            tag: app.image.tag
  writeBackConfig:
    method: git
    gitConfig:
      writeBackTarget: helmvalues:values.yaml

Helm-чарт должен объявлять поля образа следующим образом:

app:
  image:
    repository:
    tag:

Аутентификация в Amazon ECR

Image Updater должен уметь аутентифицироваться в ECR. Для этого можно использовать скрипт авторизации, хранящийся в ConfigMap Kubernetes:

kubectl create cm/argocd-image-updater-authscripts -n argocd --from-literal=ecr-login.sh='#!/bin/sh
export HOME=/tmp
export AWS_CONFIG_FILE=/tmp/.aws/config
TOKEN=$(aws ecr get-authorization-token --region <region> --output text --query "authorizationData[0].authorizationToken" 2>/dev/null)
if [ -z "$TOKEN" ]; then
  exit 1
fi
echo "AWS:$(echo $TOKEN | base64 -d | cut -d: -f2)"' --dry-run=client -o yaml | kubectl apply -f -

Настройка реестра

Обновите конфигурацию реестра в Image Updater:

kubectl get cm/argocd-image-updater-config -n argocd -o yaml

apiVersion: v1
data:
  registries.conf: |
    registries:
      - name: ECR
        prefix: <account>.dkr.ecr.<region>.amazonaws.com
        api_url: https://<account>.dkr.ecr.<region>.amazonaws.com
        credentials: ext:/scripts/ecr-login.sh
        credsexpire: 10h
        default: true
kind: ConfigMap

Параметр credsexpire позволяет избежать проблем, связанных с истечением срока действия токена ECR через 12 часов.

Подключите ConfigMap со скриптом авторизации к деплойменту argocd-image-updater-controller:

kubectl get deploy/argocd-image-updater-controller -n argocd
...
        volumeMounts:
        - mountPath: /scripts
          name: authscripts
...
      volumes:
      - configMap:
          defaultMode: 493
          name: argocd-image-updater-authscripts
        name: authscripts
...

Перезапустите argocd-image-updater-controller, чтобы применить изменения:

kubectl rollout restart deploy/argocd-image-updater-controller -n argocd

Проверьте логи, чтобы убедиться в корректной синхронизации. Контроллер argocd-image-updater проверяет наличие новых тегов в репозитории ECR каждые 2 минуты и фиксирует изменения в репозитории GitHub, если новый тег обнаружен.

kubectl logs -n argocd deploy/argocd-image-updater-controller -f

Если всё настроено правильно, при каждом появлении нового тега в репозитории ECR argocd-image-updater автоматически создаёт коммит в репозитории.

Автоматизированный процесс деплоя

После настройки весь процесс деплоя выполняется без ручного вмешательства:

  1. Новый образ контейнера публикуется в ECR.

  2. Image Updater обнаруживает новый тег.

  3. Image Updater фиксирует обновление в Git-репозитории.

  4. Argo CD замечает изменение в Git.

  5. Argo CD синхронизирует деплоймент в Kubernetes.

  6. Кластер скачивает новый образ контейнера.

Никаких ручных действий не требуется.

Добавление нового приложения

Чтобы подключить ещё одно приложение к этому пайплайну:

  1. Создайте новый репозиторий с Helm-чартом.

  2. Создайте сервисный аккаунт GitHub с PAT.

  3. Добавьте репозиторий в Argo CD.

  4. Создайте манифест приложения Argo CD.

  5. Настройте права IRSA.

  6. Добавьте конфигурацию ImageUpdater.

После этого новое приложение будет участвовать в том же автоматизированном GitOps-процессе деплоя.

Заключение

Сочетание принципов GitOps с такими инструментами, как Argo CD, Argo CD Image Updater, Amazon ECR и Amazon EKS, формирует надёжную, автоматизированную и прозрачную систему деплоя.

Ключевые преимущества подхода:

  • полностью автоматические деплойменты;

  • Git как единственный источник истины;

  • безопасный доступ к реестру через IRSA;

  • простое масштабирование для новых приложений.

Этот подход снижает операционную нагрузку и одновременно повышает надёжность и наблюдаемость деплойментов в Kubernetes.

© 2026 meganuke