Razumijevanje prilagođenog alata u Argo CD-u

Razumijevanje prilagođenog alata u Argo CD-u

Neko vrijeme nakon pisanja prvi članak, gdje sam spretno upravljao jsonnetom i gitlabom, shvatio sam da su cjevovodi svakako dobri, ali nepotrebno komplicirani i nezgodni.

U većini slučajeva potreban je tipičan zadatak: "generiraj YAML i stavi ga u Kubernetes." Zapravo, to je ono što Argo CD radi izvanredno dobro.

Argo CD vam omogućuje povezivanje Git repozitorija i slanje njegovog stanja u Kubernetes. Prema zadanim postavkama postoji podrška za nekoliko vrsta aplikacija: Kustomize, Helm charts, Ksonnet, goli Jsonnet ili samo direktorije s YAML/JSON manifestima.

Ovaj set će biti dovoljan za većinu korisnika, ali ne za sve. Kako bi zadovoljio potrebe svih, Argo CD ima mogućnost korištenja prilagođenog alata.

Prije svega me zanima mogućnost dodavanja podrške qbec и git-kripta, o kojima smo u cijelosti govorili u prethodnom članku.

Prije nego započnete s konfiguracijom, prvo trebate razumjeti kako točno Argo CD radi.

Za svaku dodatu aplikaciju postoje dvije faze:

  • init — početna priprema prije postavljanja, svašta se može dogoditi ovdje: preuzimanje ovisnosti, raspakiranje tajni i više.
  • generiranje — izravno izvršavanje naredbe za generiranje manifesta, izlaz mora biti važeći YAML tok, to je upravo ono što će se primijeniti na klaster.

Ono što je izvanredno je da Argo primjenjuje ovaj pristup na bilo koju vrstu aplikacije, uključujući Helm. To jest, u Argo CD Helm ne implementira izdanja u klaster, već se koristi samo za generiranje manifesta.

Sa svoje strane, Argo može nativno obraditi Helm udice, što mu omogućuje da ne krši logiku primjene izdanja.

QBEC

Qbec vam omogućuje prikladno opisivanje aplikacija pomoću jsonneta, a osim toga ima mogućnost renderiranja Helm grafikona, a budući da Argo CD može normalno obrađivati ​​Helm hookove, korištenje ove značajke s Argo CD-om omogućuje vam postizanje još ispravnijih rezultata.

Za dodavanje podrške za qbec u argocd potrebne su vam dvije stvari:

  • U Argo CD konfiguraciji, vaš prilagođeni dodatak i naredbe za generiranje manifesta moraju biti definirani.
  • potrebne binarne datoteke moraju biti dostupne na slici argocd-repo-poslužitelj.

Prvi zadatak odlučuje se prilično jednostavno:

# cm.yaml
data:
  configManagementPlugins: |
    - name: qbec
      generate:
        command: [sh, -xc]
        args: ['qbec show "$ENVIRONMENT" -S --force:k8s-namespace "$ARGOCD_APP_NAMESPACE"']

(tim init ne koristi se)

$ kubectl -n argocd patch cm/argocd-cm -p "$(cat cm.yaml)"

Predlaže se dodavanje binarnih datoteka prikupiti novu sliku, ili koristiti init kontejner trik:

# 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)"

Sada da vidimo kako će izgledati manifest naše aplikacije:

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: true

U varijabli OKOLIŠ prosljeđujemo ime okruženja za koje trebamo generirati manifeste.

primijenimo ga i vidimo što ćemo dobiti:

Razumijevanje prilagođenog alata u Argo CD-u

Aplikacija je implementirana, super!

git-kripta

Git-crypt vam omogućuje postavljanje transparentne enkripcije za vaše spremište. To je jednostavan i siguran način za pohranu osjetljivih podataka izravno u git.

Pokazalo se da je implementacija git-crypta teža.

Teoretski bismo mogli git-crypt unlock u početnoj fazi našeg prilagođenog dodatka, ali to nije baš zgodno jer ne bi dopuštalo korištenje izvornih metoda implementacije. Na primjer, u slučaju Helma i Jsonneta, gubimo fleksibilno GUI sučelje koje nam omogućuje pojednostavljenje konfiguracije aplikacije (datoteke vrijednosti, itd.).

Zbog toga sam želio ispisati repozitorij u ranijoj fazi, tijekom kloniranja.

Budući da u ovom trenutku Argo CD ne pruža mogućnost opisivanja bilo kakvih kuka za sinkronizaciju repozitorija, morali smo zaobići ovo ograničenje lukavom skriptom ljuske koja zamjenjuje naredbu 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

Nastupa Argo CD git fetch svaki put prije operacije postavljanja. To je naredba kojoj ćemo dodijeliti izvršenje git-crypt unlock za otključavanje spremišta.

za testove koje možete koristiti moja slika dokera koja već ima sve što vam treba:

$ kubectl -n argocd set image deploy/argocd-repo-server argocd-repo-server=docker.io/kvaps/argocd-git-crypt:v1.7.3

Sada moramo razmisliti o tome kako će Argo dešifrirati naša spremišta. Naime, generirajte gpg ključ za to:

$ kubectl exec -ti deploy/argocd-repo-server -- bash

$ printf "%sn" 
    "%no-protection" 
    "Key-Type: default" 
    "Subkey-Type: default" 
    "Name-Real: YOUR NAME" 
    "Name-Email: YOUR 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'

Sačuvajmo naziv ključa 8CB8B24F50B4797D za daljnje korake. Izvezite sam ključ:

$ 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@example.com>
sub   rsa3072 2020-09-04 [E]

$ gpg --armor --export-secret-keys 8CB8B24F50B4797D

I dodajte to kao zasebnu tajnu:

# 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

Jedino što nam preostaje je baciti ga u kontejner argocd-repo-poslužitelj, da biste to učinili, uredite implementaciju:

$ kubectl -n argocd edit deploy/argocd-repo-server

I zamijenit ćemo postojeći gpg-ključevi glasnoća uključena projected, gdje navodimo našu tajnu:

   spec:
     template:
       spec:
         volumes:
         - name: gpg-keys
           projected:
             defaultMode: 420
             sources:
             - secret:
                 name: argocd-gpg-keys-secret
             - configMap:
                 name: argocd-gpg-keys-cm

Argo CD automatski učitava gpg ključeve iz ovog direktorija kada se spremnik pokrene, tako da će također učitati naš privatni ključ.

provjerimo:

$ 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) <noreply@argoproj.io>

sec   rsa3072 2020-09-03 [SC]
      9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid           [ultimate] YOUR NAME <YOUR EMAIL@example.com>
ssb   rsa3072 2020-09-03 [E]

Odlično, ključ je učitan! Sada samo trebamo dodati Argo CD u naš repozitorij kao suradnika i on će ga moći automatski dešifrirati u hodu.

Uvezite ključ na lokalno računalo:

$ gpg --armor --export-secret 8CB8B24F50B4797D > 8CB8B24F50B4797D.pem
$ gpg --import 8CB8B24F50B4797D.pem

Postavimo razinu povjerenja:

$ gpg --edit-key 8CB8B24F50B4797D
trust
5

Dodajmo argo kao suradnika našem projektu:

$ git-crypt add-gpg-user 8CB8B24F50B4797D

Srodni linkovi:

Izvor: www.habr.com

Kupite pouzdan hosting za stranice s DDoS zaštitom, VPS VDS poslužiteljima 🔥 Kupite pouzdan web hosting sa DDoS zaštitom, VPS VDS servere | ProHoster