Pag-unawa sa Custom Tooling sa Argo CD

Pag-unawa sa Custom Tooling sa Argo CD

Ilang oras pagkatapos magsulat unang artikulo, kung saan maingat kong pinangasiwaan ang jsonnet at gitlab, napagtanto ko na ang mga pipeline ay tiyak na mabuti, ngunit hindi kinakailangang kumplikado at hindi maginhawa.

Sa karamihan ng mga kaso, ang karaniwang gawain na kinakailangan ay ang "bumuo ng YAML at ilagay ito sa Kubernetes." Ang Argo CD ay gumagawa ng isang kamangha-manghang trabaho nito.

Binibigyang-daan ka ng Argo CD na ikonekta ang isang Git repository at i-sync ang estado nito sa Kubernetes. Bilang default, sinusuportahan nito ang ilang uri ng application: Kustomize, Helm chart, Ksonnet, plain Jsonnet, o simpleng mga direktoryo na may YAML/JSON manifests.

Magiging sapat ang set na ito para sa karamihan ng mga user, ngunit hindi para sa lahat. Upang matugunan ang mga pangangailangan ng lahat, nag-aalok ang Argo CD ng custom na tooling.

Una sa lahat, interesado ako sa posibilidad na magdagdag ng suporta qbec и git-crypt, na lubusang tinalakay sa nakaraang artikulo.

Bago mo simulan ang pag-configure, kailangan mo munang maunawaan kung paano gumagana ang Argo CD.

Para sa bawat idinagdag na aplikasyon mayroon itong dalawang yugto:

  • sa loob — paunang paghahanda bago ang pag-deploy, na maaaring may kinalaman sa anumang bagay: pag-download ng mga dependency, pag-unpack ng mga lihim, at higit pa.
  • lumikha — direktang isinasagawa ang manifest generation command, ang output ay dapat na valid na stream ng YAML, ito mismo ang ilalapat sa cluster.

Ang kapansin-pansin ay inilalapat ng Argo ang diskarteng ito sa anumang uri ng aplikasyon, kabilang ang Helm. Ibig sabihin, sa Argo CD, hindi nagde-deploy ang Helm ng mga release sa cluster, ngunit ginagamit lang ito para sa manifest generation.

Ang Argo, sa bahagi nito, ay katutubong kayang humawak ng mga Helm hook, na nagbibigay-daan para sa pare-parehong lohika ng pagpapalabas.

QBEC

Binibigyang-daan ka ng Qbec na maginhawang ilarawan ang mga application gamit ang jsonnet, at mayroon ding kakayahang mag-render ng mga Helm chart. Dahil ang Argo CD ay maaaring humawak ng Helm hook nang maayos, ang paggamit ng feature na ito sa Argo CD ay nagbibigay-daan sa iyo upang makamit ang mas tumpak na mga resulta.

Upang magdagdag ng suporta sa qbec sa argocd, dalawang bagay ang kailangan:

  • Ang iyong custom na plugin at mga command para sa pagbuo ng mga manifest ay dapat tukuyin sa Argo CD config.
  • ang mga kinakailangang binary ay dapat na available sa larawan argocd-repo-server.

Ang unang gawain ay pinagpapasyahan medyo simple:

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

(pangkat sa loob hindi ginagamit)

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

Iminumungkahi na magdagdag ng mga binary mag-ipon ng bagong imahe, o gamitin init container trick:

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

Ngayon tingnan natin kung ano ang magiging hitsura ng aming application 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

Sa variable Kapaligiran Ipinapasa namin ang pangalan ng kapaligiran kung saan dapat isagawa ang manifest generation.

Ilapat natin ito at tingnan kung ano ang makukuha natin:

Pag-unawa sa Custom Tooling sa Argo CD

Ang application ay na-deploy, mahusay!

git-crypt

Binibigyang-daan ka ng Git-crypt na mag-set up ng transparent na pag-encrypt ng repositoryo. Isa itong simple at secure na paraan upang direktang mag-imbak ng sensitibong data sa Git.

Ang pagpapatupad ng git-crypt ay naging mas mahirap.

Sa teoryang magagawa natin git-crypt unlock sa init na yugto ng aming custom na plugin, ngunit hindi ito masyadong maginhawa, dahil hindi nito papayagan kaming gumamit ng mga native na paraan ng pag-deploy. Halimbawa, sa kaso ng Helm at Jsonnet, nawala ang nababaluktot na interface ng GUI na nagbibigay-daan sa amin na pasimplehin ang pagsasaayos ng application (mga value ng file, atbp.).

Ito ay tiyak kung bakit gusto kong magsagawa ng repository unsealing sa isang mas maagang yugto, sa panahon ng pag-clone.

Dahil ang Argo CD ay kasalukuyang hindi nagbibigay ng kakayahang tukuyin ang anumang mga kawit para sa pag-synchronize ng isang repositoryo, kinailangan kong lutasin ang limitasyong ito gamit ang isang matalinong shell script wrapper na pumapalit sa git command:

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

Ang Argo CD ay gumaganap git fetch tuwing bago ang deployment operation. Itatalaga namin ang command na ito para isagawa ito. git-crypt unlock upang i-unlock ang imbakan.

para sa mga pagsubok na magagamit mo aking docker image na mayroon na ng lahat ng kailangan mo:

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

Ngayon ay kailangan nating isipin kung paano ide-decrypt ng Argo ang ating mga repositoryo. Sa partikular, kailangan naming bumuo ng GPG key para dito:

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

I-save natin ang key name 8CB8B24F50B4797D Para sa karagdagang mga hakbang, i-export natin ang susi mismo:

$ 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

At idagdag natin ito bilang isang hiwalay na lihim:

# 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

Ang natitira na lang nating gawin ay itapon ito sa lalagyan. argocd-repo-server, para magawa ito, ie-edit namin ang deployment:

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

At papalitan natin ang dati mga gpg-key volume sa projected, kung saan ipapakita namin ang aming sikreto:

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

Awtomatikong nilo-load ng Argo CD ang mga gpg key mula sa direktoryong ito kapag nagsimula ang lalagyan, kaya ilo-load din nito ang aming pribadong key.

suriin natin:

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

Mahusay, na-upload na ang susi! Ngayon kailangan lang naming magdagdag ng Argo CD sa aming repository bilang isang collaborator, at magagawa nitong awtomatikong i-decrypt ito sa mabilisang.

I-import ang susi sa iyong lokal na computer:

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

Itakda natin ang antas ng tiwala:

$ gpg --edit-key 8CB8B24F50B4797D
trust
5

Idagdag natin si argo bilang isang collaborator sa ating proyekto:

$ git-crypt add-gpg-user 8CB8B24F50B4797D

Kaugnay na Mga Link:

Pinagmulan: www.habr.com