Через некоторое время после написания первая статья , где я ловко управлялся с jsonnet и gitlab, я понял, что пайплайны — это конечно хорошо, но излишне сложно и неудобно.
В большинстве случаев требуется типичная задача: «сгенерировать YAML и поместить его в Kubernetes».
Собственно, именно с этим Argo CD и справляется замечательно.
Argo CD позволяет подключить репозиторий Git и отправить его состояние в Kubernetes. По умолчанию есть поддержка нескольких типов приложений: Kustomize, Helm Charts, Ksonnet, голый Jsonnet или просто каталоги с YAML/JSON-манифестами.
Такого набора будет достаточно большинству пользователей, но не всем.
Чтобы удовлетворить потребности каждого, Argo CD имеет возможность использовать специальные инструменты.
В первую очередь меня интересует возможность добавления поддержки qbec И git-крипта , которые подробно обсуждались в предыдущей статье.
Прежде чем приступить к настройке, вам сначала необходимо понять, как именно работает Argo CD. Для каждого добавленного приложения оно состоит из двух этапов:
- в этом — первоначальная подготовка перед развертыванием, здесь может быть что угодно: загрузка зависимостей, распаковка секретов и прочее.
- генерировать — непосредственно выполняя команду генерации манифеста, на выходе должен быть валидный YAML-поток, именно он и будет применен к кластеру.
Со своей стороны, Argo может обрабатывать Helm-хуки нативно, что позволяет не нарушать логику применения релизов.
КБЕК Qbec позволяет удобно описывать приложения с помощью jsonnet, а кроме того имеет возможность рендерить Helm-чарты, а поскольку Argo CD нормально обрабатывает Helm-хуки, использование этой возможности с Argo CD позволяет добиться еще более правильных результатов.
Чтобы добавить поддержку qbec в argocd, вам нужны две вещи:
- В конфигурации Argo CD должен быть определен ваш собственный плагин и команды для генерации манифестов.
- необходимые бинарные файлы должны быть доступны в образе argocd-репо-сервер .
(команда в этом не используется)# cm.yaml data: configManagementPlugins: | - name: qbec generate: command: [sh, -xc] args: ['qbec show "$ENVIRONMENT" -S --force:k8s-namespace "$ARGOCD_APP_NAMESPACE"']
$ kubectl -n argocd patch cm/argocd-cm -p "$(cat cm.yaml)"
Для добавления двоичных файлов предлагается собрать новый образ или используйте трюк с инициализацией контейнера :
# deploy.yaml
spec:
template:
spec:
# 1. Define an emptyDir volume which will hold the custom binaries
volumes:
- name: custom-tools
emptyDir: {}
# 2. Use an init container to download/copy custom binaries into the emptyDir
initContainers:
- name: download-tools
image: alpine:3.12
command: [sh, -c]
args:
- wget -qO- https://github.com/splunk/qbec/releases/download/v0.12.2/qbec-linux-amd64.tar.gz | tar -xvzf - -C /custom-tools/
volumeMounts:
- mountPath: /custom-tools
name: custom-tools
# 3. Volume mount the custom binary to the bin directory (overriding the existing version)
containers:
- name: argocd-repo-server
volumeMounts:
- mountPath: /usr/local/bin/qbec
name: custom-tools
subPath: qbec
- mountPath: /usr/local/bin/jsonnet-qbec
name: custom-tools
subPath: jsonnet-qbec
$ kubectl -n argocd patch deploy/argocd-repo-server -p "$(cat deploy.yaml)"
Теперь посмотрим, как будет выглядеть манифест нашего приложения:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: qbec-app
namespace: argocd
spec:
destination:
namespace: default
server: https://kubernetes.default.svc
project: default
source:
path: examples/test-app
targetRevision: fix-example
plugin:
env:
- name: ENVIRONMENT
value: dev
name: qbec
repoURL: https://github.com/kvaps/qbec
syncPolicy:
automated:
prune: true
В переменной СРЕДА мы передаем имя среды, для которой нам нужно сгенерировать манифесты.
давайте применим его и посмотрим, что мы получим:
Приложение развернулось, отлично!
git-крипта Git-crypt позволяет вам настроить прозрачное шифрование для вашего репозитория.
Это простой и безопасный способ хранить конфиденциальные данные непосредственно в git. Реализация git-crypt оказалась сложнее.
Теоретически мы могли бы сделать git-crypt unlock
на этапе инициализации нашего кастомного плагина, но это не очень удобно, так как не позволит использовать нативные методы развертывания.
Например, в случае с Helm и Jsonnet мы теряем гибкий GUI-интерфейс, позволяющий упростить настройку приложения (файлы значений и т. д.).
Вот почему я хотел распечатать репозиторий на более раннем этапе, во время клонирования.
Поскольку на данный момент Argo CD не предоставляет возможности описания каких-либо хуков для синхронизации репозитория, нам пришлось обходить это ограничение хитрым шелл-скриптом, заменяющим команду git: #!/bin/sh
$(dirname $0)/git.bin "$@"
ec=$?
[ "$1" = fetch ] && [ -d .
git-crypt ] || exit $ec
GNUPGHOME=/app/config/gpg/keys git-crypt unlock 2>/dev/null
exit $ec
Компакт-диск Арго выступает git fetch
каждый раз перед операцией развертывания.
Именно этой команде мы назначим выполнение git-crypt unlock
чтобы разблокировать репозиторий.
для тестов вы можете использовать мой образ докера в котором уже есть все необходимое: $ kubectl -n argocd set image deploy/argocd-repo-server argocd-repo-server=docker.io/kvaps/argocd-git-crypt:v1.7.3
Теперь нам нужно подумать о том, как Арго будет расшифровывать наши репозитории.
А именно, сгенерируйте для него ключ gpg: $ kubectl exec -ti deploy/argocd-repo-server -- bash
$ printf "%s\n" \
"%no-protection" \
"Key-Type: default" \
"Subkey-Type: default" \
"Name-Real: YOUR NAME" \
"Name-Email: YOUR [email protected]" \
"Expire-Date: 0" \
> genkey-batch
$ gpg --batch --gen-key genkey-batch
gpg: WARNING: unsafe ownership on homedir '/home/argocd/.
gnupg' gpg: keybox '/home/argocd/.
gnupg/pubring.kbx' created gpg: /home/argocd/.
gnupg/trustdb.gpg: trustdb created gpg: key 8CB8B24F50B4797D marked as ultimately trusted gpg: directory '/home/argocd/.
gnupg/openpgp-revocs.d' created gpg: revocation certificate stored as '/home/argocd/.
gnupg/openpgp-revocs.d/9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D.rev'
Давайте сохраним имя ключа 8CB8B24F50B4797D
для дальнейших шагов.
Ээкспортируйте сам ключ: $ gpg --list-keys
gpg: WARNING: unsafe ownership on homedir '/home/argocd/.
gnupg' /home/argocd/.
gnupg/pubring.kbx
-------------------------------
pub rsa3072 2020-09-04 [SC]
9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid [ultimate] YOUR NAME <YOUR [email protected]>
sub rsa3072 2020-09-04 [E]
$ gpg --armor --export-secret-keys 8CB8B24F50B4797D
И добавьте это как отдельный секрет: # argocd-gpg-keys-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: argocd-gpg-keys-secret
namespace: argocd
stringData:
8CB8B24F50B4797D: |-
-----BEGIN PGP PRIVATE KEY BLOCK-----
lQVYBF9Q8KUBDACuS4p0ctXoakPLqE99YLmdixfF/QIvXVIG5uBXClWhWMuo+D0c
ZfeyC5GvH7XPUKz1cLMqL6o/u9oHJVUmrvN/g2Mnm365nTGw1M56AfATS9IBp0HH
O/fbfiH6aMWmPrW8XIA0icoOAdP+bPcBqM4HRo4ssbRS9y/i
=yj11
-----END PGP PRIVATE KEY BLOCK-----
$ kubectl apply -f argocd-gpg-keys-secret.yaml
Нам остаётся только кинуть его в контейнер argocd-репо-сервер , для этого отредактируйте развертывание: $ kubectl -n argocd edit deploy/argocd-repo-server
И мы заменим существующий gpg-ключи громкость включена projected
, где указываем наш секрет: spec:
template:
spec:
volumes:
- name: gpg-keys
projected:
sources:
- secret:
name: argocd-gpg-keys-secret
- configMap:
name: argocd-gpg-keys-cm
Argo CD автоматически загружает ключи gpg из этого каталога при запуске контейнера, поэтому он также загружает наш закрытый ключ.
Давайте проверим: $ kubectl -n argocd exec -ti deploy/argocd-repo-server -- bash
$ GNUPGHOME=/app/config/gpg/keys gpg --list-secret-keys
gpg: WARNING: unsafe ownership on homedir '/app/config/gpg/keys'
/app/config/gpg/keys/pubring.kbx
--------------------------------
sec rsa2048 2020-09-05 [SC] [expires: 2021-03-04]
ED6285A3B1A50B6F1D9C955E5E8B1B16D47FFC28
uid [ultimate] Anon Ymous (ArgoCD key signing key) <[email protected]>
sec rsa3072 2020-09-03 [SC]
9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid [ultimate] YOUR NAME <YOUR [email protected]>
ssb rsa3072 2020-09-03 [E]
Отлично, ключ загружен! Теперь нам просто нужно добавить Argo CD в наш репозиторий в качестве соавтора, и он сможет автоматически расшифровывать его на лету.
Импортируйте ключ на локальный компьютер: $ GNUPGHOME=/app/config/gpg/keys gpg --armor --export 8CB8B24F50B4797D > 8CB8B24F50B4797D.pem
$ gpg --import 8CB8B24F50B4797D.pem
Давайте установим уровень доверия: $ gpg --edit-key 8CB8B24F50B4797D
trust
5
Давайте добавим argo в качестве соавтора в наш проект: $ git-crypt add-gpg-user 8CB8B24F50B4797D
Ссылки по теме :
- GitHub: репозиторий с измененным изображением
- Компакт-диск Argo: специальные инструменты
- Компакт-диск Argo: Плагины управления конфигурациями
- GitHub Gist: генерировать ключи gpg без пароля в неинтерактивном режиме
-
Ваш Веб-Сайт...`переполненный`?
19 Oct, 24 -
С Днем Вебмастера
19 Oct, 24 -
Интернет-Конкурентная Разведка
19 Oct, 24 -
Секрет Успеха Telltale Games
19 Oct, 24