เช†เชฐเซเช—เซ‹ เชธเซ€เชกเซ€เชฎเชพเช‚ เช•เชธเซเชŸเชฎ เชŸเซ‚เชฒเชฟเช‚เช—เชจเซ‡ เชธเชฎเชœเชตเซเช‚

เช†เชฐเซเช—เซ‹ เชธเซ€เชกเซ€เชฎเชพเช‚ เช•เชธเซเชŸเชฎ เชŸเซ‚เชฒเชฟเช‚เช—เชจเซ‡ เชธเชฎเชœเชตเซเช‚

เชฒเช–เซเชฏเชพ เชชเช›เซ€ เชฅเซ‹เชกเซ‹ เชธเชฎเชฏ เชชเซเชฐเชฅเชฎ เชฒเซ‡เช–, เชœเซเชฏเชพเช‚ เชฎเซ‡เช‚ เชšเชชเชณเชคเชพเชชเซ‚เชฐเซเชตเช• jsonnet เช…เชจเซ‡ gitlab เชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเซเชฏเซเช‚, เชฎเชจเซ‡ เชธเชฎเชœเชพเชฏเซเช‚ เช•เซ‡ เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชšเซ‹เช•เซเช•เชธเชชเชฃเซ‡ เชธเชพเชฐเซ€ เช›เซ‡, เชชเชฐเช‚เชคเซ เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เชฐเซ€เชคเซ‡ เชœเชŸเชฟเชฒ เช…เชจเซ‡ เช…เชธเซเชตเชฟเชงเชพเชœเชจเช• เช›เซ‡.

เชฎเซ‹เชŸเชพ เชญเชพเช—เชจเชพ เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚, เชเช• เชฒเชพเช•เซเชทเชฃเชฟเช• เช•เชพเชฐเซเชฏ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡: "YAML เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‹ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ Kubernetes เชฎเชพเช‚ เชฎเซ‚เช•เซ‹." เช–เชฐเซ‡เช–เชฐ, เช† เชคเซ‡ เช›เซ‡ เชœเซ‡ เช†เชฐเซเช—เซ‹ เชธเซ€เชกเซ€ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเซ‡ เช›เซ‡.

เช†เชฐเซเช—เซ‹ เชธเซ€เชกเซ€ เชคเชฎเชจเซ‡ เช—เชฟเชŸ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซเช‚ เชธเซเชŸเซ‡เชŸ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ‡ เชฎเซ‹เช•เชฒเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเซ‡, เชตเชฟเชตเชฟเชง เชชเซเชฐเช•เชพเชฐเชจเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เชฎเชพเชŸเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช›เซ‡: Kustomize, Helm charts, Ksonnet, bare Jsonnet, เช…เชฅเชตเชพ เชซเช•เซเชค YAML/JSON เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชธเชพเชฅเซ‡เชจเซ€ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช“.

เช† เชธเซ‡เชŸ เชฎเซ‹เชŸเชพเชญเชพเช—เชจเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเซ‹ เชนเชถเซ‡, เชชเชฐเช‚เชคเซ เชฆเชฐเซ‡เช• เชฎเชพเชŸเซ‡ เชจเชนเซ€เช‚. เชฆเชฐเซ‡เช•เชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹เชจเซ‡ เชชเชนเซ‹เช‚เชšเซ€ เชตเชณเชตเชพ เชฎเชพเชŸเซ‡, เช†เชฐเซเช—เซ‹ เชธเซ€เชกเซ€เชฎเชพเช‚ เช•เชธเซเชŸเชฎ เชŸเซ‚เชฒเชฟเช‚เช—เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เช›เซ‡.

เชธเซŒ เชชเซเชฐเชฅเชฎ, เชฎเชจเซ‡ เชธเชฎเชฐเซเชฅเชจ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชธเช‚เชญเชพเชตเชจเชพเชฎเชพเช‚ เชฐเชธ เช›เซ‡ qbec ะธ git-เช•เซเชฐเชฟเชชเซเชŸ, เชœเซ‡เชจเซ€ เช…เช—เชพเช‰เชจเชพ เชฒเซ‡เช–เชฎเชพเช‚ เชธเช‚เชชเซ‚เชฐเซเชฃ เชšเชฐเซเชšเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€.

เชคเชฎเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชถเชฐเซ‚ เช•เชฐเซ‹ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚, เชคเชฎเชพเชฐเซ‡ เชชเชนเซ‡เชฒเชพ เช เชธเชฎเชœเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช•เซ‡ Argo CD เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡.

