Zamýšľame nad Custom Tooling v Argo CD

Zamýšľame nad Custom Tooling v Argo CD

Po určitej dobe po napísaní prvého článku, kde som zručne pracoval s jsonnet a GitLabom, som pochopil, že pipeline sú síce dobré, ale príliš zložité a nevhodné.

Väčšinou sa vyžaduje typová úloha: "vygenerovať YAML a umiestniť ho do Kubernetes". S tým si Argo CD skvele poradí.

Argo CD umožňuje pripojiť Git-repozitár a synchronizovať jeho stav v Kubernetes. Predvolene existuje podpora pre niekoľko typov aplikácií: Kustomize, Helm grafy, Ksonnet, holé Jsonnet či jednoducho adresáre s YAML/JSON manifestmi.

Väčšine používateľov tohto balíka by to malo stačiť, ale nie všetkým. Aby sme uspokojili potreby každého, Argo CD ponúka možnosť používať custom tooling.

Predovšetkým ma zaujíma možnosť pridania podpory qbec a git-crypt, ktoré boli podrobne skontrolované v predchádzajúcom článku.

Predtým, ako sa pustíme do konfigurácie, musíme sa najprv oboznámiť s tým, ako presne Argo CD funguje.

Pre každú pridanú aplikáciu má dve fázy:

  • init — počiatočné prípravy pred nasadením, tu môže byť čokoľvek: sťahovanie závislostí, rozbalenie tajomstiev a iné.
  • generate — vykonanie príkazu generovania manifestov, výstup by mal byť platným YAML streamom, to je presne to, čo bude aplikované v klastri.

Zaujímavé je, že Argo používa tento prístup pre každý typ aplikácií, vrátane Helm. To znamená, že v Argo CD sa Helm nezapája do nasadzovania vydaní v klastri, ale používa sa iba na generovanie manifestov.

Z jeho strany Argo dokáže natívne spracovávať Helm hooky, čo umožňuje nenarušiť logiku aplikovania vydaní.

QBEC

Qbec umožňuje pohodlne popisovať aplikácie pomocou jsonnet, a okrem toho má možnosť renderovať Helm grafy, a pretože Argo CD dokáže normálne spracovávať Helm hooky, využitie tejto možnosti s Argo CD umožňuje dosiahnuť ešte presnejšie výsledky.

Aby ste pridali podporu qbec v argocd, potrebujete dve veci:

  • vo konfigurácii Argo CD by mal byť definovaný váš custom plugin a príkazy na generovanie manifestov.
  • potrebné binárky by mali byť dostupné v obraze argocd-repo-server.

Prvá úloha sa rieši dosť jednoducho:

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

(príkaz init sa nepoužíva)

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

Na pridanie binárok sa navrhuje zhromaždiť nový obraz, alebo použiť trik s init-kontajnerom:

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

Teraz sa pozrieme, ako bude vyzerať manifest našej aplikácie:

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

V premennej ENVIRONMENT posielame názov prostredia, pre ktoré je potrebné vykonať generáciu manifestov.

aplikujme a pozrime sa, čo sme vytvorili:

Zamýšľame nad Custom Tooling v Argo CD

aplikácia bola nasadená, skvelo!

git-crypt

Git-crypt umožňuje nastaviť transparentné šifrovanie repozitára. Je to jednoduchý a bezpečný spôsob, ako uchovávať dôverné údaje priamo v gite.

S implementáciou git-crypt to bolo zložitejšie.

Teoreticky by sme mohli vykonať git-crypt unlock na init-fáze nášho custom-plugina, ale to nie je veľmi pohodlné, pretože by to neumožnilo používať natívne metódy nasadenia. Napríklad v prípade Helm a Jsonnet strácame flexibilné GUI, ktoré uľahčuje nastavenie aplikácie (values-súbory a iné).

Práve preto sme chceli vykonávať odomykanie repozitára ešte v skoršej fáze, pri klonovaní.

Keďže Argo CD momentálne neposkytuje možnosť pre opis akýchkoľvek hookov na synchronizáciu repozitára, museli sme obísť toto obmedzenie šikovným shell skriptom, ktorý nahrádza príkaz 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

Argo CD vykonáva git fetch každý raz pred operáciou nasadenia. Práve na tento príkaz pripojíme vykonanie git-crypt unlock na odomykanie repozitára.

na testy môžete použiť môj docker-obraz v ktorom už je všetko potrebné:

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

Teraz musíme premýšľať o tom, ako Argo dekryptuje naše repozitáre. A to konkrétne vygenerovať gpg-kľúč pre neho:

$ 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'

Zachováme názov kľúča 8CB8B24F50B4797D pre ďalšie kroky. Exportujeme samotný kľúč:

$ 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] VAŠE MENO 
sub   rsa3072 2020-09-04 [E]

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

A pridáme ho ako samostatné tajomstvo:

# 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

Jediné, čo nám zostáva, je prehodiť ho do kontajnera argocd-repo-server, na to upravíme deployment:

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

A nahradíme existujúci gpg-keys objem s projektovaným, kde uvedieme naše tajomstvo:

   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 automaticky načíta gpg kľúče z tohto adresára pri spustení kontajnera, týmto spôsobom načíta aj náš súkromný kľúč.

Overíme:

$ 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] VAŠE MENO 
ssb   rsa3072 2020-09-03 [E]

Skvele, kľúč bol načítaný! Teraz stačí pridať Argo CD do nášho repozitára ako spolupracovníka a automaticky ho bude môcť dešifrovať za behu.

Importujeme kľúč na lokálny počítač:

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

Nastavíme úroveň dôvery:

$ gpg --edit-key 8CB8B24F50B4797D
trust
5

Pridáme argo ako spolupracovníka do nášho projektu:

$ git-crypt add-gpg-user 8CB8B24F50B4797D

Odkazy k téme:

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster