דלגו לתוכן

זמן וטריאז'

תקציב זמן באחוזים (הצעה)

Section titled “תקציב זמן באחוזים (הצעה)”

מכפילים את האחוז בזמן הכולל. העמודה הימנית היא דוגמה ל-240 דקות, להמחשה בלבד.

שלב% מהזמןדוגמה ל-240 דקות
קריאה ומיפוי בלי להקליד (worksheet)614
preflight וסביבה (env.sh, SSH, runner)410
repos + tokens + variables + runner819
build + publish ל-GitLab Container Registry1024
promote (promote.sh, versions/<ENV>.yaml)410
values + helm template על כל ה-envs1638
Secrets לכל namespace + Applications ב-Argo1229
אימות envs (סולם האימות)819
observability (חלק ה-MUST)410
cleanup + רצף אידמפוטנטי + last-20-minutes819
סה"כ MUST80192
יצירתיות (creativity), רק אם הסולם ירוקעד 15עד 36
חוצץ לתקלות לא צפויות512

איך מוודאים: באמצע הזמן (50%) אתה אמור להיות בסוף שלב values + render, כלומר בערך 50% מהשורות למעלה גמורות. אם לא, עבור לטבלת הטריאז' למטה.

כלל אחד: כל חסימה מקבלת timebox, ואחריו מתעדים ועוברים לשלב שלא תלוי בה.

מצבtimeboxמה עושים כשהזמן נגמר
שגיאה שלא הבנת2 דקות לקרוא מלמטה למעלהפרוטוקול when-stuck
חסימה אחרי הפרוטוקול10 דקותכותבים שורה ב-NOTES.txt (למטה) ועוברים הלאה
שלב שלם נכשל אחרי 15 דקות15 דקותלא עוצרים את כל המבחן: ממשיכים במסלול המקביל
המתנה (pipeline, sync)לא מחכים בטלעושים בינתיים משהו מהמסלול השני

שני מסלולים שלא תלויים זה בזה עד שה-Argo צריך את ה-tag:

מסלול CIמסלול cluster
runner, variables, build, publish, promotevalues, helm template, Secrets, Applications

CI חסום? ממשיכים עם --set-string defaultImageTag=probe ב-render ובונים את צד ה-cluster. Argo חסום? מתקדמים ב-promote ו-verify script. כך שתי חסימות לא הופכות לחסימה אחת.

runs on: any shell
note() { printf '%s | %s\n' "$(date +%H:%M)" "$*" >> NOTES.txt; }
note "promote: 403 on push; checked token project and Protect flag; next: Members of gitops"
git status --short

איך מוודאים: NOTES.txt מכיל שורה לכל חסימה פתוחה (לא ב-Git: הוסף אותו ל-.git/info/exclude). ה-working tree לא מכיל שינוי חצי-גמור שמשבית render.

על מה מוותרים ראשון: MUST / SHOULD / STRETCH

Section titled “על מה מוותרים ראשון: MUST / SHOULD / STRETCH”

מפגרים? מוותרים מלמעלה למטה בטבלה. אף פעם לא מוותרים על שורה בקבוצת "לא מוותרים".

סדר ויתורפריטסוגהערה
1sensor-outage על המפה ושאר STRETCHSTRETCHלא נוגע ב-MUST
2כל ה-creativityתוספתרק אחרי סולם ירוק
3Loki / Tempo / AlloySHOULDנשארים כ-source בהערה, לא שבורים
4NetworkPoliciesSHOULDאחרי שהכול ירוק, ואם ה-CNI אוכף
5ליטוש README / הערותנחמדלא הקוד
לא מוותריםpromote chain: dev ל-DEV, main ל-STAGING, כפתור ל-PRODMUSTחוזה delivery
Secrets בכל namespace, pull Secret ל-GitLab Container RegistryMUSTבלעדיו ImagePullBackOff
automated + selfHeal + prune, root היחיד שהוחל ידניתMUSTחוזה GitOps
cleanup.sh אידמפוטנטי + verify-cleanMUSTנבדק פעמיים
אין token/סיסמה ב-Git; אין TODO/placeholderMUSTlast-20-minutes
כל deliverable קיים ולא ריקMUSTהכשל "תוצר לא מוגש"

הסיווג לקוח מה-README של TRIDENT. בפרויקט המבחן חוזה המבחן הוא הקובע: אם סעיף SHOULD הוא MUST אצלו, הוא עולה בטבלה.

