
Pas një kohë pas shkruajtjes , ku unë menaxhoja me mjeshtëri jsonnet dhe gitlab, kuptova që pipeline-t janë të mira, por shumë të komplikuara dhe të pakëndshme.
Në shumicën e rasteve, kërkohet një detyrë standarde: "të gjenerosh YAML dhe ta vendosësh atë në Kubernetes". Në fakt, kjo është ajo që Argo CD bën shkëlqyeshëm.
Argo CD lejon lidhjen e një depo Git dhe sinkronizimin e gjendjes së saj me Kubernetes. Nga default, ka mbështetje për disa lloje aplikacionesh: Kustomize, Helm charts, Ksonnet, Jsonnet e pastër ose direktori me YAML/JSON manifes.
Për shumicën e përdoruesve të këtij seti, kjo është më se e mjaftueshme, por jo për të gjithë. Për të përmbushur nevojat e të gjithëve dhe secilit, Argo CD ofron mundësinë për të përdorur mjete të personalizuara.
Fillimisht, më intereson mundësia për të shtuar mbështetje për dhe , të cilat u shqyrtuan plotësisht në artikullin e mëparshëm.
Para se të fillojmë konfigurimin, duhet së pari të kuptojmë se si funksionon Argo CD.
Për çdo aplikacion të shtuar, ka dy faza:
- procesi â pĂ«rgatitja fillestare para se tĂ« bĂ«het deploy, kĂ«tu mund tĂ« ketĂ« gjithçka: shkarkimi i varĂ«sive, shkarkimi i sekreteve dhe tĂ« tjera.
- gjenero â ekzekutimi direkt i komandĂ«s pĂ«r gjenerimin e manifestĂ«ve, rezultati duhet tĂ« jetĂ« njĂ« YAML stream i vlefshĂ«m, ky Ă«shtĂ« saktĂ«sisht ajo qĂ« do tĂ« aplikohet nĂ« klaster.
Interesant është se Argo aplikon këtë qasje për çdo lloj aplikacioni, duke përfshirë helm. Pra, në Argo CD, Helm nuk merret me deploy-n e lirimeve në klaster, por përdoret vetëm për gjenerimin e manifestëve.
Nga ana e tij, Argo është në gjendje të trajtojë native Helm hooks, gjë që lejon që logjika e aplikimit të lirimeve të mos prishët.
QBEC
Qbec lejon përshkrimin e aplikacioneve në mënyrë të përshtatshme duke përdorur jsonnet, dhe përveç kësaj ka mundësinë për të renderuar Helm charts, dhe duke qenë se Argo CD është në gjendje të trajtojë nelë Helm hooks, përdorimi i kësaj mundësie me Argo CD lejon arritjen e rezultateve edhe më të sakta.
Për të shtuar mbështetje për qbec në argocd nevojiten dy gjëra:
- në konfigurimin e Argo CD duhet të përcaktohet plugin-i juaj personal dhe komandat për gjenerimin e manifestëve.
- binaret e nevojshme duhet të jenë të qasshme në imazh argocd-repo-server.
Detyra e parë mjaft thjeshtë:
# cm.yaml
data:
configManagementPlugins: |
- name: qbec
generate:
command: [sh, -xc]
args: ['qbec show "$ENVIRONMENT" -S --force:k8s-namespace "$ARGOCD_APP_NAMESPACE"'](komanda procesi nuk përdoret)
$ kubectl -n argocd patch cm/argocd-cm -p "$(cat cm.yaml)"Për të shtuar binaret, rekomandohet , ose të përdorni :
# 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)"Tani do të shikojmë si do të duket manifesti i aplikacionit tonë:
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: qbec-app
plugin:
env:
- name: ENVIRONMENT
value: default
name: qbec
repoURL: https://github.com/kvaps/argocd-play
syncPolicy:
automated:
prune: trueNë variablën ENVIRONMENT ne po kalojmë emrin e mjedisit për të cilin duhet të kryhen gjenerimet e manifestit.
të aplikojmë dhe të shohim çfarë kemi arritur:

aplikacioni u deploy duke e bërë, shkëlqyeshëm!
git-crypt
Git-crypt lejon konfigurimin e enkriptimit transparent të repository-it. Ky është një mënyrë e thjeshtë dhe e sigurt për të ruajtur të dhënat e ndjeshme drejtpërdrejt në git.
Me implementimin e git-crypt rezultoi më e vështirë.
Teorikisht, ne do të mund të ekzekutonim git-crypt unlock në fazën init të plugin-it tonë personal, por kjo nuk është shumë praktike, pasi nuk do të mund të përdorim metodat native të deploy-it. Për shembull, në rastin e Helm dhe Jsonnet, ne humbasim ndërfaqen GUI fleksibël që lejon thjeshtimin e konfigurimit të aplikacionit (files të values dhe të tjera).
Pikërisht për këtë dëshiroja të kryej printimin e depozitos edhe në një fazë më të hershme, gjatë klonimit.
Pasi momentalisht Argo CD nuk ofron mundësinë për të përshkruar ndonjë goditje për sinkronizimin e depozitos, duhej të kalojmë këtë kufizim me një skript të mençur shell, i cili zëvendëson urdhrin 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 $ecArgo CD kryen git fetch çdo herë para operacionit të depozitimit. Pikërisht në këtë komandë do të varim ekzekutimin git-crypt unlock për të çblokuar depozitën.
për teste mund të përdorni në të cilin tashmë ka gjithçka të nevojshme:
$ kubectl -n argocd set image deploy/argocd-repo-server argocd-repo-server=docker.io/kvaps/argocd-git-crypt:v1.7.3Tani na nevojitet të mendojmë se si Argo do të dekriptojë depozitat tona. Në veçanti, për të gjeneruar çelësin gpg për të:
$ kubectl exec -ti deploy/argocd-repo-server -- bash
$ printf "%sn"
"%no-protection"
"Key-Type: default"
"Subkey-Type: default"
"Name-Real: EMRI YT"
"Name-Email: EMAIL@YOURDOMAIN.com"
"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'Le ta bëjmë emrin e çelësit 8CB8B24F50B4797D për hapat e mëtejshëm. Eksportojmë vetë çelësin:
$ 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] EMRI YT <EMAIL@YOURDOMAIN.com>
sub rsa3072 2020-09-04 [E]
$ gpg --armor --export-secret-keys 8CB8B24F50B4797DDhe do ta shtojmë si një sekret të veçantë:
# 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.yamlE vetmja gjë që na mbetet është ta kalojmë atë në konteiner argocd-repo-server, për këtë do ta redaktojmë me deploymentin:
$ kubectl -n argocd edit deploy/argocd-repo-serverDhe do ta zëvendësojmë ekzistuesin gpg-keys volumin me projected, ku do të tregojmë sekretin tonë:
spec:
template:
spec:
volumes:
- name: gpg-keys
projected:
defaultMode: 420
sources:
- secret:
name: argocd-gpg-keys-secret
- configMap:
name: argocd-gpg-keys-cmArgo CD automatikisht ngarkon çelësat gpg nga kjo direktor në fillim të kontejnerit, duke e ndihmuar të ngarkojë edhe çelësin tonë privat.
le të kontrollojmë:
$ 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)
sec rsa3072 2020-09-03 [SC]
9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid [ultimate] EMRI YT
ssb rsa3072 2020-09-03 [E]Shkëlqyesh, çelësi është ngarkuar! Tani mjafton të shtojmë Argo CD në depo tonë si një bashkëpunëtor dhe do të mund të dekriptojë automatikisht në kohë reale.
Të importojmë çelësin në kompjuterin lokal:
$ gpg --armor --export-secret 8CB8B24F50B4797D > 8CB8B24F50B4797D.pem
$ gpg --import 8CB8B24F50B4797D.pemTĂ« vendosim nivelin e besimit:
$ gpg --edit-key 8CB8B24F50B4797D
trust
5Shtojmë argo si bashkëpunëtor në projektin tonë:
$ git-crypt add-gpg-user 8CB8B24F50B4797DLinke në temë:
Burimi: habr.com
