Iepazīstamies ar Custom Tooling Argo CD

Iepazīstamies ar Custom Tooling Argo CD

Pāris laika pēc raksta uzrakstīšanas pirmā raksta, kur es veiksmīgi strādāju ar jsonnet un GitLab, es sapratu, ka darbplūsmas ir noteikti labas, bet pārāk sarežģītas un neērtas.

Lielākajā daļā gadījumu ir nepieciešama tipiska uzdevuma risinājums: "ģenerēt YAML un novietot to Kubernetes". Ar ko Argo CD lieliski tiek galā.

Argo CD ļauj pievienot Git repozitoriju un sinhronizēt tā stāvokli Kubernetes. Noklusējumā ir atbalsts vairākiem lietojumprogrammu veidiem: Kustomize, Helm charti, Ksonnet, neapstrādāts Jsonnet vai vienkārši direktorijas ar YAML/JSON manifestiem.

Lielākajai daļai šī komplekta lietotāju tas būs pietiekami, bet ne visiem. Lai apmierinātu visu prasības, Argo CD ir iespēja izmantot pielāgotus rīkus.

Vispirms interesē iespēja pievienot atbalstu qbec un git-crypt, kuri tika plaši aplūkoti iepriekšējā rakstā.

Pirms sākt konfigurāciju, vispirms jāapgūst, kā tieši Argo CD darbojas.

Katram pievienotajam lietojumam ir divas fāzes:

  • init — sākotnējā sagatavošana pirms izvietošanas, šeit var būt viss, kas nepieciešams: atkarību lejupielāde, slepenu izpakošana un citi procesi.
  • generate — tieši komandas izpilde manifestu ģenerēšanai, izejai jābūt derīgai YAML straumei, tieši tas tiks piemērots klasterim.

Jāpiezīmē, ka Argo izmanto šo pieeju jebkura veida lietojumiem, tostarp Helm. Tātad Argo CD Helm nepiedalās relīžu izvietošanā klasterī, to izmanto tikai manifestu ģenerēšanai.

No savas puses Argo prot dabiski apstrādāt Helm hookus, kas ļauj nesabojāt relīžu piemērošanas loģiku.

QBEC

Qbec ļauj ērti aprakstīt lietojumus, izmantojot jsonnet, un, turklāt tam ir iespēja renderēt Helm chartus, un tā kā Argo CD spēj normāli apstrādāt Helm hookus, šīs iespējas izmantošana ar Argo CD nodrošina vēl precīzākus rezultātus.

Lai pievienotu qbec atbalstu argocd, ir nepieciešamas divas lietas:

  • Argo CD konfigurācijā jābūt noteiktam jūsu pielāgotajam pluginam un komandām manifestu ģenerēšanai.
  • Nepieciešamajiem binārajām programmām jābūt pieejamām attēlā argocd-repo-server.

Pirmā uzdevuma risināšana ir diezgan vienkārša:

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

(komanda init nav izmantota)

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

Lai pievienotu bināros failus, tiek piedāvāts izveidot jaunu attēlu, vai izmantot triku ar init konteineru:

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

Tagad apskatīsim, kā izskatīsies mūsu lietojuma manifests:

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

Mainīgajā VIDES mēs nododam vides nosaukumu, kuram ir jāveic manifestu ģenerēšana.

piemērosim un paskatīsimies, ko esam ieguvuši:

Iepazīstamies ar Custom Tooling Argo CD

lieta ir uzstādīta, lieliski!

git-crypt

Git-crypt ļauj iestatīt caurspīdīgu šifrēšanu repozitorijā. Tas ir vienkāršs un drošs veids, kā glabāt konfidenciālus datus tieši git.

Ar git-crypt ieviešanu izrādījās sarežģītāk.

Teorētiski mēs varētu izpildīt git-crypt unlock mūsu custom pluginnas init posmā, bet tas nav ļoti ērti, jo neļautu izmantot dabiskās izvietošanas metodes. Piemēram, Helm un Jsonnet gadījumā mēs zaudējam elastīgu GUI interfeisu, kas ļauj vienkāršot lietojuma konfigurāciju (values faili un citi).

Tāpēc mēs vēlējāmies izdrukāt repozitoriju vēl agrīnāk, klonēšanas laikā.

Tā kā šobrīd Argo CD nesniedz iespēju aprakstīt nekādas sinhronizācijas repozitorija āķus, nācās apiet šo ierobežojumu ar viltīgu shell skriptu-wrapper, kas aizvieto git komandu:

#!/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 izpilda git fetch katru reizi pirms izvietošanas operācijas. Tieši uz šo komandu mēs piesaistīsim izpildi git-crypt unlock repotā atbloķēšanai.

tests varat izmantot manu docker attēlu kurā jau ir viss nepieciešamais:

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

Tagad mums jādomā par to, kā Argo atšifrēs mūsu repozitorijas. Proti, jāģenerē gpg atslēga tam:

$ kubectl exec -ti deploy/argocd-repo-server -- bash

$ printf "%sn" 
    "%no-protection" 
    "Key-Type: default" 
    "Subkey-Type: default" 
    "Name-Real: JŪSU VĀRDS" 
    "Name-Email: JŪSU 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'

Saglabāsim atslēgas nosaukumu 8CB8B24F50B4797D lai veiktu tālākos soļus. Eksportējam pašu atslēgu:

$ gpg --list-keys
gpg: BRĪDINĀJUMS: nedroša īpašumtiesība uz homedir '⁄home⁄argocd⁄.gnupg'
⁄home⁄argocd⁄.gnupg⁄pubring.kbx
-------------------------------
pub   rsa3072 2020-09-04 [SC]
      9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid           [ultimate] JŪSU VĀRDS <JŪSU E-PASTS@example.com>
sub   rsa3072 2020-09-04 [E]

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

Un pievienosim to kā atsevišķu noslēpumu:

# 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

Vienīgais, kas mums palicis, ir eksportēt to uz konteineru argocd-repo-server, tādēļ rediģēsim izvietošanu:

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

Un aizstāsim esošo gpg-atslēgu apjomu ar projekciju, kurā norādīsim mūsu noslēpumu:

   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 automātiski iekļaujas gpg-atslēgās no šīs direktorijas, palaižot konteineru, tādējādi tas ielādēs arī mūsu privāto atslēgu.

pārbaudām:

$ kubectl -n argocd exec -ti deploy⁄argocd-repo-server -- bash
$ GNUPGHOME=⁄app⁄config⁄gpg⁄keys gpg --list-secret-keys
gpg: BRĪDINĀJUMS: nedroša īpašumtiesība uz homedir '⁄app⁄config⁄gpg⁄keys'
⁄app⁄config⁄gpg⁄keys⁄pubring.kbx
--------------------------------
sec   rsa2048 2020-09-05 [SC] [beidzas: 2021-03-04]
      ED6285A3B1A50B6F1D9C955E5E8B1B16D47FFC28
uid           [ultimate] Anon Ymous (ArgoCD atslēgu parakstīšanas atslēga) <noreply@argoproj.io>

sec   rsa3072 2020-09-03 [SC]
      9A1FF8CAA917CE876E2562FC8CB8B24F50B4797D
uid           [ultimate] JŪSU VĀRDS <JŪSU E-PASTS@example.com>
ssb   rsa3072 2020-09-03 [E]

Lieliski, atslēga ir ielādēta! Tagad mums vienkārši jāpievieno Argo CD mūsu noliktavā kā kolaborators, un tas varēs automātiski to atšifrēt.

Importējam atslēgu lokālajā datorā:

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

Nodrošinām uzticības līmeni:

$ gpg --edit-key 8CB8B24F50B4797D
trust
5

Pievienojam argo kā kolaboratoru mūsu projektā:

$ git-crypt add-gpg-user 8CB8B24F50B4797D

Saites uz tēmu:

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster