Argo CD'deki Özel Takımları Anlamak

Argo CD'deki Özel Takımları Anlamak

Yazdıktan bir süre sonra ilk makalejsonnet ve gitlab'ı ustalıkla yönettiğim yerde, işlem hatlarının kesinlikle iyi olduğunu ancak gereksiz derecede karmaşık ve zahmetli olduğunu fark ettim.

Çoğu durumda tipik bir görev gereklidir: "YAML oluştur ve Kubernetes'e koy." Aslında Argo CD'sinin oldukça iyi yaptığı şey de bu.

Argo CD, bir Git deposuna bağlanmanıza ve durumunu Kubernetes'e göndermenize olanak tanır. Varsayılan olarak çeşitli uygulama türleri için destek mevcuttur: Özelleştirme, Helm grafikleri, Ksonnet, çıplak Jsonnet veya yalnızca YAML/JSON manifestlerini içeren dizinler.

Bu set çoğu kullanıcı için yeterli olacaktır ancak herkes için yeterli olmayacaktır. Argo CD, herkesin ihtiyaçlarını karşılamak amacıyla özel takım kullanma yeteneğine sahiptir.

Her şeyden önce, destek ekleme olasılığıyla ilgileniyorum qbec и git-kriptBir önceki makalede tam olarak tartışılanlar.

Yapılandırmaya başlamadan önce Argo CD'nin tam olarak nasıl çalıştığını anlamanız gerekir.

Eklenen her başvuru için iki aşama vardır:

  • init — Dağıtımdan önce ilk hazırlık; burada her şey olabilir: bağımlılıkların indirilmesi, sırların paketinin açılması ve daha fazlası.
  • oluşturmak — manifest oluşturma komutunu doğrudan çalıştırarak, çıktının geçerli bir YAML akışı olması gerekir; kümeye tam olarak bu uygulanacaktır.

Dikkat çekici olan, Argo'nun bu yaklaşımı Helm dahil her türlü uygulamaya uygulamasıdır. Yani, Argo CD Helm'de sürümleri kümeye dağıtmaz, yalnızca bildirimler oluşturmak için kullanılır.

Argo, Helm kancalarını yerel olarak işleyebilir, bu da sürüm uygulama mantığını ihlal etmemesine olanak tanır.

QBEC

Qbec, jsonnet kullanarak uygulamaları rahatça tanımlamanıza olanak tanır ve ayrıca Helm grafiklerini oluşturma yeteneğine de sahiptir ve Argo CD normalde Helm kancalarını işleyebildiğinden, bu özelliği Argo CD ile kullanmak daha da doğru sonuçlar elde etmenizi sağlar.

argocd'a qbec desteği eklemek için iki şeye ihtiyacınız var:

  • Argo CD yapılandırmasında, manifest oluşturmaya yönelik özel eklentiniz ve komutlarınız tanımlanmalıdır.
  • gerekli ikili dosyalar görüntüde bulunmalıdır argocd-repo-sunucusu.

İlk görev karar verildi oldukça basit:

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

(takım init kullanılmamış)

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

İkili dosyaları eklemek için önerilir yeni bir resim topla, veya kullan konteyneri başlatma hilesi:

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

Şimdi uygulama manifestimizin nasıl görüneceğine bakalım:

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

bir değişkende ÇEVRE bildirimleri oluşturmamız gereken ortamın adını aktarıyoruz.

hadi uygulayalım ve ne elde ettiğimizi görelim:

Argo CD'deki Özel Takımları Anlamak

Uygulama devreye alındı, harika!

git-kript

Git-crypt, deponuz için şeffaf şifreleme ayarlamanıza olanak tanır. Hassas verileri doğrudan git'te depolamanın basit ve güvenli bir yoludur.

Git-crypt'in uygulanmasının daha zor olduğu ortaya çıktı.

Teorik olarak yapabiliriz git-crypt unlock özel eklentimizin başlangıç ​​aşamasında, ancak yerel dağıtım yöntemlerinin kullanılmasına izin vermeyeceği için bu pek uygun değil. Örneğin, Helm ve Jsonnet durumunda, uygulama yapılandırmasını (değer dosyaları vb.) basitleştirmemize olanak tanıyan esnek bir GUI arayüzünü kaybediyoruz.

Bu yüzden klonlama sırasında depoyu daha erken bir aşamada yazdırmak istedim.

Şu anda Argo CD, depoyu senkronize etmek için herhangi bir kanca tanımlama yeteneği sağlamadığından, bu sınırlamayı git komutunun yerini alan zorlayıcı bir kabuk betiğiyle aşmak zorunda kaldık:

#!/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'si performans sergiliyor git fetch Dağıtım işleminden önce her zaman. Yürütmeyi atayacağımız bu komuttur. git-crypt unlock Deponun kilidini açmak için.

kullanabileceğiniz testler için liman işçisi resmim zaten ihtiyacınız olan her şeye sahip:

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

Şimdi Argo'nun depolarımızın şifresini nasıl çözeceğini düşünmemiz gerekiyor. Yani bunun için bir gpg anahtarı oluşturun:

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

Anahtar adını kaydedelim 8CB8B24F50B4797D Daha ileri adımlar için. Anahtarın kendisini dışa aktarın:

$ 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

Ve bunu ayrı bir sır olarak ekleyin:

# 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

Bize kalan tek şey onu konteynere atmak argocd-repo-sunucusu, bunu yapmak için dağıtımı düzenleyin:

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

Ve mevcut olanı değiştireceğiz gpg anahtarları ses açık projected, sırrımızı belirttiğimiz yer:

   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, konteyner başladığında bu dizinden gpg anahtarlarını otomatik olarak yükler, böylece özel anahtarımızı da yükleyecektir.

Hadi kontrol edelim:

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

Harika, anahtar yüklendi! Artık ortak çalışan olarak Argo CD'sini depomuza eklememiz gerekiyor ve anında otomatik olarak şifresini çözebilecek.

Anahtarı yerel bilgisayara aktarın:

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

Güven düzeyini ayarlayalım:

$ gpg --edit-key 8CB8B24F50B4797D
trust
5

Argo'yu projemize işbirlikçi olarak ekleyelim:

$ git-crypt add-gpg-user 8CB8B24F50B4797D

İlgili Bağlantılar:

Kaynak: habr.com