Установка и настройка ArgoCD для хранения манифестов Kubernetes

Обновлено и опубликовано Опубликовано:

Используемые термины: ArgoCD, Kubernetes.

В этой инструкции установим ArgoCD в кластере Kubernetes и настроим базовый GitOps-процесс. Рассмотрим примеры:

  • Установки и запуска ArgoCD на сервере Kubernetes.
  • Git-проекта для хранения манифестов, которые будет забирать Argo.
  • Манифестов для запуска приложения (минимальный набор).
  • Конфигурации ArgoCD, позволяющей связать проект в репозитории и Kubernetes.

Материал подойдет как быстрый старт с ArgoCD для тех, кто раньше с ним не работал.

Коротко о том, как работает ArgoCD: инструмент постоянно сравнивает состояние приложения в кластере с манифестами в git-репозитории и автоматически приводит кластер к нужному состоянию. За синхронизацию, доступ к репозиториям и API отвечают отдельные компоненты — вместе они формируют архитектуру ArgoCD.

Установка ArgoCD на Kubernetes

Создадим отдельный namespace для ArgoCD:

kubectl create namespace argocd

Установим ArgoCD в этот namespace:

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

* в данной команде установки ArgoCD используется ветка stable. В реальных production-инструкциях безопаснее указывать конкретную фиксированную версию, чтобы изменения в репозитории проекта не сломали развертывание в будущем.

Проверим, что все поды запустились:

kubectl get pods -n argocd

* если поды какое-то время висят в статусе Pending или ContainerCreating — это нормально, образы еще скачиваются.

ArgoCD установлен и готов к работе.

Подготовка манифестов приложения в Git

Данные файлы нужно поместить в свой git-репозиторий. Это может быть свой сервер, GitHub / Gitlab и так далее.

Данные манифесты абстрактны — они указаны просто для примера, чтобы было понимание, какие нужны данные. Вам необходимо использовать свои файлы. 

Предположим, наш проект называется gitops. Создадим в нем отдельный каталог для приложения app1:

mkdir -p /opt/gitops/app1 && cd /opt/gitops/app1

Опишем деплоймент приложения:

vi deploy.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app1
  labels:
    app: app1
    description: gitops_app
spec:
  replicas: 1
  selector:
    matchLabels:
      project: app1
  template:
    metadata:
      labels:
        project: app1
        description: gitops_app
    spec:

      containers:
        - name: app1
          image: app1:dev
          imagePullPolicy: Always
          env:
            - name: PORT
              value: "3000"
          ports:
            - containerPort: 3000

Добавим сервис, через который приложение будет доступно внутри кластера:

vi service.yml

apiVersion: v1
kind: Service
metadata:
  name: app1-service
spec:
  selector:
    project: app1
  ports:
    - name: app1-port
      protocol: TCP
      port: 3000
      targetPort: 3000

И настроим ingress для внешнего доступа:

vi ingress.yml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app1-ingress
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  ingressClassName: "traefik"
  rules:
    - host: app1.dmosk.ru
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: app1-service
                port:
                  name: app1-port

Манифесты готовы. Дальше подключим репозиторий к ArgoCD.

Настройка доступа ArgoCD к репозиторию

Для доступа ArgoCD к приватному репозиторию сгенерируем отдельный SSH-ключ:

ssh-keygen -t ed25519 -f ./deploy_key -N ""

Выведем публичную часть ключа — ее нужно добавить в настройках репозитория как deploy key с правом на чтение:

cat deploy_key.pub

* deploy key добавляется в настройках git-проекта, например в GitHub это Settings → Deploy keys.

Создадим в Kubernetes секрет с приватным ключом и адресом репозитория:

kubectl create secret generic repo-argocd \
  -n argocd \
  --from-file=sshPrivateKey=./deploy_key \
  --from-literal=url=git@github.com:dmosk-argo/argocd.git \
  --from-literal=type=git

* где: repo-argocd — имя секрета. url — адрес git-репозитория по SSH. sshPrivateKey — приватная часть ключа, созданного на предыдущем шаге.

Пометим секрет меткой, чтобы ArgoCD распознал его как репозиторий:

kubectl label secret repo-argocd -n argocd argocd.argoproj.io/secret-type=repository

Приватный ключ на диске больше не нужен — удалим его:

rm -f ./deploy_key*

Доступ к репозиторию настроен.

Конфигурация ArgoCD для связки Kubernetes с проектом

На сервере Kubernetes создадим каталог и опишем приложение для ArgoCD:

mkdir -p /opt/gitops/app1 && cd /opt/gitops/app1

vi argo.yml

apiVersion: argoproj.io/v1alpha1
kind: Application

metadata:
  name: app1
  namespace: argocd

spec:
  # Argo CD Project (RBAC/ограничения). "default" — встроенный проект без жёстких лимитов
  project: default

  source:
    repoURL: git@github.com:dmosk-argo/argocd.git
    targetRevision: HEAD
    path: app1

  destination:
    # API-сервер кластера. Для in-cluster Argo CD почти всегда этот URL
    server: https://kubernetes.default.svc
    namespace: default

  # Как синкать изменения из Git в кластер
  syncPolicy:
    # Без automated — только ручной Sync в UI/CLI
    automated:
      # Удалять из кластера ресурсы, которых больше нет в Git
      prune: true
      # Если кто-то поменял ресурс руками в кластере — вернуть состояние из Git
      selfHeal: true
    syncOptions:
      # Создать destination.namespace, если его ещё нет
      - CreateNamespace=true

prune: true удалит из кластера только те ресурсы, которые ранее были созданы с помощью ArgoCD для данного приложения. Его использовать безопасно и помогает не скапливаться мусору.

Применим манифест:

kubectl apply -f argo.yml

Мы должны увидеть сообщение о создании ресурса:

application.argoproj.io/app1 created

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

kubectl get application app1 -n argocd -o wide

ArgoCD настроен, приложение синхронизируется с Git автоматически.

Управление

При желании посмотреть состояние через веб-интерфейс ArgoCD, прокинем порт наружу:

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

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

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

Вводим в браузере адрес https://<IP-адрес сервера Kubernetes>:8080. Игнорируем ошибку сертификата и проходим авторизацию.

Если нам удобнее подключиться из командной строки, на любой системе Linux, откуда хотим это сделать установим клиента argo:

curl -sL https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64 -o /usr/local/bin/argocd

chmod +x /usr/local/bin/argocd

Для подключения и логина используем команду:

argocd login <IP-адрес сервера Kubernetes>:8080 --username admin --password <пароль> --insecure

# DevOps # Linux # Контейнеризация # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет

Дмитрий Моск
— IT-специалист.
Настройка серверов, услуги DevOps.

Заказать настройку контейнеризации

Нужна бесплатная консультация?

Мини-инструкции

Как установить и настроить ArgoCD в кластере Kubernetes

Использование Helm для установки Garage S3 в Kubernetes

Как установить и настроить K3S для корректной работы на Linux Ubuntu

Использование приложения Barman для резервного копирования СУБД PostgreSQL

Шпаргалка для docker healthcheck

Как получить бесплатный VDS-сервер в SpaceWeb

Как установить и работать с различными LLM моделями через Ollama на Linux

Другие инструкции

Все статьи

Нужна помощь? Пишите:






Реклама