
Pas një kohë pas shkrimit , ku manovroja me mjeshtëri me jsonnet dhe gitlab, kuptova se pipelinet janë për të vërtetë të mira, por tepër të komplikuara dhe të pakëndshme.
Në shumicën e rasteve kërkohet një detyrë standarde: "të gjenerosh YAML dhe ta vendosësh në Kubernetes". Në thelb, me çfarë Argo CD e bënë shkëlqyeshëm.
Argo CD lejon lidhjen e një repo Git dhe sinkronizimin e gjendjes së tij në Kubernetes. Siç është me porosi, ka mbështetje për disa lloje aplikacionesh: Kustomize, Helm charts, Ksonnet, jsonnet të zakonshëm ose thjesht drejtoritë me YAML/JSON manifesete.
Pjesës më të madhe të përdoruesve të këtij grupi do t'i mjaftojë kjo, por jo të gjithëve. Për të përmbushur nevojat e të gjithëve, në Argo CD ka mundësinë për të përdorur mjete të personalizuara.
Në radhë të parë është e rëndësishme mundësia për të shtuar mbështetje dhe , që ishin plotësisht të shqyrtuara në artikullin e mëparshëm.
Para se të fillojmë me konfigurimin, duhet së pari të kuptojmë si funksionon Argo CD në të vërtetë.
Për çdo aplikacion të shtuar, ai ka dy fase:
- init â pĂ«rgatitja fillestare para dislokimit, kĂ«tu mund tĂ« ketĂ« gjithçka: shkarkimi i varĂ«sive, shpaketa e sekreteve dhe mĂ« shumĂ«.
- gjenero â pĂ«rmbushja e komandĂ«s sĂ« gjenerimit tĂ« manifeseteve, rezultati duhet tĂ« jetĂ« njĂ« rrymĂ« valide YAML, kjo Ă«shtĂ« ajo qĂ« do tĂ« zbatohet nĂ« grup.
E veçantë është se Argo e aplikon këtë qasje për çdo tip aplikacionesh, duke përfshirë dhe Helm. Pra, në Argo CD, Helm nuk merret me dislokimin e lëshimeve në grup, por përdoret vetëm për gjenerimin e manifeseteve.
Nga ana e tij, Argo e trajton natyrshëm Helm-hooks, që lejon të mos shkelet logjika e aplikimit të lëshimeve.
QBEC
Qbec lejon përshkrimin e aplikacioneve në mënyrë të rehatshme me jsonnet, dhe për më tepër ka mundësinë për të gjeneruar Helm-charts, dhe pasi që Argo CD di të trajtojë mirë Helm-hooks, përdorimi i kësaj mundësie me Argo CD siguron rezultate 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 manifeseteve.
- binarët e nevojshëm duhet të jenë të aksesueshëm në imazhin 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 init nuk përdoret)
$ kubectl -n argocd patch cm/argocd-cm -p "$(cat cm.yaml)"Për të shtuar binarët, propozoni , ose të përdoret :
# 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 ta 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ë variablin ENVIRONMENT ne përcaktojmë emrin e mjedisit për të cilin duhet të realizohet gjenerimi i manifestëve.
do ta aplikojmë dhe të shohim çfarë kemi arritur:

aplikacioni u deploy-ua, shkëlqyer!
git-crypt
Git-crypt lejon konfigurot enkriptim të dukshëm të repositorit. Ky është një mënyrë e thjeshtë dhe e sigurt për të ruajtur të dhënat e konfidenciale direkt në git.
Me implementimin e git-crypt u tregua më e komplikuar.
Teoretikisht ne mund të ekzekutonim git-crypt unlock në fazën init të plugin-it tonë custom, por kjo nuk është shumë e përshtatshme, sepse nuk do të lejonte përdorimin e metodave natyrore të deploy-it. Për shembull, në rastin e Helm dhe Jsonnet, ne humbasim interfecën fleksibile GUI që lehtëson konfigurimin e aplikacionit (files me values dhe të tjera).
Prandaj, do të dëshironim të realizonim dekodimin e repositorit edhe në një fazë më të hershme, gjatë klonimit.
Deri më tani, Argo CD nuk ofron mundësi për përshkrimin e ndonjë hook-u për sinkronizimin e repositorit, kështu që duhej të kalonim këtë kufizim me një skript të mençur në shell, i cili zëvendëson komandën 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 ekzekuton git fetch çdo herë para operacionit të deploy-it. Pikërisht në këtë komandë do të bashkëngjisnim ekzekutimin git-crypt unlock për të zhbllokuar repositorin.
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 duhen menduar sesi Argo do të dekriptojë repositorit tanë. Konkretisht, të gjenerojmë ç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_YOT@example.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'Do ta ruajmë emrin e çelësit 8CB8B24F50B4797D për hapat e mëtejshëm. Eksportojmë çelësin në vetvete:
$ gpg --list-keys
gpg: WARNING: pronësia e pasigurt në homedir ' /home/argocd/.gnupg '
/home/argocd/.gnupg/pubring.kbx
-------------------------------
pub rsa3072 2020-09-04 [SC]
9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid [ultimate] EMRI JUAJ <EMRI_I_YUAJ@example.com>
sub rsa3072 2020-09-04 [E]
$ gpg --armor --export-secret-keys 8CB8B24F50B4797DDhe do ta shtojmë atë 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 ka mbetur është ta dërgojmë atë në kontejner argocd-repo-server, për këtë do të redaktojmë deployment:
$ kubectl -n argocd edit deploy/argocd-repo-serverDhe do të zëvendësojmë ekzistuesin gpg-keys volume me projected, ku do të specifikojmë 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 automatiksht ngarkon çelësat gpg nga kjo direktori gjatë fillimit të kontejnerit, kështu që do të ngarkojë edhe çelësin tonë privat.
ta verifikojmë:
$ kubectl -n argocd exec -ti deploy/argocd-repo-server -- bash
$ GNUPGHOME=/app/config/gpg/keys gpg --list-secret-keys
gpg: WARNING: pronësia e pasigurt në homedir '/app/config/gpg/keys'
/app/config/gpg/keys/pubring.kbx
--------------------------------
sec rsa2048 2020-09-05 [SC] [skadon: 2021-03-04]
ED6285A3B1A50B6F1D9C955E5E8B1B16D47FFC28
uid [ultimate] Anon Ymous (ArgoCD çelësi i nënshkrimit) <noreply@argoproj.io>
sec rsa3072 2020-09-03 [SC]
9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid [ultimate] EMRI JUAJ <EMRI_I_YUAJ@example.com>
ssb rsa3072 2020-09-03 [E]Shkëlqyeshëm, çelësi është ngarkuar! Tani mjafton të shtojmë Argo CD në repositorin tonë si një bashkëpunëtor dhe ai do të mund ta dekriptojë automatikisht atë në fluks.
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
besim
5Shtojmë argo si bashkëpunëtor në projektin tonë:
$ git-crypt add-gpg-user 8CB8B24F50B4797DLidhje në temë:
Burimi: habr.com
