РазбираСмся с Custom Tooling Π² Argo CD

РазбираСмся с Custom Tooling Π² Argo CD

Бпустя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя послС написания ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π³Π΄Π΅ я Π»ΠΎΠ²ΠΊΠΎ управлялся с jsonnet ΠΈ Π³ΠΈΡ‚Π»Π°Π±ΠΎΠΌ, я понял Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ‹ это ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ излишнС слоТно ΠΈ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв трСбуСтся типовая Π·Π°Π΄Π°Ρ‡Π°: "ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ YAML ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Kubernetes". БобствСнно, с Ρ‡Π΅ΠΌ Argo CD Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ справляСтся.

Argo CD позволяСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Git-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ ΡΠΈΠ½ΠΊΠ°Ρ‚ΡŒ Π΅Π³ΠΎ состояниС Π² Kubernetes. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²ΠΈΠ΄ΠΎΠ² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ: Kustomize, Helm Ρ‡Π°Ρ€Ρ‚Ρ‹, Ksonnet, Π³ΠΎΠ»Ρ‹ΠΉ Jsonnet ΠΈΠ»ΠΈ просто Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с YAML/JSON манифСстами.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ этого Π½Π°Π±ΠΎΡ€Π° Π±ΡƒΠ΄Π΅Ρ‚ достаточно, Π½ΠΎ Π½Π΅ всСм. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ потрСбности всСх ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π² Argo CD имССтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ custom tooling.

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ интСрСсуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ добавлСния ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ qbec ΠΈ git-crypt, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ с ΠΏΠΎΠ»Π½Π° Π±Ρ‹Π»ΠΈ рассмотрСнны Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π½ΡƒΠΆΠ½ΠΎ сначала Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Argo CD Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ прилоТСния ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ Ρ„Π°Π·Ρ‹:

  • init β€” Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄ Π΄Π΅ΠΏΠ»ΠΎΠ΅ΠΌ, здСсь ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ всё Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ: скачиваниС зависимостСй, распаковка сСкрСтов ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.
  • generate β€” Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ нСпосрСдствСнно ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ манифСстов, Π²Ρ‹Π²ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌ YAML stream, это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΎ Π² кластСр.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Argo примСняСт этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ для любого Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π² Ρ‚ΠΎΠΌ числС ΠΈ для Helm. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π² Argo CD Helm Π½Π΅ занимаСтся Π΄Π΅ΠΏΠ»ΠΎΠ΅ΠΌ Ρ€Π΅Π»ΠΈΠ·ΠΎΠ² Π² кластСр, Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ манифСстов.

Π‘ΠΎ своСй стороны Argo ΡƒΠΌΠ΅Π΅Ρ‚ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Helm-Ρ…ΡƒΠΊΠΈ, Ρ‡Ρ‚ΠΎ позволяСт Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΠΈ примСнСния Ρ€Π΅Π»ΠΈΠ·ΠΎΠ².

QBEC

Qbec позволяСт ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ прилоТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ jsonnet, Π° ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ΡŒ Helm-Ρ‡Π°Ρ€Ρ‚Ρ‹, Π° Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Argo CD ΡƒΠΌΠ΅Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Helm-Ρ…ΡƒΠΊΠΈ, Ρ‚ΠΎ использованиС этой возмоТности с Argo CD позволяСт Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π΅Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ².

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ qbec Π² argocd Π½ΡƒΠΆΠ½ΠΎ Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ:

  • Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅ Argo CD Π΄ΠΎΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ваш custom plugin ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ манифСстов.
  • Π½ΡƒΠΆΠ½Ρ‹Π΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ доступны Π² ΠΎΠ±Ρ€Π°Π·Π΅ argocd-repo-server.

ΠŸΠ΅Ρ€Π²Π°Ρ Π·Π°Π΄Π°Ρ‡Π° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ довольно просто:

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

(ΠΊΠΎΠΌΠ°Π½Π΄Π° init Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ)

$ 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

Π’ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ENVIRONMENT ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ имя окруТСния для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ манифСстов.

ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΈ посмотрим Ρ‡Ρ‚ΠΎ Ρƒ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

РазбираСмся с Custom Tooling Π² Argo CD

ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ задСплоилось, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ!

git-crypt

Git-crypt позволяСт Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ΅ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ рСпозитория. Π­Ρ‚ΠΎ простой ΠΈ бСзопасный способ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ прямо Π² git.

Π‘ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ git-crypt оказалось слоТнСС.

ВСорСтичСски ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ git-crypt unlock Π½Π° init-стадии нашСго custom-ΠΏΠ»Π°Π³ΠΈΠ½Π°, Π½ΠΎ это Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ дСплоя. НапримСр Π² случаС Helm ΠΈ Jsonnet, ΠΌΡ‹ тСряСм Π³ΠΈΠ±ΠΊΠΈΠΉ GUI-интСрфСйс ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ настройку прилоТСния (values-Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π΅).

ИмСнно ΠΏΠΎ этому Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ распСчатываниС рСпозитория Π΅Ρ‰Π΅ Π½Π° Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½Π΅ΠΉ стадии, ΠΏΡ€ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ.

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ 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

Argo CD выполняСт git fetch ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ дСплоя. ИмСнно Π½Π° эту ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΌΡ‹ ΠΈ повСсим Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ git-crypt unlock для Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ рСпозитория.

для тСстов ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠΉ docker-ΠΎΠ±Ρ€Π°Π· Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ всё Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅:

$ 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-server, для этого ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ deployment:

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

И Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ gpg-keys volume Π½Π° projected, Π³Π΄Π΅ ΠΈ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ наш сСкрСт:

   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 автоматичСски ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ 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]

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ, ΠΊΠ»ΡŽΡ‡ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½! Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ достаточно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Argo CD Π² наш Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π² качСствС ΠΊΠΎΠ»Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π° ΠΈ ΠΎΠ½ смоТСт автоматичСски Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° Π»Π΅Ρ‚Ρƒ.

Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡ Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€:

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

Настроим ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ довСрия:

$ gpg --edit-key 8CB8B24F50B4797D
trust
5

Π”ΠΎΠ±Π°Π²ΠΈΠΌ argo Π² качСствС ΠΊΠΎΠ»Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π° Π² наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚:

$ git-crypt add-gpg-user 8CB8B24F50B4797D

Бсылки ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠΈΡ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ хостинг для сайтов с Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΎΡ‚ DDoS, VPS VDS сСрвСры πŸ”₯ ΠšΡƒΠΏΠΈΡ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ хостинг для сайтов с Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΎΡ‚ DDoS, VPS VDS сСрвСры | ProHoster