เด†เตผเด—เต‹ เดธเดฟเดกเดฟเดฏเดฟเตฝ เด•เดธเตเดฑเตเดฑเด‚ เดŸเต‚เดณเดฟเด‚เด—เต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เด†เตผเด—เต‹ เดธเดฟเดกเดฟเดฏเดฟเตฝ เด•เดธเตเดฑเตเดฑเด‚ เดŸเต‚เดณเดฟเด‚เด—เต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เดŽเดดเตเดคเดฟ เด•เตเดฑเดšเตเดšเต เดธเดฎเดฏเด‚ เด•เดดเดฟเดžเตเดžเต เด†เดฆเตเดฏ เดฒเต‡เด–เดจเด‚, เดžเดพเตป jsonnet เด‰เด‚ gitlab เด‰เด‚ เดธเดฎเตผเดคเตเดฅเดฎเดพเดฏเดฟ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดฟเดŸเดคเตเดคเต, เดชเตˆเดชเตเดชเต เดฒเตˆเดจเตเด•เตพ เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚ เดจเดฒเตเดฒเดคเดพเดฃเต†เดจเตเดจเตเด‚ เดŽเดจเตเดจเดพเตฝ เด…เดจเดพเดตเดถเตเดฏเดฎเดพเดฏเดฟ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดตเตเด‚ เด…เดธเต—เด•เดฐเตเดฏเดฎเตเดณเตเดณเดคเตเดฎเดพเดฃเต†เดจเตเดจเต เดžเดพเตป เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดฟ.

เดฎเดฟเด•เตเด• เด•เต‡เดธเตเด•เดณเดฟเดฒเตเด‚, เด’เดฐเต เดธเดพเดงเดพเดฐเดฃ เดŸเดพเดธเตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฃเต: "YAML เดธเตƒเดทเตเดŸเดฟเดšเตเดšเต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเตฝ เด‡เดŸเตเด•." เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ, เด‡เดคเดพเดฃเต เด†เตผเด—เต‹ เดธเดฟเดกเดฟ เดถเตเดฐเดฆเตเดงเต‡เดฏเดฎเดพเดฏเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต.

เด’เดฐเต Git เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ เด•เดฃเด•เตเดฑเตเดฑเตเดšเต†เดฏเตเดฏเดพเดจเตเด‚ เด…เดคเดฟเดจเตเดฑเต† เด…เดตเดธเตเดฅ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต‡เด•เตเด•เต เด…เดฏเดฏเตเด•เตเด•เดพเดจเตเด‚ Argo CD เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ, เดจเดฟเดฐเดตเดงเดฟ เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เตเดณเตเดณ เดชเดฟเดจเตเดคเตเดฃเดฏเตเดฃเตเดŸเต: เด•เดธเตเดฑเตเดฑเดฎเตˆเดธเต, เดนเต†เตฝเด‚ เดšเดพเตผเดŸเตเดŸเตเด•เตพ, เด•เตโ€Œเดธเต‹เดฃเดฑเตเดฑเต, เดฌเต†เดฏเตผ เดœเต†เดธเต‹เดจเต†เดฑเตเดฑเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ YAML/JSON เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เดณเตเดณเตเดณ เดกเดฏเดฑเด•เตเดŸเดฑเดฟเด•เตพ.

เดˆ เดธเต†เดฑเตเดฑเต เดฎเดฟเด•เตเด• เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เตเด‚ เดฎเดคเดฟเดฏเดพเด•เตเด‚, เดŽเดจเตเดจเดพเตฝ เดŽเดฒเตเดฒเดพเดตเตผเด•เตเด•เตเด‚ เด…เดฒเตเดฒ. เดŽเดฒเตเดฒเดพเดตเดฐเตเดŸเต†เดฏเตเด‚ เด†เดตเดถเตเดฏเด™เตเด™เตพ เดจเดฟเดฑเดตเต‡เดฑเตเดฑเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ, เด†เตผเด—เต‹ เดธเดฟเดกเดฟเด•เตเด•เต เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เดŸเต‚เดณเดฟเด‚เด—เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเตเดฃเตเดŸเต.

เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดชเดฟเดจเตเดคเตเดฃ เดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดธเดพเดงเตเดฏเดคเดฏเดฟเตฝ เดŽเดจเดฟเด•เตเด•เต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดฃเตเดŸเต qbec ะธ git-crypt, เดฎเตเตป เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเดฟ เดšเตผเดšเตเดš เดšเต†เดฏเตเดคเดต.

เดจเดฟเด™เตเด™เตพ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต, เด†เตผเด—เต‹ เดธเดฟเดกเดฟ เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพ เด†เดฆเตเดฏเด‚ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

เดšเต‡เตผเดคเตเดค เด“เดฐเต‹ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด‚ เดฐเดฃเตเดŸเต เด˜เดŸเตเดŸเด™เตเด™เดณเตเดฃเตเดŸเต:

  • เด‡เดตเดฏเต† โ€” เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดจเต เดฎเตเดฎเตเดชเตเดณเตเดณ เดชเตเดฐเดพเดฐเด‚เดญ เดคเดฏเตเดฏเดพเดฑเต†เดŸเตเดชเตเดชเต, เด‡เดตเดฟเดŸเต† เดŽเดจเตเดคเตเด‚ เดธเด‚เดญเดตเดฟเด•เตเด•เดพเด‚: เดกเดฟเดชเตปเดกเตปเดธเดฟเด•เตพ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•, เดฐเดนเดธเตเดฏเด™เตเด™เตพ เด…เตบเดชเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเตเด• เดŽเดจเตเดจเดฟเดตเดฏเตเด‚ เดฎเดฑเตเดฑเตเด‚.
  • เดœเดจเดฑเต‡เดฑเตเดฑเต โ€” เดจเต‡เดฐเดฟเดŸเตเดŸเต เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเต เดœเดจเดฑเต‡เดทเตป เด•เดฎเดพเตปเดกเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เด’เดฐเต เดธเดพเดงเตเดตเดพเดฏ YAML เดธเตเดŸเตเดฐเต€เด‚ เด†เดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚, เด‡เดคเดพเดฃเต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต.

เดนเต†เตฝเด‚ เด‰เตพเดชเตเดชเต†เดŸเต† เดเดคเต เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเดฒเตเด‚ เด†เตผเด—เต‹ เดˆ เดธเดฎเต€เดชเดจเด‚ เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเดพเดฃเต เดถเตเดฐเดฆเตเดงเต‡เดฏเดฎเดพเดฏ เด•เดพเดฐเตเดฏเด‚. เด…เดคเดพเดฏเดคเต, เด†เตผเด—เต‹ เดธเดฟเดกเดฟเดฏเดฟเตฝ เดนเต†เตฝเด‚ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เต เดฑเดฟเดฒเต€เดธเตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ, เดฎเดฑเดฟเดšเตเดšเต เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต.

เด…เดคเดฟเดจเตเดฑเต† เดญเดพเด—เดฎเดพเดฏเดฟ, เด†เตผเด—เต‹เดฏเตเด•เตเด•เต เดนเต†เตฝเด‚ เดนเตเด•เตเด•เตเด•เตพ เดจเต‡เดฑเตเดฑเต€เดตเต เด†เดฏเดฟ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚, เด‡เดคเต เดฑเดฟเดฒเต€เดธเตเด•เตพ เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฑเต† เดฏเตเด•เตเดคเดฟ เดฒเด‚เด˜เดฟเด•เตเด•เดพเดคเดฟเดฐเดฟเด•เตเด•เดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เด•เตเดฏเตเดฌเดฟเด‡เดธเดฟ

jsonnet เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเตเดณเตเดณ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฏเดฟ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเตป Qbec เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดนเต†เตฝเด‚ เดšเดพเตผเดŸเตเดŸเตเด•เตพ เดฑเต†เตปเดกเตผ เดšเต†เดฏเตเดฏเดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเตเด‚ เด‰เดฃเตเดŸเต, เด•เต‚เดŸเดพเดคเต† Argo CD เดจเต เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ Helm เดนเตเด•เตเด•เตเด•เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเดฎเต†เดจเตเดจเดคเดฟเดจเดพเตฝ, Argo CD เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดˆ เดธเดตเดฟเดถเต‡เดทเดค เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เด•เต‚เดŸเตเดคเตฝ เดถเดฐเดฟเดฏเดพเดฏ เดซเดฒเด™เตเด™เตพ เดจเต‡เดŸเดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

