נקודת בדיקה של קונטיינרים בקוברנטיס עם API מותאם אישית

הצהרת בעיה

אתגר

ארגונים המפעילים יישומים בקונטיינרים ב-Kubernetes לעיתים קרובות צריכים ללכוד ולשמור את מצב הקונטיינרים הפועלים עבור:

  • שחזור מאסון
  • מיגרציה של יישומים
  • ניפוי בעיות/פתרון בעיות
  • שימור מצב
  • שחזור סביבות

עם זאת, אין דרך פשוטה ומאוטומטית:

  1. ליצור נקודות בדיקה לקונטיינרים לפי דרישה
  2. לאחסן את נקודות הבדיקה בפורמט סטנדרטי
  3. להפוך אותן לנגישות בקלות בין אשכולות
  4. להפעיל נקודות בדיקה דרך ממשק סטנדרטי

מגבלות נוכחיות

  • יצירת נקודות בדיקה ידנית דורשת גישה ישירה לאשכול
  • אין פורמט אחסון סטנדרטי עבור נקודות בדיקה
  • אינטגרציה מוגבלת עם רישומי קונטיינרים
  • חוסר בגישה תכנותית עבור אוטומציה
  • תיאום מורכב בין containerd למערכות אחסון

פתרון

שירות צד של Kubernetes ש:

  1. מחשף את פונקציית נקודות הבדיקה דרך API REST
  2. ממיר אוטומטית נקודות בדיקה לדימויים התואמים ל-OCI
  3. מאחסן דימויים ב-ECR להפצה קלה
  4. מתממשק עם תשתית Kubernetes הקיימת
  5. מספק ממשק סטנדרטי עבור אוטומציה

זה פותר את הבעיות המרכזיות על ידי:

  • אוטומציה של תהליך נקודת הבדיקה
  • תקן אחסון נקודת בדיקה
  • הפוך את נקודות הבדיקה לניידות
  • אפשר גישה תכנותית
  • פשוט את השילוב עם זרימות העבודה הקיימות

משתמשים יעד:

  • צוותי DevOps
  • מהנדסי פלטפורמה
  • מפתחי אפליקציות
  • מהנדסי אמינות באתר (SREs)

איחסון נקודת בדיקת תיקיון מבוסס על Checkpoint/Restore In Userspace (CRIU) ומאפשר את יצירת העתקים עם סטטוס מצבי של קונטיינר פועל מבלי שהקונטיינר יודע שהוא נבדק. ההעתק של הקונטיינר ניתן לניתוח ושחזור בסביבת חול מרובות בלי שהקונטיינר המקורי יודע על כך. איחסון נקודת בדיקת תיקיון הוצג כתכונת אלפא ב-Kubernetes v1.25.

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

הקוד מקבל זיהוי פוד, ממשיך את זיהוי הקונטיינר מ-containerd כקלט, ואז משתמש בפקודת ctr על מנת לקחת נקודת בדיקה של הקונטיינר הספציפי במרחב השמות k8s.io של containerd:

תנאי קדם

  • אשכול Kubernetes
  • התקן את הכלי ctr commandline. אם ניתן להפעיל פקודות ctr על ה-kubelet או על צומת העבודה; אם לא, התקן או התאם את AMI כדי לכלול את ה-ctr
  • kubectl מוגדר כך שיתקשר עם האשכול שלך
  • התקן את Docker מקומית
  • גישה למחסן התוכניות (לדוגמה, Docker Hub, ECR)
  • Helm (להתקנת Nginx Ingress Controller)

שלב 0: קוד ליצירת נקודת בקרה של מיכל באמצעות GO

צור קובץ בשם checkpoint_container.go עם התוכן הבא:

Go

 

שלב 1: אתחל את מודול ה-go

Shell

 

שנה את קובץ ה-go.mod:

Go

 

הפעל את הפקודה הבאה:

Shell

 

שלב 2: בנה ופרסם תמונת Docker

צור קובץ Dockerfile באותו ספרייה:

Dockerfile

 

קובץ זה עושה את הבא:

  1. משתמש ב-golang:1.20 כשלב הבנייה להדקת היישום שלך ב-GO.
  2. משתמש ב-amazonlinux:2 כתמונת בסיס סופית.
  3. מתקין את AWS CLI, Docker (שכולל את containerd), ו-skopeo באמצעות yum ו-amazon-linux-extras.
  4. מעתיק את הבינארי של GO שהודקל משלב הבנייה.
Shell

 

החלף את <your-docker-repo> במאגר ה-Docker האמיתי שלך.

שלב 3: החל משאבי ה-RBAC

צור קובץ בשם rbac.yaml:

YAML

 

החל משאבי ה-RBAC:

Shell

 

שלב 4: צור פריסת Kubernetes

צור קובץ בשם deployment.yaml:

