Установка и настройка ArgoCD для хранения манифестов Kubernetes
Опубликовано:
Используемые термины: ArgoCD, Kubernetes.
В этой инструкции установим ArgoCD в кластере Kubernetes и настроим базовый GitOps-процесс. Рассмотрим примеры:
- Установки и запуска ArgoCD на сервере Kubernetes.
- Git-проекта для хранения манифестов, которые будет забирать Argo.
- Манифестов для запуска приложения (минимальный набор).
- Конфигурации ArgoCD, позволяющей связать проект в репозитории и Kubernetes.
Материал подойдет как быстрый старт с ArgoCD для тех, кто раньше с ним не работал.
Установка ArgoCD
Примеры того, что должно быть в Git
Настройка доступа ArgoCD к репозиторию
Конфигурация ArgoCD для связки Kubernetes с проектом
Управление через браузер или CLI
Коротко о том, как работает 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