
Efter en tid efter att jag skrev , dÀr jag smidigt hanterade jsonnet och GitLab, insÄg jag att pipelines visserligen Àr bra, men det Àr onödigt komplicerat och ohandigt.
I de flesta fall behövs en typisk uppgift: "generera YAML och lÀgga den i Kubernetes". Det Àr just vad Argo CD hanterar pÄ ett utmÀrkt sÀtt.
Argo CD lÄter dig ansluta ett Git-repo och synkronisera dess tillstÄnd med Kubernetes. Som standard stöder den flera typer av applikationer: Kustomize, Helm-diagram, Ksonnet, ren Jsonnet eller bara kataloger med YAML/JSON-manifester.
För de flesta anvÀndare av detta paket Àr det tillrÀckligt, men inte för alla. För att tillgodose behoven hos alla och envar finns det möjlighet att anvÀnda anpassade verktyg i Argo CD.
Det som intresserar först och frÀmst Àr möjligheten att lÀgga till stöd för och , som fullstÀndigt har diskuterats i den tidigare artikeln.
Innan vi gÄr vidare till konfigurationen mÄste vi först förstÄ hur Argo CD fungerar.
För varje tillagd applikation har den tvÄ faser:
- init â inledande förberedelse före distribueringsfasen, hĂ€r kan det vara allt möjligt: nedladdning av beroenden, avpackning av hemligheter och sĂ„ vidare.
- generate â utförande av kommandot för att generera manifester, utdata mĂ„ste vara en giltig YAML-ström, vilket Ă€r just det som kommer att tillĂ€mpas i klustret.
Det som Àr vÀrt att notera Àr att Argo tillÀmpar detta tillvÀgagÄngssÀtt för alla typer av applikationer, inklusive Helm. SÄ i Argo CD hanterar Helm inte distribution av versioner i klustret, utan anvÀnds bara för att generera manifester.
à sin sida kan Argo hantera Helm-hooks nativt, vilket gör att logiken för tillÀmpning av versioner inte störs.
QBEC
Qbec gör det möjligt att enkelt beskriva applikationer med hjÀlp av jsonnet och har dessutom möjlighet att rendera Helm-diagram. Eftersom Argo CD kan hantera Helm-hooks korrekt, gör anvÀndningen av denna funktion tillsammans med Argo CD att man kan uppnÄ Ànnu mer korrekta resultat.
För att lÀgga till stöd för qbec i argocd behövs tvÄ saker:
- i Argo CDs konfiguration mÄste din anpassade plugin och kommandon för att generera manifester definieras.
- de nödvÀndiga binÀrerna mÄste finnas tillgÀngliga i bilden argocd-repo-server.
Det första problemet ganska enkelt:
# cm.yaml
data:
configManagementPlugins: |
- name: qbec
generate:
command: [sh, -xc]
args: ['qbec show "$ENVIRONMENT" -S --force:k8s-namespace "$ARGOCD_APP_NAMESPACE"'](kommandot init anvÀnds inte)
$ kubectl -n argocd patch cm/argocd-cm -p "$(cat cm.yaml)"För att lÀgga till binÀrerna föreslÄs det , eller anvÀnd :
# 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)"LÄt oss nu se hur manifestet för vÄr applikation kommer att se ut:
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: trueI variabeln ENVIRONMENT överlÀmnar vi namnet pÄ miljön för vilken vi behöver utföra generationen av manifest.
LÄt oss tillÀmpa och se vad vi har fÄtt:

applikationen har deployats, utmÀrkt!
git-crypt
Git-crypt gör det möjligt att konfigurera transparent kryptering av repository. Det Àr ett enkelt och sÀkert sÀtt att lagra konfidentiella uppgifter direkt i git.
Implementeringen av git-crypt har visat sig vara mer komplicerad.
Teoretiskt skulle vi kunna köra git-crypt unlock under init-fasen av vÄr anpassade plugin, men det Àr inte sÄ bekvÀmt, eftersom det inte skulle tillÄta oss att anvÀnda de inhemska deploymetoderna. Till exempel för Helm och Jsonnet förlorar vi det flexibla GUI-grÀnssnittet som förenklar konfigurationen av applikationen (values-filer och sÄ vidare).
Det Àr dÀrför vi ville utföra avvecklingen av repositoryn Ànnu tidigare, vid kloning.
Eftersom Argo CD för nÀrvarande inte erbjuder möjligheter att beskriva nÄgra hooks för synkronisering av repository, var vi tvungna att kringgÄ denna begrÀnsning med ett smart shell-script-wrapper som ersÀtter git-kommandot:
#!/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 kör git fetch varje gÄng före deploy-operationen. Det Àr pÄ detta kommando vi kommer att hÀnga utförandet git-crypt unlock för att lÄsa upp repositoryn.
För tester kan du anvÀnda dÀr allt nödvÀndigt redan finns:
$ kubectl -n argocd set image deploy/argocd-repo-server argocd-repo-server=docker.io/kvaps/argocd-git-crypt:v1.7.3Nu mÄste vi tÀnka pÄ hur Argo kommer att avkoda vÄra repository. Det handlar om att generera en gpg-nyckel för den:
$ kubectl exec -ti deploy/argocd-repo-server -- bash
$ printf "%sn"
"%no-protection"
"Key-Type: default"
"Subkey-Type: default"
"Name-Real: DITT NAMN"
"Name-Email: DIN EMAIL@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'LÄt oss spara namnet pÄ nyckeln 8CB8B24F50B4797D för vidare steg. Vi exporterar sjÀlva nyckeln:
$ gpg --list-keys
gpg: VARNING: osÀkert Àgarskap av homedir '\/home\/argocd\/.gnupg'
\/home\/argocd\/.gnupg\/pubring.kbx
-------------------------------
pub rsa3072 2020-09-04 [SC]
9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid [ultimate] DITT NAMN <DIN EPOST@example.com>
sub rsa3072 2020-09-04 [E]
$ gpg --armor --export-secret-keys 8CB8B24F50B4797DOch vi lÀgger till den som en separat hemlighet:
# 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.yamlDet enda som ÄterstÄr Àr att föra in den i behÄllaren argocd-repo-server, för detta redigerar vi deployment:
$ kubectl -n argocd edit deploy\/argocd-repo-serverOch vi ersÀtter den befintliga gpg-keys volymen med projected, dÀr vi anger vÄr hemlighet:
spec:
template:
spec:
volumes:
- name: gpg-keys
projected:
defaultMode: 420
sources:
- secret:
name: argocd-gpg-keys-secret
- configMap:
name: argocd-gpg-keys-cmArgo CD laddar automatiskt gpg-nycklar frÄn denna katalog vid start av behÄllaren, sÄ den kommer att ladda Àven vÄr privata nyckel.
LÄt oss kontrollera:
$ kubectl -n argocd exec -ti deploy\/argocd-repo-server -- bash
$ GNUPGHOME=\/app\/config\/gpg\/keys gpg --list-secret-keys
gpg: VARNING: osÀkert Àgarskap av homedir '\/app\/config\/gpg\/keys'
\/app\/config\/gpg\/keys\/pubring.kbx
--------------------------------
sec rsa2048 2020-09-05 [SC] [utgÄr: 2021-03-04]
ED6285A3B1A50B6F1D9C955E5E8B1B16D47FFC28
uid [ultimate] Anon Ymous (ArgoCD nyckelsigneringsnyckel) <noreply@argoproj.io>
sec rsa3072 2020-09-03 [SC]
9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid [ultimate] DITT NAMN <DIN EPOST@example.com>
ssb rsa3072 2020-09-03 [E]UtmÀrkt, nyckeln har laddats! Nu rÀcker det med att lÀgga till Argo CD som medarbetare i vÄrt repo sÄ kan den automatiskt dekryptera den i realtid.
Vi importerar nyckeln till den lokala datorn:
$ gpg --armor --export-secret 8CB8B24F50B4797D > 8CB8B24F50B4797D.pem
$ gpg --import 8CB8B24F50B4797D.pemVi stÀller in tillitsnivÄn:
$ gpg --edit-key 8CB8B24F50B4797D
trust
5Vi lÀgger till argo som medarbetare i vÄrt projekt:
$ git-crypt add-gpg-user 8CB8B24F50B4797DRelaterade lÀnkar:
KĂ€lla: habr.com
