> For the complete documentation index, see [llms.txt](https://utm-1.gitbook.io/utm-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://utm-1.gitbook.io/utm-docs/dokumentaciya/utm-it/resheniya/kubernetes/prilozheniya/argo-cd.md).

# Argo CD

## Ссылки

Argo CD: обзор GitOps-инструмента: [slurm.io](https://slurm.io/blog/argo-cd-obzor-gitops-instrumenta?ysclid=mhm3rkys13169433656)

Путь в GitOps или как мы перевели кластер Kubernetes под управление Argo CD: [habr.com](https://habr.com/ru/articles/842934/)

Практическое руководство по созданию Helm чарта или как избавиться от рутины при работе с YAML манифестами: [habr.com](https://habr.com/ru/articles/769046/#p14)

AzamatKomaev / argo-demo-habr: [github.com](https://github.com/AzamatKomaev/argo-demo-habr)

adv4000 / argocd: [github.com](https://github.com/adv4000/argocd)

## Установка

Выполнить:

```bash
# Создать namespace 
kubectl create namespace argocd

# Выполнить манифест установки
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
```

<details>

<summary>Результат выполнения команды</summary>

```
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
serviceaccount/argocd-application-controller created
serviceaccount/argocd-applicationset-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-notifications-controller created
serviceaccount/argocd-redis created
serviceaccount/argocd-repo-server created
serviceaccount/argocd-server created
role.rbac.authorization.k8s.io/argocd-application-controller created
role.rbac.authorization.k8s.io/argocd-applicationset-controller created
role.rbac.authorization.k8s.io/argocd-dex-server created
role.rbac.authorization.k8s.io/argocd-notifications-controller created
role.rbac.authorization.k8s.io/argocd-redis created
role.rbac.authorization.k8s.io/argocd-server created
clusterrole.rbac.authorization.k8s.io/argocd-application-controller created
clusterrole.rbac.authorization.k8s.io/argocd-applicationset-controller created
clusterrole.rbac.authorization.k8s.io/argocd-server created
rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
rolebinding.rbac.authorization.k8s.io/argocd-applicationset-controller created
rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
rolebinding.rbac.authorization.k8s.io/argocd-notifications-controller created
rolebinding.rbac.authorization.k8s.io/argocd-redis created
rolebinding.rbac.authorization.k8s.io/argocd-server created
clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created
clusterrolebinding.rbac.authorization.k8s.io/argocd-applicationset-controller created
clusterrolebinding.rbac.authorization.k8s.io/argocd-server created
configmap/argocd-cm created
configmap/argocd-cmd-params-cm created
configmap/argocd-gpg-keys-cm created
configmap/argocd-notifications-cm created
configmap/argocd-rbac-cm created
configmap/argocd-ssh-known-hosts-cm created
configmap/argocd-tls-certs-cm created
secret/argocd-notifications-secret created
secret/argocd-secret created
service/argocd-applicationset-controller created
service/argocd-dex-server created
service/argocd-metrics created
service/argocd-notifications-controller-metrics created
service/argocd-redis created
service/argocd-repo-server created
service/argocd-server created
service/argocd-server-metrics created
deployment.apps/argocd-applicationset-controller created
deployment.apps/argocd-dex-server created
deployment.apps/argocd-notifications-controller created
deployment.apps/argocd-redis created
deployment.apps/argocd-repo-server created
deployment.apps/argocd-server created
statefulset.apps/argocd-application-controller created
networkpolicy.networking.k8s.io/argocd-application-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-applicationset-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-dex-server-network-policy created
networkpolicy.networking.k8s.io/argocd-notifications-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-redis-network-policy created
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
networkpolicy.networking.k8s.io/argocd-server-network-policy created
```

</details>

## Доступ к UI

### Учетная запись для доступа к UI

Логин по умолчанию — admin. Пароль можно получить из секрета:

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

{% hint style="info" %}
**Совет: сразу после входа смените пароль в UI или через CLI.**
{% endhint %}

### Доступ к UI через port-forward

По умолчанию Argo CD запускает сервер с сервисом типа ClusterIP. Чтобы получить доступ, сделайте port-forward:

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

Теперь инструмент доступен по адресу [«https://localhost:8080»](https://localhost:8080/?ysclid=mhm3rkys13169433656)

### Доступ к UI через Ingress Controller

Создать манифест `argocd-ingress.yaml`:

```bash
nano argocd-ingress.yaml
```

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-ingress
  namespace: argocd
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  ingressClassName: nginx
  rules:
  - host: k8s-argocd.utmsoft.ru
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: argocd-server
            port: 
              number: 443
```

Выполнить:

```bash
kubectl apply -f .\argocd-ingress.yaml
```

## Настройка

### Настройка GitHub

#### Создание SSH ключа для ArgoCD для доступа к GitHub

Генерация SSH-ключа

1. Откройте командную строку.
2. Введите команду, заменив `your_email@example.com` на ваш email, связанный с GitHub:\
   `ssh-keygen -t ed25519 -C "your_email@example.com"`
3. Нажмите **Enter**, чтобы сохранить ключ в месте по умолчанию (`~/.ssh/id_ed25519`).
4. {b}Необязательно:{/b} Введите пароль для повышения безопасности, иначе при каждом использовании ключа пароль вводить не придется.

#### Добавление ключа для ArgoCD на GitHub

1. Скопируйте содержимое вашего публичного ключа. Вы можете сделать это командой `cat ~/.ssh/id_ed25519.pub` и затем выделить и скопировать результат.
2. Перейдите на сайт GitHub.
3. Нажмите на значок своего профиля в правом верхнем углу и выберите **Settings**.
4. В боковом меню выберите **SSH and GPG keys**.
5. Нажмите кнопку **New SSH key**.
6. В поле **Title** введите название для вашего ключа (например, «Рабочий ноутбук»).
7. В поле **Key** вставьте скопированный публичный ключ.
8. Нажмите **Add SSH key**.&#x20;

#### Создание репозитория на GitHub

1. Откройте главную страницу GitHub и нажмите зеленую кнопку **"New"** (или "+ New repository").
2. На странице создания репозитория введите его название в поле **"Repository name"**.
3. Выберите опцию **"Private"** в разделе **"Visibility"** (Видимость).
4. (Необязательно) Заполните другие поля, такие как "Description" (Описание) и добавьте файл README.
5. Нажмите кнопку **"Create repository"** (Создать репозиторий).&#x20;

### Настройка Argo CD

#### Добавление приватного ключа в Argo CD

* Перейдите в раздел «Settings» → «SSH Secrets».
* Нажмите «Add Secret».
* Вставьте приватный ключ в поле «SSH Private Key».
* Задайте название секрета, например, `github-ssh-key`

#### Подключение репозитория в Argo CD

* Перейдите в раздел «Settings» → «Repositories».
* Нажмите «CONNECT REPO».
* Заполнить поля:
  * Choose your connection method = VID SSH
  * Name = argocd
  * Project = default
  * Repository URL = URL вашего приватного репозитория (например, `git@github.com:your-user/your-repo.git`).
  * SSH private key data = Вставьте приватный ключ

Или можно выполнить подготовленный манифест:

```bash
# Подключить репо argocd из github
kubectl apply -f .\argocd-repo-github.yaml
```

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

Реализация паттерна App-of-apps. В Argo CD создается главное приложение, которое следит за связанной папкой в репозитории github и выполнят деплой всего что в этой папке изменяется. А в этой папке располагаются манифесты приложений, которые должны быть развернуты в кластере Kubernetes.

В репозитории argocd в GitHub должна быть создана следующая структура каталогов:

```
│
├── charts                     # All Helm Charts
│   ├── chart1
│   │   ├── Chart.yaml
│   │   ├── templates
│   │   ├── values_test.yaml   # TEST Values
│   │   ├── values_prod.yaml   # PROD Values
│   │   └── values.yaml        # Default Values
│   └── chart2
│       ├── Chart.yaml
│       ├── templates
│       ├── values_test.yaml   # TEST Values
│       ├── values_prod.yaml   # PROD Values
│       └── values.yaml        # Default Values
│   
├── env-test                   # Directory for the TEST environment
│   ├── apps
│   │   ├── app1
│   │   │   └── app.yaml
│   │   └── app2
│   │       └── app.yaml
│   └── root-app.yaml          # Root ArgoCD Application
└── env-prod                   # Directory for the PROD environment
    ├── apps
    │   ├── app1
    │   │   └── app.yaml
    │   └── app2
    │       └── app.yaml
    └── root-app.yaml          # Root ArgoCD Application
```

Создать манифет для `root-app` приложения для среды PROD `env-prod/root-app.yaml`

```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name     : root-app
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  destination:
    name     : in-cluster
    namespace: argocd
  source:
    repoURL: git@github.com:<user>/argocd.git
    targetRevision: HEAD
    path   : "env-prod/apps"
    directory:
      recurse: true
      include: '**/app.yaml'

  syncPolicy:
    automated:
      prune   : true
      selfHeal: true
```

Выполнить

```bash
# Задеплоить root-app
kubectl apply -f .\root-app.yaml
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://utm-1.gitbook.io/utm-docs/dokumentaciya/utm-it/resheniya/kubernetes/prilozheniya/argo-cd.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