איך מוודאים: לפני כל ויתור שואלים "האם זה בשורת לא-מוותרים?". אם כן, לא מוותרים אלא מקצרים (למשל env אחד במקום שלושה, ורושמים).

להשאיר את ה-cluster ניתן לאימות

Section titled “להשאיר את ה-cluster ניתן לאימות”

מצב סופי טוב הוא לא רק "ירוק": זה מצב שמישהו אחר יכול לבדוק בפקודה אחת. עוברים על הרשימה בכל פעם שמפסיקים לעבוד לזמן ארוך, ובסוף.

  • כל ה-Applications Synced/Healthy, או אדומים עם סיבה ידועה שרשומה ב-NOTES.txt
  • אף שינוי לא נעשה ב-live: מה שרץ = מה שב-Git (אין OutOfSync שנוצר מ-kubectl edit/scale)
  • אין Deployment ב-0/… שנשאר מבדיקת self-heal
  • אין Pod ב-Pending/CrashLoopBackOff שלא הוסבר
  • אין process רקע (port-forward, -w) שרץ
  • הכול נדחף: git status נקי ו-git log @{u}..HEAD ריק בכל repo
  • פלט הסולם נשמר כראיה (last-20-minutes)
runs on: VM
kubectl -n argocd get applications
kubectl get pods -A --field-selector=status.phase!=Running
kubectl get deploy -A --no-headers | awk '$3 ~ /^0\//'
pgrep -af 'kubectl (port-forward|.* -w)'

איך מוודאים: הפקודה הראשונה: הכול Synced/Healthy. השנייה: רק Pods שהסיבה ידועה (Completed של Job ישן אינו בעיה). השלישית והרביעית: ריקות. פירוט הסולם: verify/overview.

תרגול הלילה: ריצה מלאה מאפס

Section titled “תרגול הלילה: ריצה מלאה מאפס”

המטרה: לדעת כמה זמן כל תחנה לוקחת אצלך ואיפה זה כואב, לפני שזה קורה במבחן. ריצה אחת מתוזמנת שווה יותר משלוש קריאות.

  1. מאפסים (על ה-cluster של התרגול בלבד): הרצף מ-verify/cleanup, ואז clone חדש לתיקייה חדשה.
  2. shell נקי: חלון חדש בלי export ישנים, כדי שה-env.sh שלך יוכח.
  3. טוענים את שעון העצר (למטה), ומריצים st start repos ו-st end repos (שם תחנה חופשי) סביב כל תחנה לפי order-of-work.
  4. לא מסתכלים בדפים בלי סיבה. כל פעם שפתחת דף, רושמים אותו בעמודת "where it hurt".
  5. בסוף: סולם אימות מלא + הרצף האידמפוטנטי + last-20-minutes.
  6. ממלאים את הטבלה ומתקנים את דבר אחד בכל שורה כואבת (script, alias, שורה ב-env.sh), לא את כולן.
runs on: VM
env -i HOME="$HOME" PATH="$PATH" bash --noprofile --norc
file: ~/rehearsal/stamp.sh
# source this file: . ~/rehearsal/stamp.sh
TIMING="${TIMING:-$HOME/rehearsal/timing.tsv}"
mkdir -p "$(dirname "$TIMING")"
st() { printf '%s\t%s\t%s\n' "$(date +%s)" "$1" "$2" >> "$TIMING"; } # st start|end <station>
report() {
awk -F'\t' '$2=="start"{s[$3]=$1; if(!($3 in o)){o[$3]=++n; nm[n]=$3}}
$2=="end"{e[$3]=$1}
END{printf "%-22s %7s\n","station","minutes"
for(i=1;i<=n;i++){k=nm[i]; printf "%-22s %7.1f\n", k, (e[k]?(e[k]-s[k])/60:-1)}}' "$TIMING"
}
runs on: VM
. ~/rehearsal/stamp.sh
st start repos
# ... work ...
st end repos
report

איך מוודאים: report מדפיס שורה לכל תחנה עם דקות; -1.0 = תחנה שהתחלת ולא סיימת (גם זה מידע). הסקריפט נבדק עם bash -n והרצה קצרה.

העתק את הטבלה לקובץ והשלם אחרי כל תחנה:

stationstartendminuteswhere it hurtfix for next time
repos + tokens + variables + runner
build + publish
promote
values + render
Secrets + Argo apps
envs verified
observability
cleanup + idempotency
last 20 minutes