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» завершена.