Установка ArgoCD в Unix/Linux

ArgoCD — это декларативный инструмент непрерывной доставки GitOps для Kubernetes. Т.е дает возможность выполнять деплой приложений в K8S и хранить все конфиги в гите.

Установка ArgoCD в Unix/Linux

Для начало что необходимо, так установить Кубернетес, у меня есть ряд статей на эту тему:

Установка Kubernetes кластера в Unix/Linux

Установка Kubernetes в Unix/Linux

Команды Kubernetes в Unix/Linux

Создание AWS EKS кластера в Unix/Linux

Установка minikube в Unix/Linux

После чего, создаем неймспейс:

$ kubectl create namespace argocd

Установка ArgoCD через KubeCTL

Первое что необходимо, так — это поставить данную утилиту под названием kubectl!

Выполняем деплой:

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

Можно выполнить установку еще так (Non-HA):

$ export VESION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
$ export ARGO_VERSION="v1.8.0-rc1"
$ kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo/${ARGO_VERSION}/manifests/install.yaml

Можно выполнить установку еще так (HA):

$ export ARGO_VERSION="v1.8.0-rc1"
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/${ARGO_VERSION}/manifests/ha/install.yaml

Установка ArgoCD через Helm

Первое что необходимо, так — это поставить данную утилиту под названием helm!

И выполняем deploy:

$ helm repo add argo https://argoproj.github.io/argo-helm

$ helm install argocd \
	-n argocd \
	--set global.image.repository="argoproj/argocd" \
	--set global.image.tag="v1.8.1" \
	--set server.service.type="LoadBalancer" \
	argo/argo-cd

Если используете локальный миникуб или что-то такое, то запускаем так:

helm install argocd \
	-n argocd \
	--set global.image.repository="argoproj/argocd" \
	--set global.image.tag="v1.8.1" \
	argo/argo-cd

Проверим что все подымается так:

$ kubectl get po -n argocd && \
kubectl get service -n argocd

Можем идти дальше.

Кстати, пароль будет таким:

$ export OLD_ARGOCD_PWD=$(kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2)

Если что, его можно поменять.

Установка ArgoCD через Terraform

Я недавно писал модуль для работы с helm, и на примере ArgoCD выполнил деплой. Код выглядит так:

#
# MAINTAINER Vitaliy Natarov "vitaliy.natarov@yahoo.com"
#
terraform {
  required_version = "~> 0.13"
}

module "helm_release" {
  source = "../../modules/release"

  enable_release     = true
  release_name       = "argocd-dev"
  release_chart      = "argo-cd"
  release_repository = "https://argoproj.github.io/argo-helm"
  release_version    = "v1.7.6"

  release_namespace        = "argocd-dev"
  release_create_namespace = true
  release_values           = []

  release_set = [
    {
      name  = "server.service.type"
      value = "LoadBalancer"
    }
  ]
  release_set_sensitive = []
  release_postrender    = []

  release_timeout       = 600
  release_force_update  = false
  release_recreate_pods = true
  release_lint          = false

}

Код с моими модулями можно найти тут — https://github.com/SebastianUA/terraform/blob/master/helm/examples/release/main.tf

Попозже дополню данную статью этим материалом.

Настройка ArgoCD в Unix/Linux

Поле того, как у вас задеплоится ArgoCD, вы не можете знать пароль от стандартного пользователя (admin), но его можно посмотреть тут:

$ kubectl get secret -n argocd argocd-secret -o yaml

Или, так:

$ kubectl get secret -n argocd argocd-secret -o yaml | grep -Ei "  admin.password: "

Т.к кубернетес пишет все секреты в base64, то декодировать строку можно так:

$ kubectl get secret -n argocd argocd-secret -o yaml | grep -Ei "  admin.password: " | awk '{print $2}' | base64 --decode

Пока не понял как расшифровать пароль с BCrypt. По этому, пойду по простому пути, а именно — перепишу пароль на нужный, например, вы хотите поставить пароль «admin» — т.е как и логин. Дано:

  • Plain Text: admin
  • BCrypt Hash:
$2b$10$ixLkbNDoNmoo3sHorEFequhJeEsZBtFVGlYjEhKZqBv2dlgTmbt.G

И выполняем патч:

$ kubectl -n argocd patch secret argocd-secret \
  -p '{"stringData": {
    "admin.password": "$2b$10$ixLkbNDoNmoo3sHorEFequhJeEsZBtFVGlYjEhKZqBv2dlgTmbt.G",
    "admin.passwordMtime": "'$(date +%FT%T%Z)'"
  }}'

Можно использовать login & password — admin.

Можно, просто выключить авторизацию так:

$ kubectl patch deploy argocd-server -n argocd -p '[{"op": "add", "path": "/spec/template/spec/containers/0/command/-", "value": "--disable-auth"}]' --type json

Добавление пользователей в ArgoCD

Посмотреть конфиг с юзерами и паролями, можно так:

$ kubectl get secret -n argocd argocd-secret -o yaml

Первое что нужно — это отредактировать:

$ kubectl edit -n argocd configmap/argocd-cm

И приводим к виду:

data:
  accounts.vnatarov: apiKey, login
  accounts.vnatarov.enabled: "true"
  accounts.test: apiKey, login
  accounts.test.enabled: "true"

Где:

  • vnatarov & test — это имена юзеров.
  • apiKey — Позволяет генерировать токены.
  • login — Позволяет выполнять вход в UI админку ArgoCD.
  • enabled: «true» — Говорит системе то, что юзер будет включен.

Для пользователей я поставлю пароль по логину чтобы проверить как это будет работать.

Патчим пароли:

$ kubectl -n argocd patch secret argocd-secret \
  -p '{"stringData": {
    "vnatarov.password": "$2b$10$ySVNtxkJVrSmh2GQA2zTLOzNedw1QPtDMYXp0X21WYSFwqvVUdWfm",
    "vnatarov.passwordMtime": "'$(date +%FT%T%Z)'"
  }}'

kubectl -n argocd patch secret argocd-secret \
  -p '{"stringData": {
    "test.password": "$2b$10$O1Jc1FgWcDN.PC0mA6xdPOT4OmUQXHupcO9/0k6r6MHYLhuH7ALP6",
    "test.passwordMtime": "'$(date +%FT%T%Z)'"
  }}'

Или, можно отредактировать (но тогда нужно будет зашифровать фразу в base64):

$ kubectl edit secret -n argocd argocd-secret

Чет какие-то баги в аргоСД и я смог пофиксить способом что описал выше, по этому, выполнил вход в админку:

$ yes | argocd login 127.0.0.1:8080 --username admin --password admin

Можно поглядеть учетки:

$ argocd account list
NAME      ENABLED  CAPABILITIES
admin     true     login
test      true     login, apiKey
vnatarov  true     apiKey, login

Ну и обновляем пароль:

$ argocd account update-password --account test --new-password 'test'

Точно так же для моего другого юзера:

$ argocd account update-password --account vnatarov --new-password 'vnatarov'
*** Enter current password:
Password updated

Приведу полный вывод моего конфига configmap-ы argocd-cm:

$ kubectl get -n argocd configmap/argocd-cm -o yaml

apiVersion: v1
data:
  accounts.test: login,apiKey
  accounts.test.enabled: "true"
  accounts.vnatarov: apiKey,login
  accounts.vnatarov.enabled: "true"
  application.instanceLabelKey: argocd.argoproj.io/instance
  statusbadge.enabled: "true"
  url: https://127.0.0.1:8080
  users.anonymous.enabled: "true"
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: argocd
    meta.helm.sh/release-namespace: argocd
  creationTimestamp: "2021-01-05T18:18:34Z"
  labels:
    app.kubernetes.io/component: server
    app.kubernetes.io/instance: argocd
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: argocd-cm
    app.kubernetes.io/part-of: argocd
    helm.sh/chart: argo-cd-2.11.0
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:application.instanceLabelKey: {}
      f:metadata:
        f:annotations:
          .: {}
          f:meta.helm.sh/release-name: {}
          f:meta.helm.sh/release-namespace: {}
        f:labels:
          .: {}
          f:app.kubernetes.io/component: {}
          f:app.kubernetes.io/instance: {}
          f:app.kubernetes.io/managed-by: {}
          f:app.kubernetes.io/name: {}
          f:app.kubernetes.io/part-of: {}
          f:helm.sh/chart: {}
    manager: Go-http-client
    operation: Update
    time: "2021-01-05T18:18:34Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        f:accounts.test.enabled: {}
        f:accounts.vnatarov.enabled: {}
        f:statusbadge.enabled: {}
        f:url: {}
        f:users.anonymous.enabled: {}
    manager: kubectl-edit
    operation: Update
    time: "2021-01-05T21:18:04Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        f:accounts.test: {}
        f:accounts.vnatarov: {}
    manager: argocd-server
    operation: Update
    time: "2021-01-05T21:32:26Z"
  name: argocd-cm
  namespace: argocd
  resourceVersion: "122982"
  selfLink: /api/v1/namespaces/argocd/configmaps/argocd-cm
  uid: adc7f9e5-1318-44c7-a59e-ba1625a8f887

Приведу полный вывод моего конфига secret-а argocd-secret:

$ kubectl get secret -n argocd argocd-secret -o yaml

apiVersion: v1
data:
  accounts.test.password: JDJhJDEwJEhyUW0uQlo2alFTRWxvT1J3N3BKMnVXOGVGLnVRUGc4cC5LQ2JSTGJqUzRtYWtWVDRZZ1dl
  accounts.test.passwordMtime: MjAyMS0wMS0wNVQyMToyNzo0NFo=
  accounts.test.tokens: bnVsbA==
  accounts.vnatarov.password: JDJhJDEwJGExRElNNnk5SFhqM1h3ZmZjMkFNa094eGdROUYzTTg0OUQ2M1BoOFhnZXB3VkNrc2ZoZnYy
  accounts.vnatarov.passwordMtime: MjAyMS0wMS0wNVQyMTozMjoyNlo=
  accounts.vnatarov.tokens: bnVsbA==
  admin.password: JDJiJDEwJGl4TGtiTkRvTm1vbzNzSG9yRUZlcXVoSmVFc1pCdEZWR2xZakVoS1pxQnYyZGxnVG1idC5H
  admin.passwordMtime: MjAyMS0wMS0wNVQyMDoyMTowNFo=
  server.secretkey: MDZ5QVA3WVZ4cTQ0ZDFDdXZzaEZqZjcydDZmUmVmdjQ0UXFsenhUWDZEcz0=
  test.password: JDJiJDEwJE8xSmMxRmdXY0ROLlBDMG1BNnhkUE9UNE9tVVFYSHVwY085LzBrNnI2TUhZTGh1SDdBTFA2
  test.passwordMtime: MjAyMS0wMS0wNVQyMjo0NTozNEVFVA==
  tls.crt: YYYYY=
  tls.key: XXXXXXX==
  vnatarov.password: JDJiJDEwJHlTVk50eGtKVnJTbWgyR1FBMnpUTE96TmVkdzFRUHRETVlYcDBYMjFXWVNGd3F2VlVkV2Zt
  vnatarov.passwordMtime: MjAyMS0wMS0wNVQyMjoyNjo0N0VFVA==
