Az egyéni szerszámok megértése az Argo CD-n

Az egyéni szerszámok megértése az Argo CD-n

Valamivel az írás után első cikk, ahol ügyesen kezeltem a jsonnetet és a gitlabot, rájöttem, hogy a pipelinesek biztosan jók, de feleslegesen bonyolultak és kényelmetlenek.

A legtöbb esetben egy tipikus feladatra van szükség: „generáljon YAML-t, és helyezze be a Kubernetesbe”. Valójában ez az, amit az Argo CD rendkívül jól teljesít.

Az Argo CD lehetővé teszi, hogy csatlakoztasson egy Git-tárat, és elküldje állapotát a Kubernetesnek. Alapértelmezés szerint többféle alkalmazást támogat: Kustomize, Helm charts, Ksonnet, csupasz Jsonnet vagy csak YAML/JSON-jegyzékkel rendelkező könyvtárak.

Ez a készlet a legtöbb felhasználónak elegendő lesz, de nem mindenkinek. Annak érdekében, hogy mindenki igényeit kielégítse, az Argo CD képes egyedi szerszámok használatára.

Először is a támogatás hozzáadásának lehetősége érdekel qbec и git-crypt, amelyeket az előző cikkben részletesen tárgyaltunk.

Mielőtt elkezdené a konfigurációt, először meg kell értenie, hogy pontosan hogyan működik az Argo CD.

Minden egyes hozzáadott alkalmazáshoz két fázisa van:

  • init – a telepítés előtti kezdeti előkészítés, itt bármi megtörténhet: függőségek letöltése, titkok kicsomagolása stb.
  • generál — közvetlenül végrehajtva a manifest generálási parancsot, a kimenetnek érvényes YAML adatfolyamnak kell lennie, pontosan ez lesz a fürtre alkalmazva.

Ami figyelemre méltó, hogy az Argo ezt a megközelítést bármilyen típusú alkalmazásra alkalmazza, beleértve a Helmet is. Vagyis az Argo CD-n a Helm nem telepít kiadásokat a fürtre, hanem csak manifesztek generálására szolgál.

Az Argo a maga részéről natívan tudja feldolgozni a Helm hook-okat, ami lehetővé teszi, hogy ne sértse meg a kiadások alkalmazásának logikáját.

QBEC

A Qbec lehetővé teszi az alkalmazások kényelmes leírását a jsonnet segítségével, emellett képes Helm diagramok megjelenítésére, és mivel az Argo CD normál esetben képes Helm hook-okat feldolgozni, ennek a funkciónak az Argo CD-vel való használatával még korrektebb eredményeket érhet el.

A qbec támogatás hozzáadásához az argocd-hez két dologra van szükség:

  • Az Argo CD konfigurációjában meg kell határozni az egyéni beépülő modult és a jegyzékek generálására szolgáló parancsokat.
  • a szükséges binárisoknak rendelkezésre kell állniuk a képen argocd-repo-szerver.

Első feladat megoldva elég egyszerű:

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

(csapat init nem használt)

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

Bináris fájlok hozzáadása javasolt új képet gyűjteni, vagy használja init konténer trükk:

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

Most nézzük meg, hogyan fog kinézni az alkalmazás jegyzéke:

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áltozóban KÖRNYEZET átadjuk annak a környezetnek a nevét, amelyhez manifeszteket kell generálnunk.

alkalmazzuk, és meglátjuk, mit kapunk:

Az egyéni szerszámok megértése az Argo CD-n

Az alkalmazás telepítésre került, nagyszerű!

git-crypt

A Git-crypt lehetővé teszi, hogy átlátszó titkosítást állítson be a tárhelyhez. Ez egy egyszerű és biztonságos módja az érzékeny adatok közvetlen tárolásának a gitben.

A git-crypt megvalósítása nehezebbnek bizonyult.

Elméletileg megtehetnénk git-crypt unlock egyéni bővítményünk kezdeti szakaszában, de ez nem túl kényelmes, mivel nem tenné lehetővé a natív telepítési módszerek használatát. Például a Helm és a Jsonnet esetében elveszítjük a rugalmas grafikus felületet, amely lehetővé teszi az alkalmazások konfigurációjának egyszerűsítését (értékfájlok stb.).

Ezért szerettem volna a repository-t egy korábbi szakaszban, a klónozás során kinyomtatni.

Mivel pillanatnyilag az Argo CD nem rendelkezik a repository szinkronizálásához szükséges horgok leírásával, ezt a korlátozást egy trükkös shell szkripttel kellett megkerülnünk, amely helyettesíti a git parancsot:

#!/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

Az Argo CD fellép git fetch minden alkalommal a telepítési művelet előtt. Ehhez a parancshoz rendeljük a végrehajtást git-crypt unlock az adattár feloldásához.

használható tesztekhez a dokkolóképem amiben már minden megvan, amire szüksége van:

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

Most azon kell gondolkodnunk, hogy az Argo hogyan fogja visszafejteni a tárolóinkat. Nevezetesen generáljon hozzá egy gpg kulcsot:

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

Mentsük el a kulcs nevét 8CB8B24F50B4797D további lépésekhez. Exportálja magát a kulcsot:

$ 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

És add hozzá külön titokként:

# 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

Nekünk már csak az marad, hogy bedobjuk a konténerbe argocd-repo-szerver, ehhez szerkessze a telepítést:

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

És lecseréljük a meglévőt gpg-kulcsok hangerő be projected, ahol megadjuk a titkunkat:

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

Az Argo CD automatikusan betölti a gpg kulcsokat ebből a könyvtárból a konténer indításakor, így a privát kulcsunkat is betölti.

ellenőrizzük:

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

Remek, a kulcs betöltve! Most már csak hozzá kell adnunk az Argo CD-t a tárhelyünkhöz együttműködőként, és az automatikusan vissza tudja majd fejteni menet közben.

Importálja a kulcsot a helyi számítógépre:

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

Állítsuk be a bizalmi szintet:

$ gpg --edit-key 8CB8B24F50B4797D
trust
5

Adjuk hozzá az argot, mint együttműködőt a projektünkhöz:

$ git-crypt add-gpg-user 8CB8B24F50B4797D

Kapcsolódó hivatkozások:

Forrás: will.com

Vásároljon megbízható tárhelyet DDoS védelemmel, VPS VDS szerverekkel rendelkező webhelyekhez 🔥 Vásároljon megbízható weboldal tárhelyet DDoS védelemmel, VPS VDS szerverekkel | ProHoster