Включение модуля
Для использования модуля operator-argo в Deckhouse Kubernetes Platform, его необходимо включить. Это можно сделать одним из способов, описанных далее.
Способ 1: Включение с применением ModuleConfig
Для включения модуля создайте ресурс ModuleConfig:
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: operator-argo
spec:
enabled: trueСпособ 2: Включение с использованием deckhouse-controller
Для включения модуля выполните команду:
kubectl -n d8-system exec deploy/deckhouse -c deckhouse -it -- deckhouse-controller module enable operator-argoВыключение модуля
При отключении модуля будет удалён оператор ArgoCD (все ресурсы из пространства имен d8-operator-argo). Развёрнутые инсталляции ArgoCD и приложения останутся нетронутыми.
Если вам необходимо отключить модуль operator-argo, вы можете сделать это одним из способов, описанных далее.
Способ 1: Выключение с применением ModuleConfig
Для выключения модуля установите значение enabled в false в конфигурации ModuleConfig:
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: operator-argo
spec:
enabled: falseСпособ 2: Выключение с использованием deckhouse-controller
Для выключения модуля выполните следующую команду:
kubectl -n d8-system exec deploy/deckhouse -c deckhouse -it -- deckhouse-controller module disable operator-argoУстановка ArgoCD и развертывание ArgoCD Application
Разверните ArgoCD, который будет доступен через Ingress:
---
apiVersion: v1
kind: Namespace
metadata:
name: argocd
---
apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
name: argocd
namespace: argocd
spec:
server:
host: <argocd-domain>
ingress:
enabled: true
tls:
- hosts:
- <argocd-domain>
secretName: argocd-ingress-tls
# To avoid internal redirection loops from HTTP to HTTPS, the API server should be run with TLS disabled.
# https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#disable-internal-tls
insecure: true
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: argocd-ingress
namespace: argocd
spec:
dnsNames:
- <argocd-domain>
issuerRef:
kind: ClusterIssuer
name: letsencrypt
secretName: argocd-ingress-tlsСоздайте пространство имен для приложения:
apiVersion: v1
kind: Namespace
metadata:
name: demo
labels:
argocd.argoproj.io/managed-by: argocdРазверните ArgoCD Application:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: demo
namespace: argocd
spec:
destination:
namespace: demo
server: https://kubernetes.default.svc
project: default
source:
path: helm-guestbook
repoURL: https://github.com/argoproj/argocd-example-apps
targetRevision: HEAD
syncPolicy:
automated:
prune: true
selfHeal: trueHigh availability ArgoCD
Для включения режима высокой доступности установите spec.ha.enabled: true в CR ArgoCD.
apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
name: argocd
namespace: argocd
spec:
ha:
enabled: true
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1"
memory: "1Gi"ПРИМЕЧАНИЕ:
Режим HA в ArgoCD обеспечивает высокую доступность Redis (state storage) с использованием HAProxy и не означает автоматическую высокую доступность всех компонентов ArgoCD.
Для установки ArgoCD в режиме HA требуется как минимум три разных узла кластера из-за правил pod anti-affinity, заданных в спецификации.
Кластеры, работающие только с IPv6, не поддерживаются.При включённом режиме HA изменения в
.spec.redis.resourcesне оказывают эффекта.
Ограничения и запросы ресурсов для Redis настраиваются через.spec.ha.resources.
Аутентификация
Использование единой системы аутентификации Deckhouse Kubernetes Platform для аутентификации в ArgoCD
Создайте OAuth2-клиента для аутентификации в ArgoCD:
apiVersion: deckhouse.io/v1
kind: DexClient
metadata:
name: argocd
namespace: argocd
spec:
redirectURIs:
- https://<argocd-domain>/api/dex/callback
- https://<argocd-domain>/api/dex/callback-reserveПосле создания ресурса DexClient, DKP зарегистрирует клиента с идентификатором (clientID) dex-client-argocd@argocd (используя шаблон dex-client-<name>@<namespace>).
Дождитесь, пока Deckhouse Kunernetes Platform создаст Secret с секретным ключом для клиента:
kubectl -n argocd get secret/dex-client-argocdНастройте ArgoCD для использования системы аутентификации DKP:
apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
name: argocd
namespace: argocd
spec:
sso:
dex:
config: |
connectors:
- type: oidc
id: deckhouse
name: deckhouse
config:
issuer: "https://dex.<cluster-domain>/"
clientID: "dex-client-argocd@argocd"
clientSecret: "$dex-client-argocd:clientSecret"
insecureEnableGroups: true
scopes:
- profile
- email
- openid
- groups
provider: dex
server:
host: <argocd-domain>
ingress:
enabled: true
ingressClassName: <ingressClassName>
tls:
- hosts:
- <argocd-domain>
secretName: argocd-ingress-tls
# To avoid internal redirection loops from HTTP to HTTPS, the API server should be run with TLS disabled.
# https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#disable-internal-tls
insecure: trueПерезапустите сервер ArgoCD:
kubectl -n argocd rollout restart deploy/argocd-serverЕсли не перезапустить сервер ArgoCD, то попытка входа не удастся, а в логе сервера ArgoCD появится сообщение об ошибке (issue о проблеме).
Пример сообщения об ошибке...
time="2024-10-16T14:12:59Z" level=warning msg="Failed to verify token: failed to verify token: token verification failed for all audiences: error for aud "argo-cd": Failed to query provider "https://argocd./api/dex": Get "https://argocd./api/dex/.well-known/openid-configuration": tls: failed to verify certificate: x509: certificate is valid for ingress.local, not argocd., error for aud "argo-cd-cli": Failed to query provider "https://argocd./api/dex": Get "https://argocd./api/dex/.well-known/openid-configuration": tls: failed to verify certificate: x509: certificate is valid for ingress.local, not argocd."
Использование самоподписного сертификата для Dex
Если при настройке Dex используется самоподписный сертификат, необходимо добавить корневой сертификат в конфигурацию OIDC-коннектора ArgoCD. Для этого используйте параметр rootCAs:
apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
name: argocd
namespace: argocd
spec:
sso:
dex:
config: |
connectors:
- type: oidc
id: deckhouse
name: deckhouse
config:
issuer: "https://dex.<cluster-domain>/"
rootCAs:
- |
-----BEGIN CERTIFICATE-----
... encoded certificate data here ...
-----END CERTIFICATE-----
clientID: "dex-client-argocd@argocd"
clientSecret: "$dex-client-argocd:clientSecret"
insecureEnableGroups: true
scopes:
- profile
- email
- openid
- groups
provider: dex
server:
host: <argocd-domain>
ingress:
enabled: true
tls:
- hosts:
- <argocd-domain>
secretName: argocd-ingress-tls
# To avoid internal redirection loops from HTTP to HTTPS, the API server should be run with TLS disabled.
# https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#disable-internal-tls
insecure: trueДля получения сертификата Dex из Kubernetes Secret используйте команду:
kubectl -n <dex-namespace> get secret <dex-tls-secret-name> -o jsonpath='{.data.tls\.crt}' | base64 -dПолученный сертификат в формате PEM разместите в параметре rootCAs.
ArgoCD RBAC
Применить политики доступа в ArgoCD CRD можно через параметр rbac. Ниже представлен пример политики, реализующий роль demo-app-viewer для всех приложений в проекте demo. Со всеми правилами создания политик доступа можно ознакомиться в документации к ArgoCD :
apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
name: argocd
namespace: argocd
spec:
rbac:
defaultPolicy: role:none
policy: |
# 1. Определяем роль 'demo-app-viewer' и права
# Разрешаем просматривать все приложения в проекте demo
p, role:demo-app-viewer, applications, get, demo/*, allow
# Разрешаем просмотр логов приложения proj-demo в проекте (demo/proj-demo)
p, role:demo-app-viewer, logs, get, demo/proj-demo, allow
# 2. Привязываем группу 'viewer' (полученную из DEX) к роли 'demo-app-viewer'
g, viewer, role:demo-app-viewer
policyMatcherMode: glob
scopes: '[groups]'
sso:
dex:
config: |
connectors:
- type: oidc
id: deckhouse
name: deckhouse
config:
issuer: "https://dex.<cluster-domain>/"
clientID: "dex-client-argocd@argocd"
clientSecret: "$dex-client-argocd:clientSecret"
insecureEnableGroups: true
scopes:
- profile
- email
- openid
- groups
provider: dexАутентификация в ArgoCD без Dex (admin-пользователь)
При первоначальном развертывании ArgoCD оператор создает Kubernetes Secret:
- Namespace:
argocd - Secret:
argocd-cluster - Ключ:
admin.password
В этом секрете хранится исходный пароль пользователя admin в формате base64.
Получить первоначальный пароль можно командой:
kubectl -n argocd get secret argocd-cluster \
-o jsonpath='{.data.admin\.password}' | base64 -dСоздание локальных пользователей ArgoCD
Для создания локальных пользователей в ArgoCD CRD необходимо воспользоваться параметром extraConfig
apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
name: argocd
namespace: argocd
spec:
extraConfig:
# Создание пользователя 'deploy' с правами на генерацию токенов и вход в UI
accounts.deploy: apiKey, login
# Явное включение пользователя (значение по умолчанию true)
accounts.deploy.enabled: "true"
# Создание пользователя 'ci-bot' ТОЛЬКО для автоматизации (без доступа в UI)
accounts.ci-bot: apiKeyПосле определения пользователя в применения манифеста ArgoCD CRD необходимо сгенирировать пароль пользователя для доступа в UI, если данные права указаны (login).
Для создания пароля через Secret он должен быть захэширован с помощью bcrypt, после чего результат закодирован в формат Base64:
echo "Flant54321" | htpasswd -BinC 10 "" | cut -d: -f2 | base64 -w0
kubectl patch secret argocd-secret -n argocd -p '{"data":{"accounts.<account-name>.password":"<bCrypt-to-Base64>"}}'Также есть возможность добавления пароля через CLI контейнера argocd-server:
# Указываем временное размещение конфигурационного файла т.к. /config в read-only
export HOME = /tmp
# Авторизируемся
argocd login localhost:8080 --username admin --password <admin-пароль> --insecure
# Установите пароль для пользователя
argocd account update-password \
--account <аккаунт> \
--current-password <admin-пароль> \
--new-password <желаемый-пароль>Для пользователей с указанием прав apiKey токен можно cгенерировать от учетной записи администратора через UI (Settings/Accounts/{Account} Token) или через CLI контейнера argocd-server:
# Указываем временное размещение конфигурационного файла т.к. /config в read-only
export HOME=/tmp
# Авторизируемся
argocd login localhost:8080 --username admin --password <admin-пароль> --insecure
# Генерируем токен
argocd account generate-token --account <аккаунт>Предоставление ArgoCD доступа к ресурсам кластера
Для предоставления доступа ArgoCD к кластерным (cluster-wide) ресурсам используйте параметр clusterConfigNamespaces в настройках модуля:
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: operator-argo
spec:
enabled: true
settings:
clusterConfigNamespaces: <list of namespaces of cluster-scoped Argo CD instances>
version: 1Использование собственного доменного имени кластера вместо cluster.local
Чтобы настроить ArgoCD для работы с другим FQDN кластера (например, prod.local), укажите его в параметре clusterDomain:
apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
name: argocd
namespace: argocd
spec:
...
clusterDomain: "prod.local"
...