kind: Secret
metadata:
  annotations:
    meta.helm.sh/release-name: argocd
    meta.helm.sh/release-namespace: argocd
  creationTimestamp: "2021-01-05T18:18:34Z"
  labels:
    app.kubernetes.io/component: server
    app.kubernetes.io/instance: argocd
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: argocd-secret
    app.kubernetes.io/part-of: argocd
    helm.sh/chart: argo-cd-2.11.0
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:meta.helm.sh/release-name: {}
          f:meta.helm.sh/release-namespace: {}
        f:labels:
          .: {}
          f:app.kubernetes.io/component: {}
          f:app.kubernetes.io/instance: {}
          f:app.kubernetes.io/managed-by: {}
          f:app.kubernetes.io/name: {}
          f:app.kubernetes.io/part-of: {}
          f:helm.sh/chart: {}
      f:type: {}
    manager: Go-http-client
    operation: Update
    time: "2021-01-05T18:18:34Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        f:admin.password: {}
        f:test.password: {}
        f:test.passwordMtime: {}
        f:vnatarov.password: {}
        f:vnatarov.passwordMtime: {}
    manager: kubectl-patch
    operation: Update
    time: "2021-01-05T20:45:35Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:accounts.test.password: {}
        f:accounts.test.passwordMtime: {}
        f:accounts.test.tokens: {}
        f:accounts.vnatarov.password: {}
        f:accounts.vnatarov.passwordMtime: {}
        f:accounts.vnatarov.tokens: {}
        f:admin.passwordMtime: {}
        f:server.secretkey: {}
        f:tls.crt: {}
        f:tls.key: {}
    manager: argocd-server
    operation: Update
    time: "2021-01-05T21:32:26Z"
  name: argocd-secret
  namespace: argocd
  resourceVersion: "122983"
  selfLink: /api/v1/namespaces/argocd/secrets/argocd-secret
  uid: 17e9ff5c-946d-4655-bd05-c983091ef210
type: Opaque

Приведу полный вывод моего конфига secret-а argocd-secret:

$ kubectl get -n argocd configmap/argocd-rbac-cm -o yaml

apiVersion: v1
data:
  policy.csv: |
    # Built-in policy which defines two roles: role:readonly and role:admin,
    # and additionally assigns the admin user to the role:admin role.
    # There are two policy formats:
    # 1. Applications (which belong to a project):
    # p, <user/group>, <resource>, <action>, <project>/<object>
    # 2. All other resources:
    # p, <user/group>, <resource>, <action>, <object>

    p, role:readonly, applications, get, */*, allow
    p, role:readonly, certificates, get, *, allow
    p, role:readonly, clusters, get, *, allow
    p, role:readonly, repositories, get, *, allow
    p, role:readonly, projects, get, *, allow
    p, role:readonly, accounts, get, *, allow
    p, role:readonly, gpgkeys, get, *, allow

    p, role:admin, applications, create, */*, allow
    p, role:admin, applications, update, */*, allow
    p, role:admin, applications, delete, */*, allow
    p, role:admin, applications, sync, */*, allow
    p, role:admin, applications, override, */*, allow
    p, role:admin, applications, action/*, */*, allow
    p, role:admin, certificates, create, *, allow
    p, role:admin, certificates, update, *, allow
    p, role:admin, certificates, delete, *, allow
    p, role:admin, clusters, create, *, allow
    p, role:admin, clusters, update, *, allow
    p, role:admin, clusters, delete, *, allow
    p, role:admin, repositories, create, *, allow
    p, role:admin, repositories, update, *, allow
    p, role:admin, repositories, delete, *, allow
    p, role:admin, projects, create, *, allow
    p, role:admin, projects, update, *, allow
    p, role:admin, projects, delete, *, allow
    p, role:admin, accounts, update, *, allow
    p, role:admin, gpgkeys, create, *, allow
    p, role:admin, gpgkeys, delete, *, allow

    g, role:admin, role:readonly
    g, admin, role:admin
    g, vnatarov, role:admin
  policy.default: role:readonly
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: argocd
    meta.helm.sh/release-namespace: argocd
  creationTimestamp: "2021-01-05T18:18:34Z"
  labels:
    app.kubernetes.io/component: server
    app.kubernetes.io/instance: argocd
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: argocd-rbac-cm
    app.kubernetes.io/part-of: argocd
    helm.sh/chart: argo-cd-2.11.0
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:meta.helm.sh/release-name: {}
          f:meta.helm.sh/release-namespace: {}
        f:labels:
          .: {}
          f:app.kubernetes.io/component: {}
          f:app.kubernetes.io/instance: {}
          f:app.kubernetes.io/managed-by: {}
          f:app.kubernetes.io/name: {}
          f:app.kubernetes.io/part-of: {}
          f:helm.sh/chart: {}
    manager: Go-http-client
    operation: Update
    time: "2021-01-05T18:18:34Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:policy.csv: {}
        f:policy.default: {}
    manager: kubectl-edit
    operation: Update
    time: "2021-01-05T20:34:00Z"
  name: argocd-rbac-cm
  namespace: argocd
  resourceVersion: "116734"
  selfLink: /api/v1/namespaces/argocd/configmaps/argocd-rbac-cm
  uid: aa1649df-d477-4258-bb3a-f7219326ad84

