Po merremi me Custom Tooling në Argo CD

Po merremi me Custom Tooling në Argo CD

Pas një kohë pas shkrimit të artikullit të parë, 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 qbec dhe git-crypt, 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ë 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 init nuk përdoret)

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

Për të shtuar binarët, propozoni të ndërtohet një imazh të ri, ose të përdoret truku me init-konteinerin:

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

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

Po merremi me Custom Tooling në Argo CD

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

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

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

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

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

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

TĂ« vendosim nivelin e besimit:

$ gpg --edit-key 8CB8B24F50B4797D
besim
5

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

$ git-crypt add-gpg-user 8CB8B24F50B4797D

Lidhje në temë:

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster