Uurime Custom Toolingut Argo CD-s

Uurime Custom Toolingut Argo CD-s

Mõne aja pärast pärast esimese artikli kirjutamist kui ma osavalt jsonneti ja gitlabiga toime tulin, sain aru, et pipeline'id on muidugi head, kuid ülemäära keerulised ja ebamugavad.Enamasti on vajalik tüüpiline ülesanne: "generaatori YAML ja paigaldada see Kubernetesesse". Just see on see, millega Argo CD suurepäraselt toime tuleb.

Argo CD võimaldab ühendada Git-repo ja sünkroonida selle olekut Kubernetesesse. Vaikeselt on toetatud mitut tüüpi rakendusi: Kustomize, Helm graafikud, Ksonnet, puhas Jsonnet või lihtsalt kataloogid YAML/JSON manifestide jaoks.

Enamikule kasutajatele peaks sellest piisama, kuid mitte kõigile. Kõikide vajaduste rahuldamiseks pakub Argo CD võimalust kasutada kohandatud tööriistu.

Esialgu huvitab mind toimetamise toe lisamise võimalus

, mida on käsitletud eelmises artiklis. qbec ja git-cryptEnne konfiguratsiooniga alustamist tuleb kõigepealt mõista, kuidas täpselt Argo CD töötab.

Iga lisatud rakenduse jaoks on kaks etappi:

— algne ettevalmistus enne juurutamist, siin võib olla kõike: sõltuvuste allalaadimine, saladuste lahtipakkimine ja muud.

  • init generate
  • generate — käsu täitmine manifestide genereerimiseks, väljund peab olema kehtiv YAML voog, see on see, mis rakendatakse klastris.

On tähelepanuväärne, et Argo kasutab seda lähenemist mistahes rakenduste puhul, sealhulgas Helm jaoks. See tähendab, et Argo CD ei tegele versioonide klastrisse paigaldamisega, vaid kasutatakse vaid manifestide genereerimiseks.

Omalt poolt oskab Argo natiivselt käsitleda Helm-hukke, mis võimaldab mitte rikkuda versioonide rakendamise loogikat.

QBEC

Qbec võimaldab mugavalt kirjeldada rakendusi jsonnet'i abil ning sellel on ka võimalus renderdada Helm-i graafikuid. Kuna Argo CD oskab korralikult käsitleda Helm-hukke, siis selle funktsionaalsuse kasutamine koos Argo CD-ga võimaldab saavutada veelgi täpsemaid tulemusi.

Käideldavuse lisamiseks qbec Argo CD-sse on vaja kahte asja:

  • Argo CD konfiguratsioonis peab olema määratud teie kohandatud plugin ja käsud manifestide genereerimiseks.
  • vajalikud biinaries peavad olema saadaval pildis argocd-repo-server.

Esimene ülesanne lahendatakse päris lihtsalt:

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

(käsku init ei kasutata)

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

Binaaride lisamiseks soovitatakse koguda uus pilt, või kasutada init-konteineri nipp:

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

Vaadake nüüd, milline näeb välja meie rakenduse manifest:

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

Muutujas ENVIRONMENT me edastame keskkonna nime, mille jaoks tuleb manifeste genereerida.

rakendame ja vaatame, mis meil on:

Uurime Custom Toolingut Argo CD-s

rakendus on edukalt juurutatud, suurepärane!

git-crypt

Git-crypt võimaldab seada üles läbipaistva krüpteerimise hoidlat. See on lihtne ja turvaline viis konfidentsiaalsete andmete salvestamiseks otse git-s.

git-crypti rakendamine osutus keerulisemaks.

Teoreetiliselt võiksime käivitada git-crypt unlock meie custom-plugin'i algstaadiumis, kuid see ei oleks väga mugav, kuna see ei lubaks kasutada kohalikke juurutusmeetodeid. Näiteks Helm ja Jsonnet puhul kaotame paindliku GUI-liidese, mis lihtsustab rakenduse seadistamist (values-failid jms).

Seepärast tahtsin repositooriumi printimist teostada juba varasemal etapil, kloonimise käigus.

Kuna hetkel ei paku Argo CD võimalust kirjeldada mingeid repositooriumi sünkroniseerimise konksusid, tuli selle piirangu ületamiseks kasutada nutikat shell-skripti, mis asendab git-käsku:

#!/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 käivitab git fetch igal korral enne juurutamise operatsiooni. Just sellele käsule paneme käitamise git-crypt unlock repositooriumi avamiseks.

Testide jaoks saate kasutada minu docker-pilti milles on juba kõik vajalik:

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

Nüüd peame mõtlema, kuidas Argo meie repositooriume dekrüpteerib. Täpsemalt peame genereerima selle jaoks gpg-võtme:

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

Salvestame võtme nime 8CB8B24F50B4797D edasi sammude jaoks. Eksportime ise võtme:

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

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

Ja lisame selle eraldi salajana:

# 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

Ainus, mis meil veel alles jääb, on see, et saata see konteinerisse argocd-repo-server, selleks redigeerime deployment'i:

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

Ja asendame olemasoleva gpg-keys volume'iga projected, kus märkime meie salajase:

   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 laadib gpg- võtmed automaatselt selle kausta, kui konteiner käivitub, seega laadib ta ka meie privaatvõtme.

kontrollime:

$ 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 võtme allkirjastamise võti) 

sec   rsa3072 2020-09-03 [SC]
      9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid           [ultimate] TEIE NIMI 
ssb   rsa3072 2020-09-03 [E]

Suurepärane, võti on laaditud! Nüüd peame lihtsalt lisama Argo CD meie hoidlasse koostööpartnerina ja see suudab selle automaatselt reaalajas dekrüpteerida.

Impordime võtme kohalikku arvutisse:

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

Seadistame usaldusnivoo:

$ gpg --edit-key 8CB8B24F50B4797D
trust
5

Lisame argo koostööpartnerina meie projekti:

$ git-crypt add-gpg-user 8CB8B24F50B4797D

Seotud lingid:

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster