Kemi një vështrim mbi Custom Tooling në Argo CD

Kemi një vështrim mbi Custom Tooling në Argo CD

Pas një kohë pas shkruajtjes artikullit të parë, 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 qbec dhe git-crypt, 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ë zgjidhet 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 të build-i një imazh të ri, ose të përdorni truku me kontejnerin init:

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

Në 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:

Kemi një vështrim mbi Custom Tooling në Argo CD

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

Argo 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 imazhin tim docker 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.3

Tani 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 8CB8B24F50B4797D

Dhe 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.yaml

E 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-server

Dhe 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-cm

Argo 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.pem

TĂ« vendosim nivelin e besimit:

$ gpg --edit-key 8CB8B24F50B4797D
trust
5

Shtojmë argo si bashkëpunëtor në projektin tonë:

$ git-crypt add-gpg-user 8CB8B24F50B4797D

Linke në temë:

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster