[DO-1431] deploy ArgoCD (!6)
DO-1431 Co-authored-by: denis.patrakeev <denis.patrakeev@avroid.tech> Reviewed-on: https://git.avroid.tech/K8s/k8s-configs/pulls/6
This commit is contained in:
23
.editorconfig
Normal file
23
.editorconfig
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# EditorConfig is awesome: https://editorconfig.org
|
||||||
|
|
||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# Unix-style newlines with a newline ending every file
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
charset = utf-8
|
||||||
|
|
||||||
|
[*.sh]
|
||||||
|
# like -i=4
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
# --language-variant
|
||||||
|
shell_variant = bash
|
||||||
|
binary_next_line = true
|
||||||
|
# --case-indent
|
||||||
|
switch_case_indent = true
|
||||||
|
space_redirects = true
|
||||||
|
keep_padding = true
|
||||||
13
.gitea/pull_request_template.md
Normal file
13
.gitea/pull_request_template.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
name: "Feature PR"
|
||||||
|
about: "Template feature PR"
|
||||||
|
title: "[DO-XXXX] New feature"
|
||||||
|
ref: "main"
|
||||||
|
assignees: ["svc-gitea-k8s-w"]
|
||||||
|
labels:
|
||||||
|
- "kind/Feature"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[DO-XXXX]
|
||||||
44
.gitea/workflows/check-shellscripts.yml
Normal file
44
.gitea/workflows/check-shellscripts.yml
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
name: Check ShellScripts
|
||||||
|
run-name: ${{ gitea.actor }} is start check shellscripts
|
||||||
|
on: [pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
shellscripts:
|
||||||
|
name: Check shellscripts by shellcheck
|
||||||
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: harbor.avroid.tech/docker-hub-proxy/library/node:20
|
||||||
|
steps:
|
||||||
|
- run: echo "Start job on ${{ runner.name }} with os ${{ runner.os }}"
|
||||||
|
- run: echo "Work with branch ${{ gitea.ref }} repository ${{ gitea.repository }}"
|
||||||
|
|
||||||
|
- name: Check out repository code
|
||||||
|
uses: https://git-mirrors.avroid.tech/Mirrors-actions/checkout.git@v4
|
||||||
|
|
||||||
|
- name: Check shellscripts by shellcheck
|
||||||
|
uses: https://git-mirrors.avroid.tech/Mirrors-actions/action-shellcheck.git@2.0.0
|
||||||
|
|
||||||
|
shfmt:
|
||||||
|
name: Check shellscript formatting
|
||||||
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: harbor.avroid.tech/docker-hub-proxy/library/node:20
|
||||||
|
steps:
|
||||||
|
- run: echo "Start job on ${{ runner.name }} with os ${{ runner.os }}"
|
||||||
|
- run: echo "Work with branch ${{ gitea.ref }} repository ${{ gitea.repository }}"
|
||||||
|
|
||||||
|
- name: Check out repository code
|
||||||
|
uses: https://git-mirrors.avroid.tech/Mirrors-actions/checkout.git@v4
|
||||||
|
|
||||||
|
- name: Install Golang
|
||||||
|
uses: https://git-mirrors.avroid.tech/Mirrors-actions/setup-go.git@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.22'
|
||||||
|
check-latest: true
|
||||||
|
|
||||||
|
- name: Install shfmt
|
||||||
|
run: go install mvdan.cc/sh/v3/cmd/shfmt@latest
|
||||||
|
|
||||||
|
- name: Check shellscripts by shfmt
|
||||||
|
run: shfmt -d .
|
||||||
37
.gitignore
vendored
Normal file
37
.gitignore
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# ---> Ansible
|
||||||
|
*.retry
|
||||||
|
.vault_password_file
|
||||||
|
ansible_collections
|
||||||
|
|
||||||
|
# ---> JetBrains
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# File-based project format
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# ---> VisualStudioCode
|
||||||
|
.vscode
|
||||||
|
.history/
|
||||||
|
*.vsix
|
||||||
|
**/.DS_Store
|
||||||
|
|
||||||
|
|
||||||
|
# Other
|
||||||
|
.vagrant
|
||||||
|
|
||||||
|
.venv
|
||||||
|
venv*
|
||||||
|
.kubespray-venv
|
||||||
|
kubespray-venv*
|
||||||
|
**/.kubespray-venv
|
||||||
|
**/kubespray-venv*
|
||||||
|
|
||||||
|
__pycache__
|
||||||
|
*~
|
||||||
|
*.log
|
||||||
|
._*
|
||||||
|
|
||||||
|
.creds
|
||||||
|
.secrets
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# Argo CD
|
||||||
|
|
||||||
|
## Project structure
|
||||||
|
```text
|
||||||
|
.
|
||||||
|
├── README.md
|
||||||
|
├── argocd-namespace.yaml
|
||||||
|
├── .rbac
|
||||||
|
├── argo-cd
|
||||||
|
│ ├── README.md
|
||||||
|
│ ├── values-override.yml
|
||||||
|
│ ├── argocd_values_secrets_init.sh
|
||||||
|
│ └── .rbac
|
||||||
|
└── argocd-apps
|
||||||
|
├── README.md
|
||||||
|
└── values-override.yml
|
||||||
|
|
||||||
|
Назначение:
|
||||||
|
argo-cd - Helm-чарт для установки Argo CD
|
||||||
|
argocd-apps - Helm-чарт для развёртывания в Argo CD "корневого" приложения, которое будет разворачивать остальные приложения
|
||||||
|
argocd-namespace.yaml - манифест для создания namespace Argo CD
|
||||||
|
.rbac - кастомные правила для RBAC
|
||||||
|
```
|
||||||
|
## First install
|
||||||
|
Порядок развёртывания Argo CD:
|
||||||
|
1. Настраиваем для работы файл конфигурации kubectl для подключения к кластеру Kubernetes
|
||||||
|
|
||||||
|
2. Готовим namespace:
|
||||||
|
```bash
|
||||||
|
kubectl apply -f argocd-namespace.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Разворачиваем Argo CD
|
||||||
|
|
||||||
|
[README.md](argo-cd/README.md)
|
||||||
|
|
||||||
|
3. Разворачиваем "корневое" приложение в Argo CD
|
||||||
|
|
||||||
|
[README.md](argocd-apps/README.md)
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: serviceaccount
|
||||||
|
app.kubernetes.io/instance: vault-sa
|
||||||
|
app.kubernetes.io/component: rbac
|
||||||
|
app.kubernetes.io/created-by: vault-operator
|
||||||
|
app.kubernetes.io/part-of: vault-operator
|
||||||
|
app.kubernetes.io/managed-by: kustomize
|
||||||
|
name: vault
|
||||||
|
namespace: argocd
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
# Install Argo CD by [argo-cd in argo-helm](https://github.com/argoproj/argo-helm/tree/main/charts/argo-cd)
|
||||||
|
|
||||||
|
## Create from version
|
||||||
|
| Project | Version |
|
||||||
|
|---------------------|---------|
|
||||||
|
| ArgoCD Helm | 7.8.2 |
|
||||||
|
| ArgoCD | v2.14.2 |
|
||||||
|
| ArgoCD Vault Plugin | 1.18.1 |
|
||||||
|
|
||||||
|
|
||||||
|
## Plugins
|
||||||
|
1. Argo CD Vault Plugin
|
||||||
|
|
||||||
|
https://argocd-vault-plugin.readthedocs.io/en/stable/installation/#initcontainer-and-configuration-via-sidecar
|
||||||
|
|
||||||
|
https://github.com/argoproj-labs/argocd-vault-plugin/tree/main/manifests/cmp-sidecar
|
||||||
|
|
||||||
|
https://habr.com/ru/articles/645773/
|
||||||
|
|
||||||
|
|
||||||
|
## Install
|
||||||
|
Настраиваем для работы файл конфигурации kubectl для подключения к кластеру Kubernetes
|
||||||
|
|
||||||
|
Готовим служебную УЗ для vault:
|
||||||
|
```bash
|
||||||
|
kubectl apply -f .rbac/vault-service-account.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Получаем из Vault секреты с паролями/токенами/сертификатами и выгружаем в окружение оболочки:
|
||||||
|
```bash
|
||||||
|
./argocd_values_secrets_init.sh
|
||||||
|
|
||||||
|
source .creds
|
||||||
|
```
|
||||||
|
|
||||||
|
Создаём секрет с сертификатами:
|
||||||
|
```bash
|
||||||
|
kubectl -n argocd create secret tls argocd-server-tls \
|
||||||
|
--cert=.secrets/argocd_cert.pem \
|
||||||
|
--key=.secrets/argocd_key.pem
|
||||||
|
```
|
||||||
|
|
||||||
|
Добавляем конфигурацию для плагина ArgoCD Vault:
|
||||||
|
```bash
|
||||||
|
kubectl -n argocd apply -f .secrets/argocd-vault-plugin-configmap.yaml
|
||||||
|
kubectl -n argocd apply -f .secrets/argocd-vault-plugin-secret.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
И производим непосредственную установку ArgoCD:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm repo add argo https://argoproj.github.io/argo-helm
|
||||||
|
helm repo update
|
||||||
|
|
||||||
|
helm install -n argocd argo-cd argo/argo-cd -f values-override.yaml \
|
||||||
|
--set configs.secret.argocdServerAdminPassword=$ARGOCD_ADMIN_PASSWORD_HASH \
|
||||||
|
--set configs.repositories.argocd-git-server.username=$ARGOCD_GIT_REPO_USER \
|
||||||
|
--set configs.repositories.argocd-git-server.password=$ARGOCD_GIT_REPO_USER_PASSWORD
|
||||||
|
```
|
||||||
|
|
||||||
|
Подпихиваем в секрет `argocd-secret` необходимые для конфигурации секреты:
|
||||||
|
```bash
|
||||||
|
kubectl -n argocd patch --patch-file .secrets/argocd-secret-path.yaml secret argocd-secret
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Upgrade/Changes
|
||||||
|
Обновление настроек и чарта делаем так:
|
||||||
|
|
||||||
|
В начале сравниваем содержимое `values-override.yaml` с исходным файлом `values.yaml`
|
||||||
|
(ссылка на исходную версию зафиксирована в заголовке `values-override.yaml`) через diff (IDE лучше).
|
||||||
|
Или с новой версией `values.yaml` в Helm-чарте.
|
||||||
|
Вносим необходимые правки, новые опции или добавляем секреты.
|
||||||
|
|
||||||
|
Получаем из Vault секреты с паролями/токенами/сертификатами и выгружаем в окружение оболочки:
|
||||||
|
```bash
|
||||||
|
./argocd_values_secrets_init.sh
|
||||||
|
|
||||||
|
source .creds
|
||||||
|
```
|
||||||
|
|
||||||
|
Создаём секрет с сертификатами:
|
||||||
|
```bash
|
||||||
|
kubectl -n argocd create secret tls argocd-server-tls \
|
||||||
|
--cert=.secrets/argocd_cert.pem \
|
||||||
|
--key=.secrets/argocd_key.pem
|
||||||
|
```
|
||||||
|
|
||||||
|
Добавляем конфигурацию для плагина ArgoCD Vault:
|
||||||
|
```bash
|
||||||
|
kubectl -n argocd apply -f .secrets/argocd-vault-plugin-configmap.yaml
|
||||||
|
kubectl -n argocd apply -f .secrets/argocd-vault-plugin-secret.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Подпихиваем в секрет argocd-secret необходимые для конфигурации секреты:
|
||||||
|
```bash
|
||||||
|
kubectl -n argocd patch --patch-file .secrets/argocd-secret-path.yaml secret argocd-secret
|
||||||
|
```
|
||||||
|
|
||||||
|
Затем применяем:
|
||||||
|
```bash
|
||||||
|
helm upgrade -n argocd argo-cd argo/argo-cd -f values-override.yaml \
|
||||||
|
--set configs.secret.argocdServerAdminPassword=$ARGOCD_ADMIN_PASSWORD_HASH \
|
||||||
|
--set configs.repositories.argocd-git-server.username=$ARGOCD_GIT_REPO_USER \
|
||||||
|
--set configs.repositories.argocd-git-server.password=$ARGOCD_GIT_REPO_USER_PASSWORD
|
||||||
|
```
|
||||||
|
|
||||||
|
## Установка и использование CLI Argo CD на локальной машине
|
||||||
|
https://argo-cd.readthedocs.io/en/stable/cli_installation
|
||||||
|
|
||||||
|
MacOS:
|
||||||
|
```bash
|
||||||
|
brew install argocd
|
||||||
|
```
|
||||||
|
|
||||||
|
Использование:
|
||||||
|
```bash
|
||||||
|
argocd login argocd.avroid.tech
|
||||||
|
```
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
rm -rf .creds .secrets
|
||||||
|
|
||||||
|
argocd_admin_password=$(vault kv get team-devops/services/ci-cd/ArgoCD/argocd.avroid.tech | grep service.user.admin.password | awk '{print $2}')
|
||||||
|
|
||||||
|
# shellcheck disable=SC2016
|
||||||
|
argocd_admin_password_hash=$(htpasswd -nbBC 10 "" "${argocd_admin_password}" | tr -d ':\n' | sed 's/$2y/$2a/')
|
||||||
|
|
||||||
|
argocd_ldap_binddn=$(vault kv get team-devops/accounts/ldap/service_accounts/svc_argocd | grep dn | awk '{print $2}')
|
||||||
|
argocd_ldap_binddn_password=$(vault kv get team-devops/accounts/ldap/service_accounts/svc_argocd | grep password | awk '{print $2}')
|
||||||
|
|
||||||
|
argocd_tg_token=$(vault kv get team-devops/accounts/bots/telegram/alertmanager | grep bot.avroid_alerts_bot.token | awk '{print $2}')
|
||||||
|
|
||||||
|
argocd_repo_user=$(vault kv get team-devops/accounts/ldap/service_accounts/svc_argocd | grep login | awk '{print $2}')
|
||||||
|
argocd_repo_password=$(vault kv get team-devops/accounts/ldap/service_accounts/svc_argocd | grep password | awk '{print $2}')
|
||||||
|
|
||||||
|
argocd_cert_key=$(vault kv get -field="certificate.key" team-devops/ssl/avroid.tech/wildcard.avroid.tech)
|
||||||
|
argocd_cert_data=$(vault kv get -field="certificate_fullchain.crt" team-devops/ssl/avroid.tech/wildcard.avroid.tech)
|
||||||
|
|
||||||
|
argocd_avp_role_id=$(vault kv get team-devops/services/ci-cd/ArgoCD/argocd.avroid.tech | grep service.argocd_vault_plugin.vault.env.AVP_ROLE_ID | awk '{print $2}')
|
||||||
|
argocd_avp_secret_id=$(vault kv get team-devops/services/ci-cd/ArgoCD/argocd.avroid.tech | grep service.argocd_vault_plugin.vault.env.AVP_SECRET_ID | awk '{print $2}')
|
||||||
|
|
||||||
|
cat > .creds << EOF
|
||||||
|
export ARGOCD_ADMIN_PASSWORD='${argocd_admin_password}'
|
||||||
|
export ARGOCD_ADMIN_PASSWORD_HASH='${argocd_admin_password_hash}'
|
||||||
|
export ARGOCD_GIT_REPO_USER='${argocd_repo_user}'
|
||||||
|
export ARGOCD_GIT_REPO_USER_PASSWORD='${argocd_repo_password}'
|
||||||
|
EOF
|
||||||
|
|
||||||
|
mkdir .secrets
|
||||||
|
|
||||||
|
cat > .secrets/argocd_key.pem << EOF
|
||||||
|
${argocd_cert_key}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > .secrets/argocd_cert.pem << EOF
|
||||||
|
${argocd_cert_data}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > .secrets/argocd-secret-path.yaml << EOF
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: argocd-secret
|
||||||
|
namespace: argocd
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
admin.password: ${argocd_admin_password_hash}
|
||||||
|
dex.ldap.bindDN: ${argocd_ldap_binddn}
|
||||||
|
dex.ldap.bindPW: ${argocd_ldap_binddn_password}
|
||||||
|
telegram-token: ${argocd_tg_token}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > .secrets/argocd-vault-plugin-configmap.yaml << EOF
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: cmp-plugin
|
||||||
|
namespace: argocd
|
||||||
|
data:
|
||||||
|
avp.yaml: |
|
||||||
|
apiVersion: argoproj.io/v1alpha1
|
||||||
|
kind: ConfigManagementPlugin
|
||||||
|
metadata:
|
||||||
|
name: argocd-vault-plugin
|
||||||
|
spec:
|
||||||
|
allowConcurrency: true
|
||||||
|
discover:
|
||||||
|
find:
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- "-c"
|
||||||
|
- "find . -name '*.yaml' | xargs -I {} grep \"<path\\\\|avp\\\\.kubernetes\\\\.io\" {} | grep ."
|
||||||
|
generate:
|
||||||
|
command:
|
||||||
|
- argocd-vault-plugin
|
||||||
|
- generate
|
||||||
|
- "."
|
||||||
|
lockRepo: false
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > .secrets/argocd-vault-plugin-secret.yaml << EOF
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: argocd-vault-plugin-credentials
|
||||||
|
namespace: argocd
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
AVP_AUTH_TYPE: approle
|
||||||
|
AVP_TYPE: vault
|
||||||
|
VAULT_ADDR: "https://vault.avroid.tech"
|
||||||
|
AVP_ROLE_ID: ${argocd_avp_role_id}
|
||||||
|
AVP_SECRET_ID: ${argocd_avp_secret_id}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "Run:"
|
||||||
|
echo ' 1. source .creds'
|
||||||
|
echo ' 2. kubectl -n argocd apply -f .secrets/argocd-vault-plugin-configmap.yaml'
|
||||||
|
echo ' 3. kubectl -n argocd apply -f .secrets/argocd-vault-plugin-secret.yaml'
|
||||||
@@ -0,0 +1,346 @@
|
|||||||
|
## Argo CD configuration
|
||||||
|
## Ref: https://github.com/argoproj/argo-cd
|
||||||
|
##
|
||||||
|
|
||||||
|
## Globally shared configuration
|
||||||
|
global:
|
||||||
|
# -- Default domain used by all components
|
||||||
|
## Used for ingresses, certificates, SSO, notifications, etc.
|
||||||
|
domain: argocd.avroid.tech
|
||||||
|
|
||||||
|
# Default image used by all components
|
||||||
|
image:
|
||||||
|
# -- If defined, a repository applied to all Argo CD deployments
|
||||||
|
repository: &global-image-repository "harbor.avroid.tech/quay-proxy/argoproj/argocd"
|
||||||
|
# -- Overrides the global Argo CD image tag whose default is the chart appVersion
|
||||||
|
tag: &global-image-tag "v2.14.2"
|
||||||
|
|
||||||
|
# -- Default node selector for all components
|
||||||
|
nodeSelector:
|
||||||
|
node-role.kubernetes.io/worker: ""
|
||||||
|
|
||||||
|
## Argo Configs
|
||||||
|
configs:
|
||||||
|
# General Argo CD configuration
|
||||||
|
## Ref: https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/argocd-cm.yaml
|
||||||
|
cm:
|
||||||
|
# Dex configuration
|
||||||
|
dex.config: |
|
||||||
|
connectors:
|
||||||
|
- type: ldap
|
||||||
|
name: avroid.tech
|
||||||
|
id: ldap_avroid_tech
|
||||||
|
config:
|
||||||
|
# Ldap server address
|
||||||
|
host: "ds-01.avroid.tech:636"
|
||||||
|
insecureNoSSL: false
|
||||||
|
insecureSkipVerify: true
|
||||||
|
# Variable name stores ldap bindDN in argocd-secret
|
||||||
|
bindDN: "$dex.ldap.bindDN"
|
||||||
|
# Variable name stores ldap bind password in argocd-secret
|
||||||
|
bindPW: "$dex.ldap.bindPW"
|
||||||
|
usernamePrompt: Username
|
||||||
|
# Ldap user serch attributes
|
||||||
|
userSearch:
|
||||||
|
baseDN: cn=users,cn=accounts,dc=avroid,dc=tech
|
||||||
|
filter: "(objectClass=inetorgperson)"
|
||||||
|
username: uid
|
||||||
|
idAttr: uid
|
||||||
|
emailAttr: mail
|
||||||
|
# Ldap group serch attributes
|
||||||
|
groupSearch:
|
||||||
|
baseDN: cn=groups,cn=accounts,dc=avroid,dc=tech
|
||||||
|
filter: "(|(objectClass=posixGroup)(objectClass=groupOfNames))"
|
||||||
|
userMatchers:
|
||||||
|
- userAttr: DN
|
||||||
|
groupAttr: member
|
||||||
|
# Represents group name.
|
||||||
|
nameAttr: cn
|
||||||
|
|
||||||
|
# Argo CD configuration parameters
|
||||||
|
## Ref: https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/argocd-cmd-params-cm.yaml
|
||||||
|
params:
|
||||||
|
## Server properties
|
||||||
|
# -- Run server without TLS
|
||||||
|
## NOTE: This value should be set when you generate params by other means as it changes ports used by ingress template.
|
||||||
|
server.insecure: true
|
||||||
|
|
||||||
|
# Argo CD RBAC policy configuration
|
||||||
|
## Ref: https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/rbac.md
|
||||||
|
rbac:
|
||||||
|
# -- The name of the default role which Argo CD will falls back to, when authorizing API requests (optional).
|
||||||
|
# If omitted or empty, users may be still be able to login, but will see no apps, projects, etc...
|
||||||
|
policy.default: 'role:deny'
|
||||||
|
|
||||||
|
# -- File containing user-defined policies and role definitions.
|
||||||
|
# @default -- `''` (See [values.yaml])
|
||||||
|
policy.csv: |
|
||||||
|
p, role:devops-admin, applications, *, */*, allow
|
||||||
|
p, role:devops-admin, applicationsets, *, */*, allow
|
||||||
|
p, role:devops-admin, clusters, *, *, allow
|
||||||
|
p, role:devops-admin, projects, *, *, allow
|
||||||
|
p, role:devops-admin, repositories, *, *, allow
|
||||||
|
p, role:devops-admin, accounts, *, *, allow
|
||||||
|
p, role:devops-admin, certificates, *, *, allow
|
||||||
|
p, role:devops-admin, gpgkeys, *, *, allow
|
||||||
|
p, role:devops-admin, logs, *, *, allow
|
||||||
|
p, role:devops-admin, exec, *, */*, allow
|
||||||
|
p, role:devops-admin, extensions, *, */*, allow
|
||||||
|
g, grp-admin-devops, role:devops-admin
|
||||||
|
# Policy rules are in the form:
|
||||||
|
# p, subject, resource, action, object, effect
|
||||||
|
# Role definitions and bindings are in the form:
|
||||||
|
# g, subject, inherited-subject
|
||||||
|
# policy.csv: |
|
||||||
|
# p, role:org-admin, applications, *, */*, allow
|
||||||
|
# p, role:org-admin, clusters, get, *, allow
|
||||||
|
# p, role:org-admin, repositories, *, *, allow
|
||||||
|
# p, role:org-admin, logs, get, *, allow
|
||||||
|
# p, role:org-admin, exec, create, */*, allow
|
||||||
|
# g, your-github-org:your-team, role:org-admin
|
||||||
|
|
||||||
|
# -- Repositories list to be used by applications
|
||||||
|
## Creates a secret for each key/value specified below to create repositories
|
||||||
|
## Note: the last example in the list would use a repository credential template, configured under "configs.repositoryCredentials".
|
||||||
|
repositories:
|
||||||
|
argocd-git-server:
|
||||||
|
url: https://git.avroid.tech/K8s/k8s-configs.git
|
||||||
|
name: prod_agrocd_configuration_repo
|
||||||
|
type: git
|
||||||
|
username: $git.repo.username
|
||||||
|
password: $git.repo.password
|
||||||
|
# istio-helm-repo:
|
||||||
|
# url: https://storage.googleapis.com/istio-prerelease/daily-build/master-latest-daily/charts
|
||||||
|
# name: istio.io
|
||||||
|
# type: helm
|
||||||
|
# private-helm-repo:
|
||||||
|
# url: https://my-private-chart-repo.internal
|
||||||
|
# name: private-repo
|
||||||
|
# type: helm
|
||||||
|
# password: my-password
|
||||||
|
# username: my-username
|
||||||
|
# private-repo:
|
||||||
|
# url: https://github.com/argoproj/private-repo
|
||||||
|
|
||||||
|
# Argo CD sensitive data
|
||||||
|
# Ref: https://argo-cd.readthedocs.io/en/stable/operator-manual/user-management/#sensitive-data-and-sso-client-secrets
|
||||||
|
secret:
|
||||||
|
# -- Bcrypt hashed admin password
|
||||||
|
## Argo expects the password in the secret to be bcrypt hashed. You can create this hash with
|
||||||
|
## `htpasswd -nbBC 10 "" $ARGO_PWD | tr -d ':\n' | sed 's/$2y/$2a/'`
|
||||||
|
argocdServerAdminPassword: $admin.password
|
||||||
|
|
||||||
|
## Dex image
|
||||||
|
image:
|
||||||
|
# -- Dex image repository
|
||||||
|
repository: harbor.avroid.tech/quay-proxy/dexidp/dex
|
||||||
|
|
||||||
|
## Redis-HA subchart replaces custom redis deployment when `redis-ha.enabled=true`
|
||||||
|
# Ref: https://github.com/DandyDeveloper/charts/blob/master/charts/redis-ha/values.yaml
|
||||||
|
redis-ha:
|
||||||
|
# -- Enables the Redis HA subchart and disables the custom Redis single node deployment
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
## Server
|
||||||
|
server:
|
||||||
|
## Argo CD server Horizontal Pod Autoscaler
|
||||||
|
autoscaling:
|
||||||
|
# -- Enable Horizontal Pod Autoscaler ([HPA]) for the Argo CD server
|
||||||
|
enabled: true
|
||||||
|
# -- Minimum number of replicas for the Argo CD server [HPA]
|
||||||
|
minReplicas: 2
|
||||||
|
|
||||||
|
# Argo CD server ingress configuration
|
||||||
|
ingress:
|
||||||
|
# -- Enable an ingress resource for the Argo CD server
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
# -- Additional ingress annotations
|
||||||
|
## Ref: https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#option-1-ssl-passthrough
|
||||||
|
annotations:
|
||||||
|
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
||||||
|
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
|
||||||
|
|
||||||
|
# -- Defines which ingress controller will implement the resource
|
||||||
|
ingressClassName: "nginx"
|
||||||
|
|
||||||
|
# -- Enable TLS configuration for the hostname defined at `server.ingress.hostname`
|
||||||
|
## TLS certificate will be retrieved from a TLS secret `argocd-server-tls`
|
||||||
|
## You can create this secret via `certificate` or `certificateSecret` option
|
||||||
|
tls: true
|
||||||
|
|
||||||
|
## Repo Server
|
||||||
|
repoServer:
|
||||||
|
## Repo server Horizontal Pod Autoscaler
|
||||||
|
autoscaling:
|
||||||
|
# -- Enable Horizontal Pod Autoscaler ([HPA]) for the repo server
|
||||||
|
enabled: true
|
||||||
|
# -- Minimum number of replicas for the repo server [HPA]
|
||||||
|
minReplicas: 2
|
||||||
|
|
||||||
|
# -- Additional containers to be added to the repo server pod
|
||||||
|
## Ref: https://argo-cd.readthedocs.io/en/stable/user-guide/config-management-plugins/
|
||||||
|
## Note: Supports use of custom Helm templates
|
||||||
|
extraContainers:
|
||||||
|
- name: avp
|
||||||
|
command: [/var/run/argocd/argocd-cmp-server]
|
||||||
|
image: "{{ .Values.global.image.repository }}:{{ .Values.global.image.tag }}"
|
||||||
|
securityContext:
|
||||||
|
runAsNonRoot: true
|
||||||
|
runAsUser: 999
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /var/run/argocd
|
||||||
|
name: var-files
|
||||||
|
- mountPath: /home/argocd/cmp-server/plugins
|
||||||
|
name: plugins
|
||||||
|
- mountPath: /tmp
|
||||||
|
name: tmp
|
||||||
|
# Register plugins into sidecar
|
||||||
|
- mountPath: /home/argocd/cmp-server/config/plugin.yaml
|
||||||
|
subPath: avp.yaml
|
||||||
|
name: cmp-plugin
|
||||||
|
# Important: Mount tools into $PATH
|
||||||
|
- name: custom-tools
|
||||||
|
subPath: argocd-vault-plugin
|
||||||
|
mountPath: /usr/local/bin/argocd-vault-plugin
|
||||||
|
|
||||||
|
# -- Init containers to add to the repo server pods
|
||||||
|
initContainers:
|
||||||
|
- name: download-tools
|
||||||
|
image: registry.access.redhat.com/ubi8
|
||||||
|
env:
|
||||||
|
- name: AVP_VERSION
|
||||||
|
value: 1.18.1
|
||||||
|
command: [sh, -c]
|
||||||
|
args:
|
||||||
|
- >-
|
||||||
|
curl -L https://nexus.avroid.tech/repository/devops-raw-proxy-gitea/argoproj-labs/argocd-vault-plugin/releases/download/v$(AVP_VERSION)/argocd-vault-plugin_$(AVP_VERSION)_linux_amd64 -o argocd-vault-plugin &&
|
||||||
|
chmod +x argocd-vault-plugin &&
|
||||||
|
mv argocd-vault-plugin /custom-tools/
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /custom-tools
|
||||||
|
name: custom-tools
|
||||||
|
|
||||||
|
# -- Additional volumes to the repo server pod
|
||||||
|
volumes:
|
||||||
|
- name: cmp-plugin
|
||||||
|
configMap:
|
||||||
|
name: cmp-plugin
|
||||||
|
- name: custom-tools
|
||||||
|
emptyDir: {}
|
||||||
|
|
||||||
|
# -- Automount API credentials for the Service Account into the pod.
|
||||||
|
automountServiceAccountToken: true
|
||||||
|
|
||||||
|
## ApplicationSet controller
|
||||||
|
applicationSet:
|
||||||
|
# -- The number of ApplicationSet controller pods to run
|
||||||
|
replicas: 2
|
||||||
|
|
||||||
|
|
||||||
|
# -- Configures notification services such as slack, email or custom webhook
|
||||||
|
# @default -- See [values.yaml]
|
||||||
|
## For more information: https://argo-cd.readthedocs.io/en/stable/operator-manual/notifications/services/overview/
|
||||||
|
notifiers:
|
||||||
|
service.telegram: |
|
||||||
|
token: $telegram-token
|
||||||
|
|
||||||
|
# -- Contains centrally managed global application subscriptions
|
||||||
|
## For more information: https://argo-cd.readthedocs.io/en/stable/operator-manual/notifications/subscriptions/
|
||||||
|
subscriptions:
|
||||||
|
- recipients:
|
||||||
|
# warning channel
|
||||||
|
- telegram:-1001685938630
|
||||||
|
triggers:
|
||||||
|
- on-sync-status-unknown
|
||||||
|
- app-deployed
|
||||||
|
- on-sync-succeeded
|
||||||
|
- recipients:
|
||||||
|
# critical channel
|
||||||
|
- telegram:-1001997104886
|
||||||
|
triggers:
|
||||||
|
- on-health-degraded
|
||||||
|
- on-sync-failed
|
||||||
|
|
||||||
|
# -- The notification template is used to generate the notification content
|
||||||
|
## For more information: https://argo-cd.readthedocs.io/en/stable/operator-manual/notifications/templates/
|
||||||
|
templates:
|
||||||
|
template.app-deployed: |
|
||||||
|
email:
|
||||||
|
subject: New version of an application {{.app.metadata.name}} is up and running.
|
||||||
|
message: |
|
||||||
|
{{if eq .serviceType "slack"}}:white_check_mark:{{end}} Application {{.app.metadata.name}} is now running new version of deployments manifests.
|
||||||
|
template.app-health-degraded: |
|
||||||
|
email:
|
||||||
|
subject: Application {{.app.metadata.name}} has degraded.
|
||||||
|
message: |
|
||||||
|
{{if eq .serviceType "slack"}}:exclamation:{{end}} Application {{.app.metadata.name}} has degraded.
|
||||||
|
Application details: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}.
|
||||||
|
template.app-sync-failed: |
|
||||||
|
email:
|
||||||
|
subject: Failed to sync application {{.app.metadata.name}}.
|
||||||
|
message: |
|
||||||
|
{{if eq .serviceType "slack"}}:exclamation:{{end}} The sync operation of application {{.app.metadata.name}} has failed at {{.app.status.operationState.finishedAt}} with the following error: {{.app.status.operationState.message}}
|
||||||
|
Sync operation details are available at: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true .
|
||||||
|
template.app-sync-running: |
|
||||||
|
email:
|
||||||
|
subject: Start syncing application {{.app.metadata.name}}.
|
||||||
|
message: |
|
||||||
|
The sync operation of application {{.app.metadata.name}} has started at {{.app.status.operationState.startedAt}}.
|
||||||
|
Sync operation details are available at: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true .
|
||||||
|
template.app-sync-status-unknown: |
|
||||||
|
email:
|
||||||
|
subject: Application {{.app.metadata.name}} sync status is 'Unknown'
|
||||||
|
message: |
|
||||||
|
{{if eq .serviceType "slack"}}:exclamation:{{end}} Application {{.app.metadata.name}} sync is 'Unknown'.
|
||||||
|
Application details: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}.
|
||||||
|
{{if ne .serviceType "slack"}}
|
||||||
|
{{range $c := .app.status.conditions}}
|
||||||
|
* {{$c.message}}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
template.app-sync-succeeded: |
|
||||||
|
email:
|
||||||
|
subject: Application {{.app.metadata.name}} has been successfully synced.
|
||||||
|
message: |
|
||||||
|
{{if eq .serviceType "slack"}}:white_check_mark:{{end}} Application {{.app.metadata.name}} has been successfully synced at {{.app.status.operationState.finishedAt}}.
|
||||||
|
Sync operation details are available at: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true .
|
||||||
|
|
||||||
|
# -- The trigger defines the condition when the notification should be sent
|
||||||
|
## For more information: https://argo-cd.readthedocs.io/en/stable/operator-manual/notifications/triggers/
|
||||||
|
triggers:
|
||||||
|
trigger.on-deployed: |
|
||||||
|
- description: Application is synced and healthy. Triggered once per commit.
|
||||||
|
oncePer: app.status.sync.revision
|
||||||
|
send:
|
||||||
|
- app-deployed
|
||||||
|
when: app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'
|
||||||
|
trigger.on-health-degraded: |
|
||||||
|
- description: Application has degraded
|
||||||
|
send:
|
||||||
|
- app-health-degraded
|
||||||
|
when: app.status.health.status == 'Degraded'
|
||||||
|
trigger.on-sync-failed: |
|
||||||
|
- description: Application syncing has failed
|
||||||
|
send:
|
||||||
|
- app-sync-failed
|
||||||
|
when: app.status.operationState.phase in ['Error', 'Failed']
|
||||||
|
trigger.on-sync-running: |
|
||||||
|
- description: Application is being synced
|
||||||
|
send:
|
||||||
|
- app-sync-running
|
||||||
|
when: app.status.operationState.phase in ['Running']
|
||||||
|
trigger.on-sync-status-unknown: |
|
||||||
|
- description: Application status is 'Unknown'
|
||||||
|
send:
|
||||||
|
- app-sync-status-unknown
|
||||||
|
when: app.status.sync.status == 'Unknown'
|
||||||
|
trigger.on-sync-succeeded: |
|
||||||
|
- description: Application syncing has succeeded
|
||||||
|
send:
|
||||||
|
- app-sync-succeeded
|
||||||
|
when: app.status.operationState.phase in ['Succeeded']
|
||||||
|
#
|
||||||
|
# For more information: https://argo-cd.readthedocs.io/en/stable/operator-manual/notifications/triggers/#default-triggers
|
||||||
|
# defaultTriggers: |
|
||||||
|
# - on-sync-status-unknown
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# Install Argo CD by [argocd-apps in argo-helm](https://github.com/argoproj/argo-helm/tree/main/charts/argocd-apps)
|
||||||
|
|
||||||
|
## Create from version
|
||||||
|
| Project | Version |
|
||||||
|
|---------------------|---------|
|
||||||
|
| ArgoCD Helm | 7.8.2 |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Common
|
||||||
|
Используется подход управления приложениями через корневое приложение:
|
||||||
|
|
||||||
|
[App of Apps Pattern](https://github.com/argoproj/argo-helm/tree/main/charts/argocd-apps)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Prepare install
|
||||||
|
Предварительно должен быть развёрнут и настроен ArgoCD через оператора `argo-cd` из состава `ArgoCD Helm` (каталог с инструкцией и переменными `argo-cd`)
|
||||||
|
|
||||||
|
|
||||||
|
## Install
|
||||||
|
Настраиваем для работы файл конфигурации kubectl для подключения к кластеру Kubernetes
|
||||||
|
|
||||||
|
И производим непосредственную установку корневого приложения ArgoCD:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm repo add argo https://argoproj.github.io/argo-helm
|
||||||
|
helm repo update
|
||||||
|
|
||||||
|
helm install -n argocd argocd-apps argo/argocd-apps -f values-override.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Upgrade/Changes
|
||||||
|
Обновление настроек и чарта делаем так:
|
||||||
|
|
||||||
|
В начале сравниваем содержимое `values-override.yaml` с исходным файлом `values.yaml`
|
||||||
|
(ссылка на исходную версию зафиксирована в заголовке `values-override.yaml`) через diff (IDE лучше).
|
||||||
|
Или с новой версией `values.yaml` в Helm-чарте.
|
||||||
|
Вносим необходимые правки, новые опции или добавляем секреты.
|
||||||
|
|
||||||
|
Затем применяем:
|
||||||
|
```bash
|
||||||
|
helm upgrade -n argocd argocd-apps argo/argocd-apps -f values-override.yaml
|
||||||
|
```
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# -- Deploy Argo CD Applications within this helm release
|
||||||
|
# @default -- `{}` (See [values.yaml])
|
||||||
|
## Ref: https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/
|
||||||
|
applications:
|
||||||
|
root-app:
|
||||||
|
namespace: argocd
|
||||||
|
additionalLabels: {}
|
||||||
|
additionalAnnotations: {}
|
||||||
|
finalizers:
|
||||||
|
- resources-finalizer.argocd.argoproj.io
|
||||||
|
project: default
|
||||||
|
source:
|
||||||
|
repoURL: https://git.avroid.tech/K8s/k8s-configs.git
|
||||||
|
targetRevision: master
|
||||||
|
path: clusters/k8s-avroid-office.prod.local/namespaces
|
||||||
|
directory:
|
||||||
|
recurse: true
|
||||||
|
exclude: '*'
|
||||||
|
include: 'argocd-apps-*.yaml'
|
||||||
|
destination:
|
||||||
|
server: https://kubernetes.default.svc
|
||||||
|
namespace: argocd
|
||||||
|
syncPolicy:
|
||||||
|
automated:
|
||||||
|
prune: true
|
||||||
|
selfHeal: true
|
||||||
|
syncOptions:
|
||||||
|
- CreateNamespace=true
|
||||||
|
- Validate=true
|
||||||
|
- PrunePropagationPolicy=foreground
|
||||||
|
- PruneLast=true
|
||||||
|
retry:
|
||||||
|
limit: 5
|
||||||
|
backoff:
|
||||||
|
duration: 5s
|
||||||
|
factor: 2
|
||||||
|
maxDuration: 3m
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: argocd
|
||||||
|
labels:
|
||||||
|
name: argocd
|
||||||
|
app.kubernetes.io/managed-by: manual
|
||||||
|
annotations:
|
||||||
|
scheduler.alpha.kubernetes.io/node-selector: node-role.kubernetes.io/worker=
|
||||||
Reference in New Issue
Block a user