Featured image of post Установка ArgoCD

Установка ArgoCD

Online и Offline развертывание ArgoCD через Kustomize

Собираю единомышленников в телеграм канале - Присоединяйся Telegram

Установка ArgoCD с доступом в интернет на серверах до банальности проста.
Другое дело затащить все компоненты в закрытый контур.

Online установка ArgoCD

Вытаскиваем версию в переменную ARGO_VERSION

1
export ARGO_VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')

Создаём окружение и применяем манифест:

1
2
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/$ARGO_VERSION/manifests/install.yaml

Готово, ArgoCD установлен.

Offline установка ArgoCD

Скачиваем компоненты

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

На машине (сервере) с инетом. Вытаскиваем версию в переменную ARGO_VERSION

1
export ARGO_VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')

Скачиваем манифест

1
curl -LO https://raw.githubusercontent.com/argoproj/argo-cd/$ARGO_VERSION/manifests/install.yaml

Достаём версии image

1
2
DEX_VERSION=$(grep 'dex:' install.yaml | awk -F: '{print $NF}')
REDIS_VERSION=$(grep 'redis:' install.yaml | awk -F: '{print $NF}')

Качаем и упаковываем docker image:

1
2
3
4
5
6
7
docker pull quay.io/argoproj/argocd:$ARGO_VERSION
docker pull redis:$REDIS_VERSION
docker pull ghcr.io/dexidp/dex:$DEX_VERSION

docker save quay.io/argoproj/argocd:$ARGO_VERSION -o argocd.tar
docker save redis:$REDIS_VERSION -o redis.tar
docker save ghcr.io/dexidp/dex:$DEX_VERSION -o dex.tar

Теперь у тебя 4 файла:

  • argocd.tar
  • redis.tar
  • dex.tar
  • install.yaml
    Переноси их в закрытую зону.

Загружаем образы в Harbor

Среда выполнения: Закрытый кластер Кубернетес
Загружаем образы локально:

1
2
3
docker load -i argocd.tar
docker load -i redis.tar
docker load -i dex.tar

Создать в Harbor новую диркторию project

Экспорт переменных окружения. Здесь в переменную ARGO_VERSION поместить скаченную версию ArgoCD, у меня v3.3.0.
Также указываете ваш репозиторий образов, у меня Harbor и проект (директория) внутри репозитория куда грузить образы.

1
2
3
4
5
export ARGO_VERSION=v3.3.0
export HARBOR=harbor.domain.local
export PROJECT=platform
DEX_VERSION=$(grep 'dex:' install.yaml | awk -F: '{print $NF}')
REDIS_VERSION=$(grep 'redis:' install.yaml | awk -F: '{print $NF}')

Тегаем и заливаем в репозиторий Harbor:

1
2
3
4
5
6
docker tag quay.io/argoproj/argocd:$ARGO_VERSION $HARBOR/platform/argocd:$ARGO_VERSION
docker push $HARBOR/platform/argocd:$ARGO_VERSION
docker tag redis:$REDIS_VERSION $HARBOR/platform/redis:$REDIS_VERSION
docker push $HARBOR/platform/redis:$REDIS_VERSION
docker tag ghcr.io/dexidp/dex:$DEX_VERSION $HARBOR/platform/dex:$DEX_VERSION
docker push $HARBOR/platform/dex:$DEX_VERSION

Заменяем репозиторий на приватный в install.yaml

1
2
3
sed -i "s#quay.io/argoproj/argocd:$ARGO_VERSION#$HARBOR/$PROJECT/argocd:$ARGO_VERSION#g" install.yaml
sed -i "s#public.ecr.aws/docker/library/redis:$REDIS_VERSION#$HARBOR/$PROJECT/redis:$REDIS_VERSION#g" install.yaml
sed -i "s#ghcr.io/dexidp/dex:$DEX_VERSION#$HARBOR/$PROJECT/dex:$DEX_VERSION#g" install.yaml

