Понимание Нестандартных Инструментов В Argo Cd



Понимание нестандартных инструментов в Argo CD

Через некоторое время после написания первая статья , где я ловко управлялся с 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. То есть в Argo CD Helm не развертывает релизы в кластер, а используется только для генерации манифестов.

Со своей стороны, 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

В переменной СРЕДА мы передаем имя среды, для которой нам нужно сгенерировать манифесты.

давайте применим его и посмотрим, что мы получим:

Понимание нестандартных инструментов в Argo CD

Приложение развернулось, отлично!


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




Ссылки по теме : Теги: #*nix #git #Системное администрирование #Kubernetes #DevOps #ci/cd #непрерывная доставка #непрерывная интеграция #gitops #argo #argocd #argocd #qbec #git-crypt
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.