เชฆเชฐเซ‡เช• เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฎเชพเชŸเซ‡, เชคเซ‡เชฎเชพเช‚ เชฌเซ‡ เชคเชฌเช•เซเช•เชพเช“ เช›เซ‡:

  • Init โ€” เชœเชฎเชพเชตเชŸ เชชเชนเซ‡เชฒเชพเช‚ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชคเซˆเชฏเชพเชฐเซ€, เช…เชนเซ€เช‚ เช•เช‚เชˆเชชเชฃ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡: เช…เชตเชฒเช‚เชฌเชจ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเซเช‚, เชฐเชนเชธเซเชฏเซ‹เชจเซ‡ เช…เชจเชชเซ…เช• เช•เชฐเชตเซเช‚ เช…เชจเซ‡ เชตเชงเซ.
  • เชชเซ‡เชฆเชพ โ€” เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชœเชจเชฐเซ‡เชถเชจ เช•เชฎเชพเชจเซเชกเชจเซ‡ เชธเซ€เชงเซเช‚ เชœ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเซ€เชจเซ‡, เช†เช‰เชŸเชชเซเชŸ เชฎเชพเชจเซเชฏ YAML เชธเซเชŸเซเชฐเซ€เชฎ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช, เช•เซเชฒเชธเซเชŸเชฐ เชชเชฐ เช† เชฌเชฐเชพเชฌเชฐ เชฒเชพเช—เซ เชฅเชถเซ‡.

เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฌเชพเชฌเชค เช เช›เซ‡ เช•เซ‡ เช†เชฐเซเช—เซ‹ เชนเซ‡เชฒเซเชฎ เชธเชนเชฟเชค เช•เซ‹เชˆเชชเชฃ เชชเซเชฐเช•เชพเชฐเชจเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฎเชพเชŸเซ‡ เช† เช…เชญเชฟเช—เชฎ เชฒเชพเช—เซ เช•เชฐเซ‡ เช›เซ‡. เชเชŸเชฒเซ‡ เช•เซ‡, เช†เชฐเซเช—เซ‹ เชธเซ€เชกเซ€ เชนเซ‡เชฒเซเชฎ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชชเซเชฐเช•เชพเชถเชจเซ‹ เชœเชฎเชพเชตเชคเซเช‚ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฎเชพเชคเซเชฐ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡.

เชคเซ‡เชจเชพ เชญเชพเช— เชฎเชพเชŸเซ‡, เช†เชฐเซเช—เซ‹ เชนเซ‡เชฒเซเชฎ เชนเซเช•เซเชธเชจเซ‡ เชฎเซ‚เชณ เชฐเซ€เชคเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เชœเซ‡ เชคเซ‡เชจเซ‡ เชฐเชฟเชฒเซ€เช เชฒเชพเช—เซ เช•เชฐเชตเชพเชจเชพ เชคเชฐเซเช•เชจเซเช‚ เช‰เชฒเซเชฒเช‚เช˜เชจ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เช•เซเชฏเซเชฌเซ€เช‡เชธเซ€

Qbec เชคเชฎเชจเซ‡ jsonnet เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเชจเซเช‚ เชธเชนเซ‡เชฒเชพเช‡เชฅเซ€ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพเชจเซ€ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡ เช‰เชชเชฐเชพเช‚เชค เชนเซ‡เชฒเซเชฎ เชšเชพเชฐเซเชŸเซเชธ เชฐเซ‡เชจเซเชกเชฐ เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เชชเชฃ เชงเชฐเชพเชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เช†เชฐเซเช—เซ‹ เชธเซ€เชกเซ€ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชนเซ‡เชฒเซเชฎ เชนเซเช•เซเชธ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เช†เชฐเซเช—เซ‹ เชธเซ€เชกเซ€ เชธเชพเชฅเซ‡ เช† เชธเซเชตเชฟเชงเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฅเซ€ เชคเชฎเซ‡ เชตเชงเซ เชธเชพเชšเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

argocd เชฎเชพเช‚ qbec เชธเชชเซ‹เชฐเซเชŸ เช‰เชฎเซ‡เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เชฌเซ‡ เชตเชธเซเชคเซเช“เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

  • Argo CD เชฐเซ‚เชชเชฐเซ‡เช–เชพเชฎเชพเช‚, เชคเชฎเชพเชฐเซเช‚ เช•เชธเซเชŸเชฎ เชชเซเชฒเช—เช‡เชจ เช…เชจเซ‡ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เช†เชฆเซ‡เชถเซ‹ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เชนเซ‹เชตเชพ เชœเซ‹เชˆเช.
  • เชœเชฐเซ‚เชฐเซ€ เชฆเซเชตเชฟเชธเช‚เช—เซ€เช“ เชˆเชฎเซ‡เชœเชฎเชพเช‚ เช‰เชชเชฒเชฌเซเชง เชนเซ‹เชตเชพ เชœเซ‹เชˆเช argocd-เชฐเซ‡เชชเซ‹-เชธเชฐเซเชตเชฐ.

