Обзор архитектуры
Система работает по принципам GitOps: состояние, запущенное в Kubernetes, всегда соответствует желаемой конфигурации, которая хранится в Git.
На высоком уровне процесс выглядит так:
-
Новый Docker-образ публикуется в Amazon ECR.
-
Argo CD Image Updater обнаруживает новый тег образа.
-
Image Updater фиксирует новый тег в файле значений Helm в репозитории GitHub.
-
Argo CD замечает изменение в Git.
-
Argo CD синхронизирует конфигурацию приложения с кластером.
-
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).
Создание приложения 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 автоматически создаёт коммит в репозитории.
Автоматизированный процесс деплоя
После настройки весь процесс деплоя выполняется без ручного вмешательства:
-
Новый образ контейнера публикуется в ECR.
-
Image Updater обнаруживает новый тег.
-
Image Updater фиксирует обновление в Git-репозитории.
-
Argo CD замечает изменение в Git.
-
Argo CD синхронизирует деплоймент в Kubernetes.
-
Кластер скачивает новый образ контейнера.
Никаких ручных действий не требуется.
Добавление нового приложения
Чтобы подключить ещё одно приложение к этому пайплайну:
-
Создайте новый репозиторий с Helm-чартом.
-
Создайте сервисный аккаунт GitHub с PAT.
-
Добавьте репозиторий в Argo CD.
-
Создайте манифест приложения Argo CD.
-
Настройте права IRSA.
-
Добавьте конфигурацию
ImageUpdater.
После этого новое приложение будет участвовать в том же автоматизированном GitOps-процессе деплоя.
Заключение
Сочетание принципов GitOps с такими инструментами, как Argo CD, Argo CD Image Updater, Amazon ECR и Amazon EKS, формирует надёжную, автоматизированную и прозрачную систему деплоя.
Ключевые преимущества подхода:
-
полностью автоматические деплойменты;
-
Git как единственный источник истины;
-
безопасный доступ к реестру через IRSA;
-
простое масштабирование для новых приложений.
Этот подход снижает операционную нагрузку и одновременно повышает надёжность и наблюдаемость деплойментов в Kubernetes.