במאמר הזה מוסבר איך ליצור ולנהל עומסי עבודה עם שמירת מצב באשכול Kubernetes עם בידוד פיזי ב-Google Distributed Cloud (GDC). עומסי עבודה עם שמירת מצב מאפשרים לכם להרחיב את פריסת האפליקציה באמצעות אחסון מתמיד. אחסון מתמיד מספק לאפליקציה זהויות עקביות ושמות מארחים יציבים, לא משנה איפה מתוזמנים עומסי העבודה שלה.
המסמך הזה מיועד למפתחים בקבוצת מפעילים של אפליקציות, שאחראים ליצירת עומסי עבודה של אפליקציות בארגון שלהם. מידע נוסף זמין במאמר בנושא קהלים ב-GDC עם air gap.
לפני שמתחילים
כדי להשלים את המשימות שמתוארות במאמר הזה, צריך לבקש את ההרשאות הנדרשות ולהכין את הסביבה.
שליחת בקשה לתפקידי IAM
כדי לקבל את ההרשאות שדרושות ליצירת עומסי עבודה עם שמירת מצב, צריך להיות לכם תפקידים ספציפיים. התפקידים שאתם צריכים תלויים בסוג האשכול שבו אתם עובדים: אשכול שיתופי בהיקף הארגון או אשכול רגיל בהיקף הפרויקט. למידע נוסף, קראו את המאמר הגדרות של אשכול Kubernetes.
תפקידים משותפים באשכול
כדי ליצור, למחוק, לערוך או להציג עומסי עבודה עם שמירת מצב באשכול משותף, צריך לבקש מאדמין IAM בפרויקט להעניק לכם את התפקיד אדמין של מרחב שמות (namespace-admin). התפקיד הזה משויך למרחב השמות של הפרויקט.
תפקידים רגילים באשכול
כדי ליצור, למחוק, לערוך או להציג עומסי עבודה עם שמירת מצב באשכול רגיל, צריך לבקש מאדמין IAM בפרויקט להקצות לכם את התפקיד מפתח אשכול (cluster-developer). התפקיד הזה משויך למרחב השמות של הפרויקט.
הכנת הסביבה
כדי להריץ פקודות מול אשכול Kubernetes באמצעות ה-API, צריך לוודא שיש לכם את המשאבים הבאים:
מאתרים את שם אשכול Kubernetes או שואלים חבר בקבוצת האדמינים של הפלטפורמה מה שם האשכול.
נכנסים לחשבון ויוצרים את קובץ ה-kubeconfig לאשכול Kubernetes.
משתמשים בנתיב kubeconfig של אשכול Kubernetes כדי להחליף את
KUBERNETES_CLUSTER_KUBECONFIGבהוראות האלה.
יצירת משאב StatefulSet
יוצרים אובייקט StatefulSet על ידי כתיבת מניפסט StatefulSet והפעלת הפקודה kubectl apply ליצירת המשאב. כדי לספק ללקוחות דרך יציבה לשליחת בקשות ל-pods של משאב StatefulSet, צריך גם ליצור אובייקט Service.
הפקודה kubectl apply משתמשת בקובצי מניפסט כדי ליצור, לעדכן ולמחוק משאבים באשכול Kubernetes. זו שיטה הצהרתית להגדרת אובייקט. בשיטה הזו, הכתיבות שבוצעו באובייקטים פעילים נשמרות בלי למזג את השינויים בחזרה לקובצי ההגדרות של האובייקט.
כדי ליצור משאב StatefulSet ומשאב Service, מריצים את הפקודה:
kubectl --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG -n NAMESPACE \
apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
name: SERVICE_NAME
labels:
app: APP_NAME
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: APP_NAME
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
selector:
matchLabels:
app: APP_LABEL_NAME
serviceName: "SERVICE_NAME"
replicas: NUMBER_OF_REPLICAS
template:
metadata:
labels:
app: APP_LABEL_NAME
spec:
terminationGracePeriodSeconds: 10
containers:
- name: CONTAINER_NAME
image: CONTAINER_IMAGE
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: CONTAINER_STORAGE_VOLUME_PATH
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
EOF
מחליפים את מה שכתוב בשדות הבאים:
KUBERNETES_CLUSTER_KUBECONFIG: קובץ ה-kubeconfig של האשכול שבו אתם פורסים עומסי עבודה של קונטיינרים.
NAMESPACE: מרחב השמות שבו יופעלו עומסי העבודה של הקונטיינרים. במקרה של אשכולות משותפים, צריך להשתמש במרחב שמות של פרויקט. במקרים של אשכולות רגילים, אפשר להשתמש בכל מרחב שמות.
SERVICE_NAME: השם של אובייקטService. מוודאים שאובייקטStatefulSetמגדיר את אובייקטServiceגם ב-serviceNameשלו.
APP_NAME: השם של האפליקציה שרוצים להפעיל בפריסה.
APP_LABEL_NAME: בורר התוויות שקובע אילו פודים שייכים לאובייקטStatefulSet.
STATEFULSET_NAME: השם של אובייקטStatefulSet.
NUMBER_OF_REPLICAS: מספר האובייקטים המשוכפליםPodשהפריסה מנהלת.
CONTAINER_NAME: השם של הקונטיינר.
CONTAINER_IMAGE: השם של קובץ האימג' בקונטיינר. חובה לכלול את הנתיב של מאגר הקונטיינרים ואת הגרסה של התמונה, כמוREGISTRY_PATH/nginx:1.23. מידע נוסף על הגדרת הנתיב של מאגר התמונות זמין במאמר סקירה כללית על שירות Harbor המנוהל.
CONTAINER_STORAGE_VOLUME_PATH: הנתיב בתוך הקונטיינר שבו מותקן נפח אחסון.
לדוגמה, אובייקט StatefulSet הבא ואובייקט Service התואם יוצרים עומסי עבודה של קונטיינרים עם שמירת מצב:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: REGISTRY_PATH/nginx:1.23
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
בדוגמה הזו:
- נוצר אובייקט
Serviceבשםnginx, שמוצג בשדהmetadata: name. האובייקטServiceמכוון לאפליקציה בשםnginx, שמצוינת על ידיlabels.app: nginxו-selector.app: nginx. האובייקטServiceחושף את יציאה 80 ונותן לה את השםweb. אובייקטServiceהזה שולט בדומיין של הרשת ומנתב את תנועת האינטרנט לאפליקציה שמופעלת בתוך קונטיינר, שנפרסה על ידי אובייקטStatefulSet. - נוצר
StatefulSetבשםwebעם שלושה אובייקטים משוכפלים שלPod, כפי שמוגדר בשדהreplicas: 3. - התבנית
Pod, שמוגדרת על ידי הקטע.spec.template, מציינת שהאובייקטיםPodשלה מסומנים בתוויתapp: nginx. - המפרט
Pod, שמוגדר בקטע.template.spec, מציין שהפודים שלStatefulSetמריצים קונטיינר אחד,nginx, שמריץ את התמונהnginxבגרסה1.23. Podהמפרט משתמש ביציאת האינטרנט שנפתחה על ידי האובייקטService.- בקטע
.template.spec.volumeMountsמצוין השדהmountPath, שנקראwww. mountPathהוא הנתיב בקונטיינר שבו מותקן נפח אחסון. -
StatefulSetמספק שלושה אובייקטים שלPersistentVolumeClaim, בשמותweb-www-0,web-www-1ו-web-www-2, עם נפח אחסון מוקצה של 1GB לכל אחד.
אחרי שיוצרים את StatefulSet, הוא מוודא שמספר היעד של אובייקטים מסוג Pod פועלים וזמינים בכל רגע. המערכת StatefulSet מחליפה באופן אוטומטי אובייקטים מסוג Pod שנכשלו או שסולקו מהצמתים שלהם, ומשייכת אובייקטים חדשים מסוג Pod למשאבי האחסון, לבקשות ולמגבלות של המשאבים ולהגדרות אחרות שמוגדרות במפרט Pod של אובייקט StatefulSet.
בקשה לאחסון מתמיד במשאב StatefulSet
אפשר להקצות נפח אחסון מתמיד באופן דינמי, כך שהנפחים הבסיסיים נוצרים לפי דרישה. אפליקציות יכולות לבקש אחסון מתמיד באמצעות אובייקט PersistentVolumeClaim.
בדרך כלל, צריך ליצור PersistentVolumeClaim אובייקטים בנוסף ליצירת האובייקט Pod. עם זאת, אובייקטים מסוג StatefulSet כוללים מערך volumeClaimTemplates שיוצר את האובייקטים PersistentVolumeClaim. כל עותק StatefulSet מקבל אובייקט PersistentVolumeClaim משלו.
מידע נוסף זמין במאמר בנושא הגדרת אחסון של קונטיינרים.