เชชเซเชฐเชฅเชฎ เช•เชพเชฐเซเชฏ เชจเช•เซเช•เซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡ เช–เซ‚เชฌ เชธเชฐเชณ:

# 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

เชšเชฒเชฎเชพเช‚ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เช†เชชเชฃเซ‡ เชชเชฐเซเชฏเชพเชตเชฐเชฃเชจเซเช‚ เชจเชพเชฎ เชชเชธเชพเชฐ เช•เชฐเซ€เช เช›เซ€เช เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เช†เชชเชฃเซ‡ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เชฒเชพเช—เซ เช•เชฐเซ€เช เช…เชจเซ‡ เชœเซ‹เชˆเช เช•เซ‡ เช†เชชเชฃเชจเซ‡ เชถเซเช‚ เชฎเชณเซ‡ เช›เซ‡:

เช†เชฐเซเช—เซ‹ เชธเซ€เชกเซ€เชฎเชพเช‚ เช•เชธเซเชŸเชฎ เชŸเซ‚เชฒเชฟเช‚เช—เชจเซ‡ เชธเชฎเชœเชตเซเช‚

เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชœเชฎเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡, เชฎเชนเชพเชจ!

git-เช•เซเชฐเชฟเชชเซเชŸ

Git-crypt เชคเชฎเชจเซ‡ เชคเชฎเชพเชฐเซ€ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เชฎเชพเชŸเซ‡ เชชเชพเชฐเชฆเชฐเซเชถเช• เชเชจเซเช•เซเชฐเชฟเชชเซเชถเชจ เชธเซ‡เชŸ เช•เชฐเชตเชพ เชฆเซ‡ เช›เซ‡. เชธเช‚เชตเซ‡เชฆเชจเชถเซ€เชฒ เชกเซ‡เชŸเชพเชจเซ‡ เชธเซ€เชงเชพ เช—เชฟเชŸเชฎเชพเช‚ เชธเซเชŸเซ‹เชฐ เช•เชฐเชตเชพเชจเซ€ เช† เชเช• เชธเชฐเชณ เช…เชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชฐเซ€เชค เช›เซ‡.

เช—เชฟเชŸ-เช•เซเชฐเชฟเชชเซเชŸเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชตเชงเซ เชฎเซเชถเซเช•เซ‡เชฒ เชฌเชจเซเชฏเซเช‚.

เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชฐเซ€เชคเซ‡ เช†เชชเชฃเซ‡ เช•เชฐเซ€ เชถเช•เซ€เช git-crypt unlock เช…เชฎเชพเชฐเชพ เช•เชธเซเชŸเชฎ เชชเซเชฒเช—เช‡เชจเชจเชพ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชคเชฌเช•เซเช•เซ‡, เชชเชฐเช‚เชคเซ เช† เช–เซ‚เชฌ เช…เชจเซเช•เซ‚เชณ เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชฎเซ‚เชณ เชœเชฎเชพเชตเชŸ เชชเชฆเซเชงเชคเชฟเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเชคเซเช‚ เชจเชฅเซ€. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชนเซ‡เชฒเซเชฎ เช…เชจเซ‡ เชœเซ‡เชธเซ‹เชจเซ‡เชŸเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช…เชฎเซ‡ เชฒเชตเชšเซ€เช• GUI เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เช—เซเชฎเชพเชตเซ€เช เช›เซ€เช เชœเซ‡ เช…เชฎเชจเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ (เชฎเซ‚เชฒเซเชฏเซ‹ เชซเชพเช‡เชฒเซ‹, เชตเช—เซ‡เชฐเซ‡) เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพ เชฆเซ‡ เช›เซ‡.

เช† เช•เชพเชฐเชฃเซ‡ เชนเซเช‚ เช•เซเชฒเซ‹เชจเชฟเช‚เช— เชฆเชฐเชฎเชฟเชฏเชพเชจ เช…เช—เชพเช‰เชจเชพ เชคเชฌเช•เซเช•เซ‡ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€ เชชเซเชฐเชฟเชจเซเชŸ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเซ‹ เชนเชคเซ‹.

เช† เช•เซเชทเชฃเซ‡ เช†เชฐเซเช—เซ‹ เชธเซ€เชกเซ€ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซ‡ เชธเชฟเช‚เช•เซเชฐเชจเชพเช‡เช เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‹เชˆเชชเชฃ เชนเซเช•เซเชธเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชคเซ€ เชจเชฅเซ€, เชคเซ‡เชฅเซ€ เช…เชฎเชพเชฐเซ‡ เช† เชฎเชฐเซเชฏเชพเชฆเชพเชจเซ‡ เชฎเซเชถเซเช•เซ‡เชฒ เชถเซ‡เชฒ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชธเชพเชฅเซ‡ เชฎเซ‡เชณเชตเชตเซ€ เชชเชกเซ€ เชนเชคเซ€ เชœเซ‡ 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

เช†เชฐเซเช—เซ‹ เชธเซ€เชกเซ€ เช•เชฐเซ‡ เช›เซ‡ 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

เชนเชตเซ‡ เช†เชชเชฃเซ‡ เชตเชฟเชšเชพเชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช•เซ‡ เช†เชฐเซเช—เซ‹ เช†เชชเชฃเซ€ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชกเชฟเช•เซเชฐเชฟเชชเซเชŸ เช•เชฐเชถเซ‡. เชœเซ‡เชฎ เช•เซ‡, เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ 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-เชฐเซ‡เชชเซ‹-เชธเชฐเซเชตเชฐ, เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชœเชฎเชพเชตเชŸเชจเซ‡ เชธเช‚เชชเชพเชฆเชฟเชค เช•เชฐเซ‹:

$ 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

เชœเซเชฏเชพเชฐเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชถเชฐเซ‚ เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เช†เชฐเซเช—เซ‹ เชธเซ€เชกเซ€ เช†เชชเชฎเซ‡เชณเซ‡ เช† เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚เชฅเซ€ 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]

เชธเชฐเชธ, เช•เซ€ เชฒเซ‹เชก เชฅเชˆ เช—เชˆ เช›เซ‡! เชนเชตเซ‡ เช…เชฎเชพเชฐเซ‡ เช…เชฎเชพเชฐเชพ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชธเชนเชฏเซ‹เช—เซ€ เชคเชฐเซ€เช•เซ‡ เช†เชฐเซเช—เซ‹ เชธเซ€เชกเซ€ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชซเซเชฒเชพเชฏ เชชเชฐ เชคเซ‡เชจเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เชกเชฟเช•เซเชฐเชฟเชชเซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เชธเช•เซเชทเชฎ เชนเชถเซ‡.

เชธเซเชฅเชพเชจเชฟเช• เช•เชฎเซเชชเซเชฏเซเชŸเชฐ เชชเชฐ เช•เซ€ เช†เชฏเชพเชค เช•เชฐเซ‹:

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

เชšเชพเชฒเซ‹ เชตเชฟเชถเซเชตเชพเชธ เชธเซเชคเชฐ เชธเซ‡เชŸ เช•เชฐเซ€เช:

$ gpg --edit-key 8CB8B24F50B4797D
trust
5

เชšเชพเชฒเซ‹ เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ เชธเชนเชฏเซ‹เช—เซ€ เชคเชฐเซ€เช•เซ‡ เช†เชฐเซเช—เซ‹ เช‰เชฎเซ‡เชฐเซ€เช:

$ git-crypt add-gpg-user 8CB8B24F50B4797D

เชธเช‚เชฌเช‚เชงเชฟเชค เชฒเชฟเช‚เช•เซเชธ:

เชธเซ‹เชฐเซเชธ: www.habr.com

DDoS เชธเซเชฐเช•เซเชทเชพ, VPS VDS เชธเชฐเซเชตเชฐ เชงเชฐเชพเชตเชคเซ€ เชธเชพเช‡เชŸเซเชธ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชนเซ‹เชธเซเชŸเชฟเช‚เช— เช–เชฐเซ€เชฆเซ‹ ๐Ÿ”ฅ DDoS เชธเซเชฐเช•เซเชทเชพ, VPS VDS เชธเชฐเซเชตเชฐเซเชธ เชธเชพเชฅเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชตเซ‡เชฌเชธเชพเช‡เชŸ เชนเซ‹เชธเซเชŸเชฟเช‚เช— เช–เชฐเซ€เชฆเซ‹ | ProHoster