Секреты для доступа ArgoCD в Harbor

Чтобы взаимодействовать с образами внутри куба создадим токен доступа и секрет внутри Harbor.
Создай Robot Account в Harbor
Harbor UI → Project platform → Robot Accounts → New

  • Дай права минимум pull (read).
    Получишь:
  • username вида: argocd-puller
  • token/secret (пароль)
    Нажимаем созать получаем токен (такого вида B9N0yv5123123oNa)
    Имя получилось robot$platform+argocd-puller

Создаём namespace:

1
kubectl create ns argocd

Создаём секрет в кубере:

1
2
3
4
5
kubectl -n argocd create secret docker-registry cred-harbor \
  --docker-server=harbor.domain.local \
  --docker-username='robot$platform+argocd-puller' \
  --docker-password='B9N0yv5123123oNa' \
  --docker-email='gdemoemilo@milo.tut'

Установка и патч с секретом

Далее создаём GitOps структуру, чтобы добавлять с помощью патчей этот секрет в ArgoCD.

1
2
3
mkdir -p ./argocd/base ./argocd/overlays
mv install.yaml ./argocd/base
nano ./argocd/overlays/kustomization.yaml

Вставляем:

1
2
3
4
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - install.yaml

Далее создаём патч:

1
nano ./argocd/overlays/sa-patch.yaml

Где cred-harbor имя вашего секрета.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argocd-server
spec:
  template:
    spec:
      imagePullSecrets:
        - name: cred-harbor
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argocd-repo-server
spec:
  template:
    spec:
      imagePullSecrets:
        - name: cred-harbor
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argocd-applicationset-controller
spec:
  template:
    spec:
      imagePullSecrets:
        - name: cred-harbor
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argocd-dex-server
spec:
  template:
    spec:
      imagePullSecrets:
        - name: cred-harbor
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argocd-redis
spec:
  template:
    spec:
      imagePullSecrets:
        - name: cred-harbor
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argocd-notifications-controller
spec:
  template:
    spec:
      imagePullSecrets:
        - name: cred-harbor
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: argocd-application-controller
spec:
  template:
    spec:
      imagePullSecrets:
        - name: cred-harbor

Далее создаём kustomization в base:

1
nano ./argocd/base/kustomization.yaml

В котором описываем где патч:

1
2
3
4
5
6
7
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: argocd
resources:
  - ../base
patchesStrategicMerge:
  - sa-patch.yaml

Получится такая структура:

1
2
3
4
5
6
├── base
│   ├── install.yaml
│   └── kustomization.yaml
└── overlays
    ├── kustomization.yaml
    └── sa-patch.yaml

Теперь мы применяем нашу кастомную конфигурацию. Она автоматически подтянет файл install.yaml, поэтому его не нужно запускать отдельно.

1
kubectl apply -k overlays/

ArgoCD по умолчанию работает в TLS режиме, поэтому пока мы настраиваем на 80 порт сделаем надстрийку --insecure.

1
2
kubectl -n argocd patch configmap argocd-cmd-params-cm \
  -p '{"data":{"server.insecure":"true"}}'

И рестартанём деплой:

1
kubectl -n argocd rollout restart deploy argocd-server

Вход в web-интерфейс ArgoCD

Создаём манифест с Ingress контроллером. Доменное имя в argocd.k8s.domain.local делайте своё.

1
2
mkdir ~/admin/manifests/
nano ~/admin/manifests/ingress-argo.yaml

Содержимое:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd
  namespace: argocd
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
  ingressClassName: nginx
  rules:
  - host: argocd.k8s.domain.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argocd-server
            port:
              number: 80

Применяем:

1
kubectl apply -f ingress-argo.yaml

Логин: admin Пароль получить так:

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

Установка завершена.

Информацию можно использовать в свободном доступе, с указанием ссылки на сайт
Telegram GitHub YouTube