
Π‘ΠΏΡΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠ»Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ , Π³Π΄Π΅ Ρ Π»ΠΎΠ²ΠΊΠΎ ΡΠΏΡΠ°Π²Π»ΡΠ»ΡΡ Ρ jsonnet ΠΈ Π³ΠΈΡΠ»Π°Π±ΠΎΠΌ, Ρ ΠΏΠΎΠ½ΡΠ» ΡΡΠΎ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ ΡΡΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ Ρ ΠΎΡΠΎΡΠΎ, Π½ΠΎ ΠΈΠ·Π»ΠΈΡΠ½Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΈ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΠΎ.
Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΈΠΏΠΎΠ²Π°Ρ Π·Π°Π΄Π°ΡΠ°: "ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ YAML ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ Π΅Π³ΠΎ Π² Kubernetes". Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Ρ ΡΠ΅ΠΌ Argo CD Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ.
Argo CD ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Git-ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΈ ΡΠΈΠ½ΠΊΠ°ΡΡ Π΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π² Kubernetes. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΅ΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π²ΠΈΠ΄ΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ: Kustomize, Helm ΡΠ°ΡΡΡ, Ksonnet, Π³ΠΎΠ»ΡΠΉ Jsonnet ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Ρ YAML/JSON ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ°ΠΌΠΈ.
ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΡΡΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, Π½ΠΎ Π½Π΅ Π²ΡΠ΅ΠΌ. ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠΈΡΡ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠΈ Π²ΡΠ΅Ρ ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π² Argo CD ΠΈΠΌΠ΅Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ custom tooling.
Π ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΈ , ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΏΠΎΠ»Π½Π° Π±ΡΠ»ΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½Ρ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅.
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΡΠΈΡΡΡΠΏΠΈΡΡ ΠΊ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, Π½ΡΠΆΠ½ΠΎ ΡΠ½Π°ΡΠ°Π»Π° ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Ρ ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ 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)"ΠΠ»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊΠΎΠ² ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ , ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ :
# 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 ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ ΡΠ»ΠΎΠΆΠ½Π΅Π΅.
Π’Π΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ 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 $ecArgo CD Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ 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-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-cmArgo 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
