
זמן מה לאחר הכתיבה , שם טיפלתי בזריזות ב-jsonnet וב-gitlab, הבנתי ש-pipelines הם כמובן טובים, אבל מסובכים ולא נוחים שלא לצורך.
ברוב המקרים, המשימה הטיפוסית הנדרשת היא "ליצור YAML ולהכניס אותו ל-Kubernetes". למעשה, זה מה ש-Argo CD עושה בצורה נפלאה.
Argo CD מאפשר לך לחבר מאגר Git ולהצמיד את מצבו ל-Kubernetes. כברירת מחדל, יש תמיכה במספר סוגים של יישומים: Kustomize, תרשימי Helm, Ksonnet, Jsonnet פשוט או סתם ספריות עם מניפסטים של YAML/JSON.
סט זה יספיק לרוב המשתמשים, אך לא לכולם. על מנת לספק את צרכי כולם, ל-Argo CD יש את היכולת להשתמש בכלים מותאמים אישית.
קודם כל, אני מעוניין באפשרות להוסיף תמיכה и , אשר נדונו בהרחבה במאמר הקודם.
לפני שנתחיל בהגדרה, ראשית עלינו להבין כיצד בדיוק Argo CD עובד.
עבור כל יישום נוסף, יש שני שלבים:
- init — הכנה ראשונית לפני הפריסה, זה יכול להיות כל דבר: הורדת תלויות, פירוק סודות וכו'.
- ליצור - ביצוע פקודת יצירת המניפסט ישירות, הפלט חייב להיות זרם YAML תקין, זה בדיוק מה שיוחל על האשכול.
מעניין לציין ש-Argo מיישמת גישה זו על כל סוג של אפליקציה, כולל Helm. כלומר, ב-Argo CD, Helm לא פורס גרסאות לאשכול, אלא משמש רק ליצירת מניפסטים.
מצידה, Argo יכולה לעבד Helm hooks באופן טבעי, מה שמאפשר לא להפר את ההיגיון של החלת שחרורים.
קיו-בק
Qbec מאפשר לך לתאר יישומים בצורה נוחה באמצעות jsonnet, וגם יש לו את היכולת לרנדר תרשימי Helm, ומכיוון ש-Argo CD יכול להתמודד עם Helm hooks כרגיל, שימוש בתכונה זו עם Argo CD מאפשר לך להשיג תוצאות מדויקות עוד יותר.
כדי להוסיף תמיכה ב-qbec ל-argocd אתה צריך שני דברים:
- קונפיגורציית Argo CD חייבת להגדיר את התוסף והפקודות המותאמים אישית שלך ליצירת מניפסטים.
- הקבצים הבינאריים הנדרשים חייבים להיות זמינים בתמונה שרת argocd-repo.
המשימה הראשונה די פשוט:
# 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במשתנה הסביבה אנו מעבירים את שם הסביבה שעבורה אנו צריכים ליצור מניפסטים.
בואו ניישם את זה ונראה מה נקבל:

האפליקציה נפרסה, מעולה!
גיט-קריפט
Git-crypt מאפשר לך להגדיר הצפנה שקופה של מאגר. זוהי דרך פשוטה ומאובטחת לאחסן נתונים רגישים ישירות ב-git.
יישום git-crypt התגלה כקשה יותר.
תיאורטית נוכל לעשות git-crypt unlock בשלב ה-init של התוסף המותאם אישית שלנו, אבל זה לא נוח במיוחד, מכיוון שזה לא יאפשר שימוש בשיטות פריסה מקוריות. לדוגמה, במקרה של Helm ו-Jsonnet, אנחנו מאבדים את ממשק ה-GUI הגמיש שמאפשר לנו לפשט את תצורת האפליקציה (קבצי ערכים וכו').
זו בדיוק הסיבה שרציתי לבצע פתיחת אטימת המאגר בשלב מוקדם יותר, במהלך השכפול.
מכיוון ש-Argo CD אינו מספק כרגע את היכולת לתאר ווים (hooks) לסנכרון מאגר, היינו צריכים לעקוף מגבלה זו בעזרת עטיפת סקריפט מעטפת חכמה שמחליפה את פקודת 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עכשיו אנחנו צריכים לחשוב איך 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, לשם כך נערוך את deployment:
$ 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-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קישורים קשורים:
מקור: www.habr.com