qbec เดชเดฟเดจเตเดคเตเดฃ argocd-เดฒเต‡เด•เตเด•เต เดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฐเดฃเตเดŸเต เด•เดพเดฐเตเดฏเด™เตเด™เตพ เด†เดตเดถเตเดฏเดฎเดพเดฃเต:

  • เด†เตผเด—เต‹ เดธเดฟเดกเดฟ เด•เต‹เตบเดซเดฟเด—เดฑเดฟเตฝ, เดจเดฟเด™เตเด™เดณเตเดŸเต† เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เดชเตเดฒเด—เดฟเดจเตเด‚ เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด•เดฎเดพเตปเดกเตเด•เดณเตเด‚ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เดฃเด‚.
  • เด†เดตเดถเตเดฏเดฎเดพเดฏ เดฌเตˆเดจเดฑเดฟเด•เตพ เดšเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ เดฒเดญเตเดฏเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚ เด†เตผเด—เต‹เดธเดฟเดกเดฟ-เดฑเดฟเดชเตเดชเต‹-เดธเต†เตผเดตเตผ.

เด†เดฆเตเดฏ เดšเตเดฎเดคเดฒ เดคเต€เดฐเตเดฎเดพเดจเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต เดตเดณเดฐเต† เดฒเดณเดฟเดคเด‚:

# 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

เด’เดฐเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเตฝ ENVIRONMENT เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸ เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟเดฏเตเดŸเต† เดชเต‡เดฐเต เดžเด™เตเด™เตพ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเต.

เดจเดฎเตเด•เตเด•เต เด‡เดคเต เดชเตเดฐเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฎเตเด•เตเด•เต เดŽเดจเตเดคเดพเดฃเต เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚:

เด†เตผเด—เต‹ เดธเดฟเดกเดฟเดฏเดฟเตฝ เด•เดธเตเดฑเตเดฑเด‚ เดŸเต‚เดณเดฟเด‚เด—เต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเต, เด•เตŠเดณเตเดณเดพเด‚!

git-crypt

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเด•เตเด•เดพเดฏเดฟ เดธเตเดคเดพเดฐเตเดฏเดฎเดพเดฏ เดŽเตปเด•เตเดฐเดฟเดชเตเดทเตป เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเตป Git-crypt เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เดธเต†เตปเดธเดฟเดฑเตเดฑเต€เดตเต เดกเดพเดฑเตเดฑ เดจเต‡เดฐเดฟเดŸเตเดŸเต git-เตฝ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฒเดณเดฟเดคเดตเตเด‚ เดธเตเดฐเด•เตเดทเดฟเดคเดตเตเดฎเดพเดฏ เดฎเดพเตผเด—เดฎเดพเดฃเดฟเดคเต.

เดœเดฟเดฑเตเดฑเต-เด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเต เด•เต‚เดŸเตเดคเตฝ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณเดคเดพเดฏเดฟ เดฎเดพเดฑเดฟ.

เดธเตˆเดฆเตเดงเดพเดจเตเดคเดฟเด•เดฎเดพเดฏเดฟ เดจเดฎเตเด•เตเด•เต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚ git-crypt unlock เดžเด™เตเด™เดณเตเดŸเต† เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เดชเตเดฒเด—เดฟเดจเตเดฑเต† init เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ, เดชเด•เตเดทเต‡ เด‡เดคเต เดตเดณเดฐเต† เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ เด‡เดคเต เดจเต‡เดฑเตเดฑเต€เดตเต เดตเดฟเดจเตเดฏเดพเดธ เดฐเต€เดคเดฟเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เดฟเดฒเตเดฒ. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดนเต†เตฝเดฎเดฟเดจเตเดฑเต†เดฏเตเด‚ เดœเต†เดธเต‹เดฃเดฑเตเดฑเดฟเดจเตเดฑเต†เดฏเตเด‚ เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป (เดฎเต‚เดฒเตเดฏ เดซเดฏเดฒเตเด•เตพ เดฎเตเดคเดฒเดพเดฏเดต) เดฒเดณเดฟเดคเดฎเดพเด•เตเด•เดพเตป เดžเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดซเตเดฒเต†เด•เตเดธเดฟเดฌเดฟเตพ เดœเดฟเดฏเตเด เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดžเด™เตเด™เตพเด•เตเด•เต เดจเดทเตโ€ŒเดŸเดชเตเดชเต†เดŸเตเด‚.

เด…เดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เด•เตเดฒเต‹เดฃเดฟเด‚เด—เต เดธเดฎเดฏเดคเตเดคเต เดถเต‡เด–เดฐเด‚ เด†เดฆเตเดฏเด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ เด…เดšเตเดšเดŸเดฟเด•เตเด•เดพเตป เดžเดพเตป เด†เด—เตเดฐเดนเดฟเดšเตเดšเดคเต.

เดถเต‡เด–เดฐเด‚ เดธเดฎเดจเตเดตเดฏเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดนเตเด•เตเด•เตเด•เดณเตŠเดจเตเดจเตเด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเต เด‡เดชเตเดชเต‹เตพ เด†เตผเด—เต‹ เดธเดฟเดกเดฟ เดจเตฝเด•เตเดจเตเดจเดฟเดฒเตเดฒ เดŽเดจเตเดจเดคเดฟเดจเดพเตฝ, เดœเดฟเดฑเตเดฑเต เด•เดฎเดพเตปเดกเดฟเดจเต เดชเด•เดฐเด‚ เดตเดฏเตเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดคเดจเตเดคเตเดฐเดชเดฐเดฎเดพเดฏ เดทเต†เตฝ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเด™เตเด™เตพเด•เตเด•เต เดˆ เดชเดฐเดฟเดฎเดฟเดคเดฟ เดฎเดฑเดฟเด•เดŸเด•เตเด•เต‡เดฃเตเดŸเดฟ เดตเดจเตเดจเต:

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

เด†เตผเด—เต‹ เดจเดฎเตเดฎเตเดŸเต† เดถเต‡เด–เดฐเดฃเด™เตเด™เดณเต† เดŽเด™เตเด™เดจเต† เดกเต€เด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดฎเต†เดจเตเดจเต เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเดฎเตพ เดšเดฟเดจเตเดคเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด…เดคเดพเดฏเดคเต, เด…เดคเดฟเดจเดพเดฏเดฟ เด’เดฐเต เดœเดฟเดชเดฟเดœเดฟ เด•เต€ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•:

$ 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

เด…เดคเต เด•เดฃเตเดŸเต†เดฏเตเดจเดฑเดฟเดฒเต‡เด•เตเด•เต เดŽเดฑเดฟเดฏเตเด• เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เดžเด™เตเด™เตพเด•เตเด•เต เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเดคเต เด†เตผเด—เต‹เดธเดฟเดกเดฟ-เดฑเดฟเดชเตเดชเต‹-เดธเต†เตผเดตเตผ, เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดตเดฟเดจเตเดฏเดพเดธเด‚ เดŽเดกเดฟเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•:

$ 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

เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเตผ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ 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]

เด•เตŠเดณเตเดณเดพเด‚, เด•เต€ เดฒเต‹เดกเต เดšเต†เดฏเตเดคเต! เด‡เดชเตเดชเต‹เตพ เด’เดฐเต เดธเดนเด•เดพเดฐเดฟ เดŽเดจเตเดจ เดจเดฟเดฒเดฏเดฟเตฝ เด†เตผเด—เต‹ เดธเดฟเดกเดฟ เดžเด™เตเด™เดณเตเดŸเต† เดถเต‡เด–เดฐเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดšเต‡เตผเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต, เด…เดคเต เดˆเดšเตเดšเดฏเดฟเตฝ เดธเตเดตเดฏเดฎเต‡เดต เดกเต€เด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚.

เดฒเต‹เด•เตเด•เตฝ เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเดฑเดฟเดฒเต‡เด•เตเด•เต เด•เต€ เด‡เดฎเตเดชเต‹เตผเดŸเตเดŸเตเดšเต†เดฏเตเดฏเตเด•:

$ 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