זמן וטריאז'
תקציב זמן באחוזים (הצעה)
Section titled “תקציב זמן באחוזים (הצעה)”מכפילים את האחוז בזמן הכולל. העמודה הימנית היא דוגמה ל-240 דקות, להמחשה בלבד.
| שלב | % מהזמן | דוגמה ל-240 דקות |
|---|---|---|
| קריאה ומיפוי בלי להקליד (worksheet) | 6 | 14 |
preflight וסביבה (env.sh, SSH, runner) | 4 | 10 |
| repos + tokens + variables + runner | 8 | 19 |
| build + publish ל-GitLab Container Registry | 10 | 24 |
promote (promote.sh, versions/<ENV>.yaml) | 4 | 10 |
values + helm template על כל ה-envs | 16 | 38 |
| Secrets לכל namespace + Applications ב-Argo | 12 | 29 |
| אימות envs (סולם האימות) | 8 | 19 |
| observability (חלק ה-MUST) | 4 | 10 |
| cleanup + רצף אידמפוטנטי + last-20-minutes | 8 | 19 |
| סה"כ MUST | 80 | 192 |
| יצירתיות (creativity), רק אם הסולם ירוק | עד 15 | עד 36 |
| חוצץ לתקלות לא צפויות | 5 | 12 |
איך מוודאים: באמצע הזמן (50%) אתה אמור להיות בסוף שלב values + render, כלומר בערך 50% מהשורות למעלה גמורות. אם לא, עבור לטבלת הטריאז' למטה.
מתי עוברים הלאה
Section titled “מתי עוברים הלאה”כלל אחד: כל חסימה מקבלת timebox, ואחריו מתעדים ועוברים לשלב שלא תלוי בה.
| מצב | timebox | מה עושים כשהזמן נגמר |
|---|---|---|
| שגיאה שלא הבנת | 2 דקות לקרוא מלמטה למעלה | פרוטוקול when-stuck |
| חסימה אחרי הפרוטוקול | 10 דקות | כותבים שורה ב-NOTES.txt (למטה) ועוברים הלאה |
| שלב שלם נכשל אחרי 15 דקות | 15 דקות | לא עוצרים את כל המבחן: ממשיכים במסלול המקביל |
| המתנה (pipeline, sync) | לא מחכים בטל | עושים בינתיים משהו מהמסלול השני |
שני מסלולים שלא תלויים זה בזה עד שה-Argo צריך את ה-tag:
| מסלול CI | מסלול cluster |
|---|---|
| runner, variables, build, publish, promote | values, helm template, Secrets, Applications |
CI חסום? ממשיכים עם --set-string defaultImageTag=probe ב-render ובונים את צד ה-cluster. Argo חסום? מתקדמים ב-promote ו-verify script. כך שתי חסימות לא הופכות לחסימה אחת.
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”מפגרים? מוותרים מלמעלה למטה בטבלה. אף פעם לא מוותרים על שורה בקבוצת "לא מוותרים".
| סדר ויתור | פריט | סוג | הערה |
|---|---|---|---|
| 1 | sensor-outage על המפה ושאר STRETCH | STRETCH | לא נוגע ב-MUST |
| 2 | כל ה-creativity | תוספת | רק אחרי סולם ירוק |
| 3 | Loki / Tempo / Alloy | SHOULD | נשארים כ-source בהערה, לא שבורים |
| 4 | NetworkPolicies | SHOULD | אחרי שהכול ירוק, ואם ה-CNI אוכף |
| 5 | ליטוש README / הערות | נחמד | לא הקוד |
| לא מוותרים | promote chain: dev ל-DEV, main ל-STAGING, כפתור ל-PROD | MUST | חוזה delivery |
| Secrets בכל namespace, pull Secret ל-GitLab Container Registry | MUST | בלעדיו ImagePullBackOff | |
| automated + selfHeal + prune, root היחיד שהוחל ידנית | MUST | חוזה GitOps | |
cleanup.sh אידמפוטנטי + verify-clean | MUST | נבדק פעמיים | |
| אין token/סיסמה ב-Git; אין TODO/placeholder | MUST | last-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)
kubectl -n argocd get applicationskubectl get pods -A --field-selector=status.phase!=Runningkubectl get deploy -A --no-headers | awk '$3 ~ /^0\//'pgrep -af 'kubectl (port-forward|.* -w)'איך מוודאים: הפקודה הראשונה: הכול Synced/Healthy. השנייה: רק Pods שהסיבה ידועה (Completed של Job ישן אינו בעיה). השלישית והרביעית: ריקות. פירוט הסולם: verify/overview.
תרגול הלילה: ריצה מלאה מאפס
Section titled “תרגול הלילה: ריצה מלאה מאפס”המטרה: לדעת כמה זמן כל תחנה לוקחת אצלך ואיפה זה כואב, לפני שזה קורה במבחן. ריצה אחת מתוזמנת שווה יותר משלוש קריאות.
- מאפסים (על ה-cluster של התרגול בלבד): הרצף מ-verify/cleanup, ואז clone חדש לתיקייה חדשה.
- shell נקי: חלון חדש בלי
exportישנים, כדי שה-env.shשלך יוכח. - טוענים את שעון העצר (למטה), ומריצים
st start reposו-st end repos(שם תחנה חופשי) סביב כל תחנה לפי order-of-work. - לא מסתכלים בדפים בלי סיבה. כל פעם שפתחת דף, רושמים אותו בעמודת "where it hurt".
- בסוף: סולם אימות מלא + הרצף האידמפוטנטי + last-20-minutes.
- ממלאים את הטבלה ומתקנים את דבר אחד בכל שורה כואבת (script, alias, שורה ב-
env.sh), לא את כולן.
env -i HOME="$HOME" PATH="$PATH" bash --noprofile --norc# source this file: . ~/rehearsal/stamp.shTIMING="${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"}. ~/rehearsal/stamp.shst start repos# ... work ...st end reposreportאיך מוודאים: report מדפיס שורה לכל תחנה עם דקות; -1.0 = תחנה שהתחלת ולא סיימת (גם זה מידע). הסקריפט נבדק עם bash -n והרצה קצרה.
העתק את הטבלה לקובץ והשלם אחרי כל תחנה:
| station | start | end | minutes | where it hurt | fix for next time |
|---|---|---|---|---|---|
| repos + tokens + variables + runner | |||||
| build + publish | |||||
| promote | |||||
| values + render | |||||
| Secrets + Argo apps | |||||
| envs verified | |||||
| observability | |||||
| cleanup + idempotency | |||||
| last 20 minutes |