Можно юзать!

Убрать HTTPS в ArgoCD

Патчим:

$ kubectl patch deploy argocd-server -n argocd -p '[{"op": "add", "path": "/spec/template/spec/containers/0/command/-", "value": "--insecure"}]' --type json

И потом все норм.

Создание RBAC для пользователей

Команда простая (на примере дефолтного админа):

$ kubectl -n argocd create rolebinding default-admin --clusterrole=admin --serviceaccount=argo:default

Дальше — больше.

Создание ArtifactRepository для ArgoCD

Создаем это так:

$ cat <<EoF > argo-patch.yaml
data:
  config: |
    artifactRepository:
      s3:
        endpoint: s3.amazonaws.com
        bucket: batch-artifact-repository
EoF

Где:

  • batch-artifact-repository — это созданный бакет.

И применяем:

$ kubectl -n argocd patch \
  configmap/argocd-cm \
  --patch "$(cat argo-patch.yaml)"

Вот так вот.

Установка оператора (Argo CD Operator) для ArgoCD (Helm)

Установка очень простая:

$ kubectl apply -f https://operatorhub.io/install/argocd-operator-helm.yaml

После чего, проверяем:

$ kubectl get csv -n my-argocd-operator-helm

Или, еще проще способ:

$ curl -sL https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.17.0/install.sh | bash -s v0.17.0

После чего, проверяем:

$ kubectl get csv -n olm

Вот и все.

Использование ArgoCD в Unix/Linux

Пропишу команду для дальнейшего использования:

$ export ARGOCD_SERVER=$(kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2)

Т.к я выбрал локальный запуск и приложение не смотрит в мир, то нужно выполнить форвардинг порта:

$ kubectl port-forward service/argocd-server -n argocd 8080:443

И после данного действия, у вас будет работать argoCD на 127.0.0.1:8080

Т.к я использую макбук, то следующая команда установит argocd CLI на мой мак:

$ brew install argocd

Далее, выполним логин:

$ argocd login localhost:8080 --insecure --username admin --grpc-web

NOTE: Нужно знать пароль!

Далее, ставим 1-е приложение:

$ argocd app create guestbook \
--repo https://github.com/pcrete/argocd-example-apps.git \
--path guestbook \
--dest-server https://kubernetes.default.svc \
--dest-namespace guestbook

И далее, ставим 2-е приложение:

$ argocd app create webapp \
--repo https://gitlab.com/gitops-argocd-demo/webapp-chart.git \
--path . \
--dest-server https://kubernetes.default.svc \
--dest-namespace hello-gitops \
--sync-policy automated \
--auto-prune \
--self-heal

Можно открыть в браузере аргоСД и поглядеть что оно будет делать.

Вот и все, статья «Установка ArgoCD в Unix/Linux» завершена.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.