Bontsuk le a Custom Toolingot az Argo CD-ben

Bontsuk le a Custom Toolingot az Argo CD-ben

Néhány idő elteltével az első cikk megírása után a cikkben, ahol ügyesen kezeltem a jsonnetet és a gitlabot, rájöttem, hogy a pipeline-ok jók, de túlságosan bonyolultak és kényelmetlenek.A legtöbb esetben egy tipikus feladat szükséges: "YAML generálása és elhelyezése a Kubernetesben". Ezt az Argo CD nagyszerűen végzi.

Az Argo CD lehetővé teszi egy Git-repozitórium csatlakoztatását és annak állapotának szinkronizálását a Kubernetesben. Alapértelmezés szerint többféle alkalmazástípust támogat: Kustomize, Helm chartok, Ksonnet, nyers Jsonnet vagy egyszerűen YAML/JSON manifesztumok könyvtára.

A felhasználók többsége számára ez a készlet elegendő, de nem mindenki számára. Ahhoz, hogy mindenki igényeit kielégítsük, az Argo CD lehetőséget kínál a testreszabott eszközök használatára.

Elsősorban a támogatás hozzáadásának lehetősége érdekli

, amelyeket a korábbi cikkben részletesen tárgyaltunk. qbec és git-cryptMielőtt elkezdenénk a konfigurálást, először meg kell értenünk, hogyan működik az Argo CD.

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

— az indítás előtti előkészítés, itt bármi lehet: függőségek letöltése, titkok kicsomagolása és egyebek.

  • init generate
  • — a manifesztumok generálására vonatkozó parancs közvetlen végrehajtása, a kimenetnek érvényes YAML stream-nek kell lennie, ez az, ami a klaszterben alkalmazásra kerül. Figyelemre méltó, hogy az Argo ezt a megközelítést bármilyen alkalmazás típus számára alkalmazza, beleértve a Helm-et is. Az Argo CD a Helm segítségével nem végez deployt a klaszterbe, hanem csak a manifesztumok generálására használják.

Az Argo natívan képes kezelni a Helm-hookokat, ami lehetővé teszi a kiadási logika megőrzését.

QBEC

A Qbec lehetővé teszi, hogy kényelmesen írjuk le az alkalmazásokat jsonnet segítségével, és emellett képes a Helm chartok renderelésére is. Mivel az Argo CD rendesen kezeli a Helm-hookokat, ennek a lehetőségnek a használata az Argo CD-vel még pontosabb eredményeket eredményez.

A Qbec támogatásának hozzáadásához az argocd-hez két dolog szükséges:

az Argo CD konfigurációjában definiálva kell lennie az Ön testreszabott pluginjának és a manifesztumok generálásához szükséges parancsoknak.

  • a szükséges binárisoknak elérhetőnek kell lenniük a képnél
  • argocd-repo-server Az első feladat.

viszonylag egyszerűen megoldható: (a parancs nem használt)

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

$ kubectl -n argocd patch cm/argocd-cm -p "$(cat cm.yaml)" init A binárisok hozzáadásához javasolt

új képet építeni

, vagy használni új kép létrehozása, vagy használja trükk init-konténerrel:

# 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ásunk manifestje:

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

Az KÖRNYEZET itt átadjuk a környezet nevét, amelyhez a manifestek generálását végezzük.

Alkalmazzuk, és nézzük, mi született:

Bontsuk le a Custom Toolingot az Argo CD-ben

az alkalmazás telepítve van, nagyszerű!

git-crypt

A Git-crypt lehetővé teszi a tároló átlátható titkosításának beállítását. Ez egy egyszerű és biztonságos mód a bizalmas adatok git-ben való tárolására.

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

Elméletileg futtathatnánk git-crypt unlock a custom pluginunk init szakaszában, de ez nem túl kényelmes, mivel nem engedné meg a natív telepítési módszerek használatát. Például Helm és Jsonnet esetén elveszítjük a rugalmas GUI felületet, ami megkönnyíti az alkalmazás beállításait (values fájlok és egyebek).

Ezért szeretnénk a tároló kibővítését még korábbi szakaszban végezni, a klónozás során.

Mivel jelenleg az Argo CD nem biztosít lehetőséget a tároló szinkronizálásának bármilyen hook-jának leírására, egy ügyes shell script wrapperrel kellett megkerülnünk ezt a korlátozást, 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 végrehajtja git fetch minden alkalommal a telepítési művelet előtt. Ezt a parancsot fogjuk használni a git-crypt unlock tároló feloldásához.

Teszteléshez használhatod az én docker-képem amely már mindent tartalmaz, amire szükséged van:

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

Most gondolnunk kell arra, hogy az Argo hogyan fogja dekódolni a tárolóinkat. Nevezetesen, generálni kell egy gpg kulcsot számára:

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

Mentjük a kulcs nevét 8CB8B24F50B4797D a következő lépésekhez. Exportáljuk magát a kulcsot:

$ gpg --list-keys
gpg: FIGYELMEZTETÉS: a homdirectory tulajdonjoga nem biztonságos 'home/argocd/.gnupg'
/home/argocd/.gnupg/pubring.kbx
-------------------------------
pub   rsa3072 2020-09-04 [SC]
      9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid           [végleges] A NEVED <A.EMAIL@example.com>
sub   rsa3072 2020-09-04 [E]

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

És hozzáadjuk külön titkosítványké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

Ennyi maradt nekünk, hogy átadjuk a konténernek Az első feladat, ehhez szerkesztjük a telepítést:

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

És kicseréljük a meglévőt gpg-keys volume-ra projected, ahol megadjuk a titkosítványunkat:

   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 betölti a privát kulcsunkat is.

Ellenőrizzük:

$ kubectl -n argocd exec -ti deploy/argocd-repo-server -- bash
$ GNUPGHOME=/app/config/gpg/keys gpg --list-secret-keys
gpg: FIGYELMEZTETÉS: a homdirectory tulajdonjoga nem biztonságos '/app/config/gpg/keys'
/app/config/gpg/keys/pubring.kbx
--------------------------------
sec   rsa2048 2020-09-05 [SC] [lejár: 2021-03-04]
      ED6285A3B1A50B6F1D9C955E5E8B1B16D47FFC28
uid           [végleges] Anon Ymous (ArgoCD kulcs aláíró kulcs) <noreply@argoproj.io>

sec   rsa3072 2020-09-03 [SC]
      9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid           [végleges] A NEVED <A.EMAIL@example.com>
ssb   rsa3072 2020-09-03 [E]

Nagyszerű, a kulcs betöltve! Most elég, ha az Argo CD-t hozzáadjuk a tárolónkhoz mint együttműködőt, és ez képes lesz automatikusan dekódolni azt.

Importáljuk 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

Adjunk hozzá argo-t mint együttműködőt a projektünkhöz:

$ git-crypt add-gpg-user 8CB8B24F50B4797D

További források:

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster