Фаҳмидани асбобҳои фармоишӣ дар CD Argo

Фаҳмидани асбобҳои фармоишӣ дар CD Argo

Чанде пас аз навиштан мақолаи аввал, ки ман jsonnet ва gitlab-ро моҳирона идора мекардам, ман фаҳмидам, ки қубурҳо албатта хубанд, аммо нолозим мураккаб ва нороҳатанд.

Дар аксари мавридҳо, як вазифаи муқаррарӣ талаб карда мешавад: "YaML тавлид кунед ва онро дар Кубернетес ҷойгир кунед." Дар асл, ин чизест, ки CD Argo ба таври назаррас хуб кор мекунад.

CD Argo ба шумо имкон медиҳад, ки анбори Git-ро пайваст кунед ва ҳолати онро ба Kubernetes фиристед. Бо нобаёнӣ, якчанд намуди барномаҳо дастгирӣ карда мешаванд: Kustomize, Helm charts, Ksonnet, бараҳна Jsonnet ё танҳо директорияҳо бо манифестҳои YAML/JSON.

Ин маҷмӯа барои аксари корбарон кофӣ хоҳад буд, аммо на барои ҳама. Барои қонеъ кардани ниёзҳои ҳама, CD Argo дорои қобилияти истифодаи асбобҳои фармоишӣ мебошад.

Пеш аз ҳама, ман ба имкони илова кардани дастгирӣ таваҷҷӯҳ дорам qbec и git-crypt, ки дар маколаи гузашта пурра мухокима карда шуда буданд.

Пеш аз оғози конфигуратсия, шумо аввал бояд фаҳмед, ки чӣ тавр CD Argo кор мекунад.

Барои ҳар як замимаи иловашуда он ду марҳила дорад:

  • ташаббус — омодагии аввалия пеш аз ҷойгиркунӣ, дар ин ҷо ҳама чиз рӯй дода метавонад: зеркашии вобастагӣ, кушодани асрор ва ғайра.
  • ҳосил кардан — бевосита иҷро кардани фармони тавлиди манифест, натиҷа бояд ҷараёни дурусти YAML бошад, маҳз ҳамон чизест, ки ба кластер татбиқ карда мешавад.

Чизи аҷиб он аст, ки Argo ин равишро ба ҳама намуди барномаҳо, аз ҷумла Helm татбиқ мекунад. Яъне, дар Argo CD Helm релизҳоро ба кластер ҷойгир намекунад, балки танҳо барои тавлиди манифестҳо истифода мешавад.

Дар навбати худ, Argo метавонад қалмоқҳои Helm-ро ба таври худкор коркард кунад, ки ба он имкон медиҳад мантиқи татбиқи релизҳоро вайрон накунад.

QBEC

Qbec ба шумо имкон медиҳад, ки барномаҳоро бо истифода аз jsonnet ба таври қулай тавсиф кунед ва илова бар ин, қобилияти намоиш додани диаграммаҳои Helm дорад ва азбаски Argo CD метавонад одатан қалмоқҳои Helm-ро коркард кунад, бо истифода аз ин хусусият бо CD Argo ба шумо имкон медиҳад, ки натиҷаҳои боз ҳам дурусттар ба даст оред.

Барои илова кардани дастгирии qbec ба argocd ба шумо ду чиз лозим аст:

  • Дар конфигуратсияи CD Argo, плагини фармоишии шумо ва фармонҳо барои тавлиди манифестҳо бояд муайян карда шаванд.
  • бинарҳои зарурӣ бояд дар тасвир дастрас бошанд argocd-repo-сервер.

Вазифаи аввал карор дода мешавад хеле содда:

# 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:

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

Акнун биёед бубинем, ки манифести аризаи мо чӣ гуна хоҳад буд:

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

Дар тағйирёбанда ТАЪРИХӢ мо номи муҳитеро мегузорем, ки барои он мо бояд манифестҳо тавлид кунем.

биёед онро татбиқ кунем ва бубинем, ки мо чӣ мегирем:

Фаҳмидани асбобҳои фармоишӣ дар CD Argo

Барнома ҷойгир карда шуд, олӣ!

git-crypt

Git-crypt ба шумо имкон медиҳад, ки рамзгузории шаффофро барои анбори худ танзим кунед. Ин як роҳи оддӣ ва бехатар барои нигоҳ доштани маълумоти ҳассос бевосита дар git мебошад.

Татбиқи git-crypt душвортар шуд.

Аз ҷиҳати назариявӣ мо метавонистем git-crypt unlock дар марҳилаи ибтидоии плагини фармоишии мо, аммо ин чандон қулай нест, зеро он имкон намедиҳад, ки усулҳои ҷойгиркунии ватанӣ истифода шаванд. Масалан, дар мавриди Helm ва Jsonnet, мо интерфейси фасеҳи GUI-ро аз даст медиҳем, ки ба мо имкон медиҳад конфигуратсияи барномаҳоро (файлҳои арзишҳо ва ғайра) содда кунем.

Аз ин рӯ, ман мехостам, ки анборро дар марҳилаи қаблӣ, ҳангоми клонкунӣ чоп кунам.

Азбаски дар айни замон Argo CD қобилияти тавсифи ҳама гуна қалмоқҳоро барои синхронизатсияи анбор таъмин намекунад, мо маҷбур шудем, ки ин маҳдудиятро бо скрипти мураккаби ҷилди, ки фармони git иваз мекунад, бартараф кунем:

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

CD Argo иҷро мекунад git fetch ҳар дафъа пеш аз амалиёти ҷойгиркунӣ. Маҳз ҳамин фармонест, ки мо иҷрои онро таъин мекунем git-crypt unlock барои кушодани анбор.

барои санҷишҳо шумо метавонед истифода баред тасвири докери ман ки аллакай ҳама чизи лозимаро дорад:

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

Ҳоло мо бояд дар бораи он фикр кунем, ки чӣ гуна Argo анборҳои моро рамзкушоӣ мекунад. Яъне, барои он калиди gpg тавлид кунед:

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

Биёед номи калидро захира кунем 8CB8B24F50B4797D барои қадамҳои минбаъда. Худи калидро содир кунед:

$ 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

Ва онро ҳамчун сирри алоҳида илова кунед:

# 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

Барои мо факат ба контейнер партофтан аст argocd-repo-сервер, барои ин кор, таҳрирро таҳрир кунед:

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

Ва мо чои мавчударо иваз мекунем gpg-калидҳо ҳаҷми фаъол projected, ки мо сирри худро нишон медиҳем:

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

CD Argo ба таври худкор калидҳои gpg-ро аз ин феҳрист бор мекунад, вақте ки контейнер оғоз меёбад, аз ин рӯ он калиди хусусии моро низ бор мекунад.

тафтиш кунем:

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

Аҷоиб, калид бор карда шуд! Ҳоло ба мо танҳо лозим аст, ки CD-и Argo-ро ба анбори худ ҳамчун ҳамкор илова кунем ва он метавонад ба таври худкор шифри онро дар парвоз кушояд.

Калидро ба компютери маҳаллӣ ворид кунед:

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

Биёед сатҳи эътимодро муқаррар кунем:

$ gpg --edit-key 8CB8B24F50B4797D
trust
5

Биёед argo-ро ҳамчун шарик ба лоиҳаи худ илова кунем:

$ git-crypt add-gpg-user 8CB8B24F50B4797D

Истинодҳои марбут:

Манбаъ: will.com

Хостинги боэътимодро барои сайтҳо бо муҳофизати DDoS, серверҳои VPS VDS харед 🔥 Харидани хостинги боэътимоди вебсайт бо муҳофизати DDoS, серверҳои VPS VDS | ProHoster