YAML

 

החל את הפריסה:

Shell

 

בעוד deployment.yaml, עדכן את הדברים הבאים:

YAML

שלב 5: שירות Kubernetes

צור קובץ בשם service.yaml:

YAML

 

החל את השירות:

Shell

 

שלב 6: התקן את בקר ה-Ngnix Ingress

Shell

 

שלב 7: צור משאב Ingress

צור קובץ בשם ingress.yaml:

YAML

 

החל את ה-Ingress:

Shell

 

שלב 8: בדוק את ה-API

Shell

 

Shell

 

החלף את <EXTERNAL-IP> עם ה-IP החיצוני האמיתי.

שיקולים נוספים

  1. אבטחה.
    • יישם HTTPS על ידי התקנת תעודות TLS
    • הוסף אימות ל-API
  2. ניטור. הגדר יומנים וניטור עבור ה-API ותהליך הצ'קפוינט.
  3. ניהול משאבים. הגדר בקשות ומגבלות משאבים עבור מיכל הצד.
  4. טיפול בשגיאות. יישם טיפול בשגיאות חזק באפליקציית ה-Go.
  5. בדיקות. בדוק ביסודיות את ההתקנה בסביבה שאינה ייצור לפני פריסתה לייצור.
  6. מסמכים. שמור תיעוד ברור על איך להשתמש ב-API של הצ'קפוינט.

סיכום

ההגדרה הזו משיקה את קונטיינר הצ'קפוינט כצד בשירות Kubernetes ומפיצה את הפונקציות שלו דרך API שניתן לגשת אליו מחוץ לקלאסטר. היא מציעה פתרון גמיש לניהול צ'קפוינטים של קונטיינרים בסביבת Kubernetes.

מאפיינים ספציפיים של AWS/EKS

שלב 7: התקנת בקר מאזן העומסים של AWS

במקום להשתמש בבקר Nginx Ingress, נשתמש בבקר מאזן העומסים של AWS. בקר זה ייצור וינהל ALBs עבור משאבי ה-Ingress שלנו.

1. הוסף את מאגר הצ'ארטים של EKS ל-Helm:

Shell

 

2. התקן את בקר מאזן העומסים של AWS:

Shell

 

החלף את <your-cluster-name> בשם הקלאסטר שלך ב-EKS.

הערה: ודא שיש לך את ההרשאות IAM הנדרשות עבור בקר מאזן העומסים של AWS. תוכל למצוא את מדיניות ה-IAM המפורטת בתיעוד של AWS.

שלב 8: צור משאב Ingress

צור קובץ בשם ingress.yaml:

YAML

 

החל את ה-Ingress:

Shell

 

שלב 9: בדוק את ה-API

1. קבל את שם ה-DNS של ה-ALB:

Shell

 

חפש את השדה ADDRESS, שיהיה שם ה-DNS של ה-ALB.

2. שלח בקשה לבדיקה:

Shell

 

החלף את <ALB-DNS-NAME> בשם ה-DNS האמיתי של ה-ALB שלך מהשלב 1.

שיקולים נוספים עבור AWS ALB

1. קבוצות אבטחה. ה-ALB ייווצר עם קבוצת אבטחה באופן אוטומטי. ודאו שהיא מאפשרת תעבורה נכנסת על פורט 80 (וכן 443 אם הגדרתם HTTPS).

2. SSL/TLS: כדי לאפשר HTTPS, אתם יכולים להוסיף את ההערות הבאות ל-Ingress שלכם:

YAML

 

3. יומני גישה. הפעלו יומני גישה עבור ה-ALB שלכם על ידי הוספת הבאות:

YAML

 

4. אינטגרציית WAF. אם אתם רוצים להשתמש ב-AWS WAF עם ה-ALB שלכם, אתם יכולים להוסיף:

YAML

 

5. אימות. אתם יכולים להגדיר אימות באמצעות Amazon Cognito או OIDC על ידי שימוש בהערות המתאימות של ALB Ingress Controller.

שינויים אלו יגבירו את ה-Ingress שלכם באמצעות מאזן עומסים של AWS במקום Nginx. ה-ALB Ingress Controller יProvision וית конфיגור את ה-ALB באופן אוטומטי בהתבסס על משאב ה-Ingress שלכם.

סיכום

זכרו לוודא ש-cluster EKS שלכם יש הרשאות IAM הנדרשות כדי ליצור ולנהל ALBs. זה בדרך כלל כולל יצירת מדיניות IAM וחשבון שירות עם ההרשאות המתאימות.

הגדרה זו תשתמש כעת בפתרון האיזון העומסים המקורי של AWS, שמשתלב היטב עם שאר שירותי AWS ויכול להיות חסכוני יותר בסביבת AWS.

Source:
https://dzone.com/articles/container-checkpointing-kubernetes-api