בדף הזה מוסבר איך להגדיר PersistentVolume מבוסס-EFS לשימוש ב-GKE ב-AWS באמצעות EFS CSI Driver. Elastic File System (EFS) הוא המנגנון הבסיסי של AWS שמספק מערכות קבצים ברשת לאשכול. PersistentVolume שמבוסס על EFS הוא משאב של אשכול שמאפשר לעומסי העבודה לגשת לאחסון דרך נקודת גישה של EFS, ומוודא שהאחסון יישמר גם כשלא מחוברים אליו עומסי עבודה.
הדף הזה מיועד לאנשי תפעול ולמומחי אחסון שרוצים להגדיר ולנהל אחסון. מידע נוסף על תפקידים נפוצים ומשימות לדוגמה שאנחנו מתייחסים אליהם בתוכן זמין במאמר תפקידים נפוצים של משתמשים ומשימות ב-GKE. Google Cloud
GKE ב-AWS תומך בהקצאה סטטית ודינמית של PersistentVolumes. הקצאת הרשאות דינמית מתבצעת בהגדרה מעט שונה, אבל אחרי ההגדרה נדרש פחות מאמץ מצד האדמין.
לפני שמתחילים
כדי לבצע את השלבים בדף הזה, קודם צריך לבצע את הפעולות הבאות:
- כדאי להכיר את האופן שבו Kubernetes ו-GKE ב-AWS מטפלים באחסון של עומסי עבודה. מידע נוסף על הנושאים האלה זמין במאמרים שימוש באחסון מתמיד בעומסי העבודה של GKE ב-AWS ויצירת משאבי Amazon EFS.
- כדי להשתמש בהקצאה דינמית של PersistentVolumes באמצעות EFS, צריך לשדרג ל-Kubernetes גרסה 1.25 ואילך. אם אתם משתמשים ב-Kubernetes בגרסה 1.24, פנו לתמיכה כדי לקבל גישה לתכונה הזו.
סקירה כללית על הקצאת הרשאות סטטית
כדי ליצור Elastic File System (EFS) ולהפוך אותו לזמין לעומסי עבודה באשכול באמצעות הקצאת משאבים סטטית, צריך לבצע ארבעה שלבים:
- יצירת משאב EFS
- הגדרת הרשת
- יצירת יעד להרכבה
- יצירת
PersistentVolume
השלב האחרון הוא בעומס העבודה: כדי לבקש אחסון מתמיד, צריך להנפיק PersistentVolumeClaim.
סקירה כללית של הקצאת הרשאות דינמית
גם ליצירת משאב EFS ולהפיכתו לזמין באמצעות הקצאת משאבים דינמית יש ארבעה שלבים:
- יצירת משאב EFS
- הגדרת הרשת
- יצירת יעד להרכבה
- יצירת
StorageClass
יצירת StorageClass היא פעולה חד-פעמית. אחרי שמגדירים סוג אחסון עם מאפיינים מסוימים, עומס העבודה יכול להנפיק PersistentVolumeClaim (בקשה לאחסון קבוע) או לבקש אחסון קבוע. כל PersistentVolumeClaims לאחסון עם המאפיינים האלה יכולים לבקש את אותו StorageClass.
שלבים נפוצים
גם אם אתם משתמשים בהקצאת משאבים סטטית או דינמית באשכול, אתם צריכים להתחיל בשלבי ההגדרה שמפורטים כאן, ואז להמשיך בשלבים של הקצאת משאבים סטטית או דינמית, לפי הצורך. אחרי שיוצרים את ה-EFS ונותנים גישה אליו, עומס העבודה צריך לבצע את השלבים האחרונים כדי לגשת אליו. ההוראות מפורטות במאמר שימוש באחסון EFS.
יצירת משאב AWS EFS
נדרש משאב EFS בין אם משתמשים בהקצאה סטטית או דינמית. אם האשכול משתמש בשניהם, אפשר ליצור משאבי EFS נפרדים לכל אחד מהם או להשתמש באותו משאב לשניהם. מידע נוסף על יצירת מערכות קבצים של Amazon EFS
אפשר גם להשתמש מחדש במערכת קבצים קיימת של EFS. במקרה כזה, אפשר לדלג על הקטע הזה ולהמשיך אל יצירת יעדי הרכבה.
מאתרים את אזור AWS שבו האשכול פועל.
gcloud container aws clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(awsRegion)"מחליפים את מה שכתוב בשדות הבאים:
- CLUSTER_NAME: השם של אשכול AWS.
- LOCATION: Google Cloud המיקום של אשכול AWS
יוצרים מערכת משאבי EFS באותו אזור AWS באמצעות הפקודה הבאה.
aws efs create-file-system \ --region AWS_REGION \ --performance-mode generalPurpose \ --query 'FileSystemId' \ --output textמחליפים את מה שכתוב בשדות הבאים:
- AWS_REGION: האזור ב-AWS שבו האשכול פועל
הפלט כולל את המזהה של מערכת הקבצים. שומרים את הערך הזה. תצטרכו אותו בהמשך.
יצירת יעדי הרכבה
מנהל ההתקן של CSI עבור EFS ניגש למערכות קבצים דרך יעדי הטעינה של EFS. יעד ההרכבה הוא כתובת IP פרטית שמשתמשת בקבוצות אבטחה של AWS כדי לשלוט בגישה ל-EFS הבסיסי.
אם מאגרי הצמתים באשכול פועלים ברשתות משנה שונות, צריך ליצור יעד טעינה נפרד בכל רשת משנה של מאגר הצמתים.
בדוגמה הזו, הגישה לכל יעד הרכבה מוגנת על ידי קבוצת אבטחה אחת שכוללת גם את יעדי ההרכבה וגם את המכונות של מאגר הצמתים. בהתאם להגדרות ה-VPC ולדרישות האבטחה, יכול להיות שתבחרו לפצל את ההגדרה הזו לשתי קבוצות אבטחה או יותר – לדוגמה, אחת ליעדי ההרכבה ואחת לצמתי העובדים במאגר הצמתים.
יצירת קבוצת אבטחה ייעודית כדי לשלוט בגישה ל-EFS
מקבלים את המזהה של ה-VPC ב-AWS שבו האשכול פועל.
gcloud container aws clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(networking.vpcId)"מחליפים את מה שכתוב בשדות הבאים:
- CLUSTER_NAME
- LOCATION
הפלט כולל את המזהה של ה-VPC. שומרים את הערך הזה. תצטרכו אותו בהמשך.
יוצרים קבוצת אבטחה כדי לשלוט בגישה ליעד ההרכבה של EFS.
aws ec2 create-security-group \ --group-name gke-efs-security-group \ --description "EFS security group" \ --vpc-id VPC_ID \ --output textמחליפים את VPC_ID במזהה של ה-VPC ב-AWS שבו האשכול פועל.
הפלט כולל את המזהה של קבוצת האבטחה החדשה. שומרים את הערך הזה. תצטרכו אותו בהמשך.
כברירת מחדל, AWS יוצרת קבוצות אבטחה עם כלל ברירת מחדל שמאפשר את כל התנועה היוצאת. מסירים את כלל ברירת המחדל לתנועה יוצאת.
aws ec2 revoke-security-group-egress \ --group-id SECURITY_GROUP_ID --ip-permissions '[{"IpProtocol":"-1","FromPort":-1,"ToPort":-1,"IpRanges":[{"CidrIp":"0.0.0.0/0"}]}]'מחליפים את SECURITY_GROUP_ID במזהה של קבוצת האבטחה ב-AWS.
מאשרים תנועה נכנסת ויוצאת ל-EFS (יציאה 2049).
aws ec2 authorize-security-group-ingress \ --group-id SECURITY_GROUP_ID \ --protocol tcp \ --port 2049 \ --source-group SECURITY_GROUP_IDaws ec2 authorize-security-group-egress \ --group-id SECURITY_GROUP_ID \ --protocol tcp \ --port 2049 \ --source-group SECURITY_GROUP_IDיוצרים יעד להרכבת EFS בכל רשת משנה של מאגר הצמתים.
מציגים רשימה של תת-רשתות שמשויכות לכל מאגרי הצמתים.
gcloud container aws node-pools list \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --format="value(subnetId)"מחליפים את מה שכתוב בשדות הבאים:
- CLUSTER_NAME
- LOCATION
הפלט הוא רשימה של מזהי רשתות משנה. שומרים את הערך הזה. תצטרכו אותו בהמשך.
לכל רשת משנה, יוצרים יעד שיוך EFS משויך עם קבוצת האבטחה שהוחלה.
aws efs create-mount-target \ --file-system-id EFS_ID \ --subnet-id SUBNET_ID \ --security-groups SECURITY_GROUP_IDמחליפים את מה שכתוב בשדות הבאים:
- EFS_ID: המזהה של משאב ה-EFS.
- SUBNET_ID: המזהה של רשת המשנה של מאגר הצמתים.
- SECURITY_GROUP_ID
מוסיפים את קבוצת האבטחה של EFS לכל מאגרי הצמתים של האשכול.
לקבל את הרשימה של כל מאגרי הצמתים.
gcloud container aws node-pools list \ --cluster=CLUSTER_NAME \ --location=LOCATIONמחליפים את מה שכתוב בשדות הבאים:
- CLUSTER_NAME
- LOCATION
הפלט כולל את השמות של מאגרי הצמתים של האשכול. שומרים את הערך הזה. תצטרכו אותו בהמשך.
מעדכנים כל מאגר צמתים כך שיכלול את קבוצת האבטחה החדשה של EFS.
gcloud container aws node-pools update NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --security-group-ids=SECURITY_GROUP_IDSמחליפים את מה שכתוב בשדות הבאים:
- NODE_POOL_NAME: השם של מאגר הצמתים.
- CLUSTER_NAME: השם של האשכול.
- LOCATION
- SECURITY_GROUP_IDS רשימת מזהי קבוצות האבטחה של צמתי העובדים.
יצירת PersistentVolume (סטטי) או StorageClass (דינמי)
אם אתם משתמשים בהקצאת משאבים סטטית, השלב הבא הוא ליצור PersistentVolume. אם אתם משתמשים בהקצאת משאבים דינמית, מנהל ההתקן של EFS עושה זאת בשבילכם. במקום זאת, אתם מגדירים StorageClass לעומסי עבודה כדי לציין ב-PersistentVolumeClaim שלהם. בוחרים את הכרטיסייה שמתאימה לשיטת ההקצאה שבחרתם.
הקצאת משאבים סטטית
אם אתם משתמשים בהקצאת משאבים סטטית, השלב הבא הוא ליצור PersistentVolume שמבצע mount לשיתוף EFS.
בוחרים את הכרטיסייה המתאימה בהתאם לאופן שבו מתחברים לשיתוף EFS – ישירות או דרך נקודת גישה.
חיבור ישיר
מעתיקים את מניפסט ה-YAML הבא לקובץ בשם
efs-volume.yaml. קובץ המניפסט מפנה לסוג האחסון EFS שיצרתם קודם.apiVersion: v1 kind: PersistentVolume metadata: name: VOLUME_NAME spec: capacity: # Note: storage capacity is not used by the EFS CSI driver. # It is required by the PersistentVolume spec. storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: "" # storageClassName is not required, see note in the following section. claimRef: name: CLAIM_NAME namespace: default csi: driver: efs.csi.aws.com volumeHandle: EFS_IDמחליפים את מה שכתוב בשדות הבאים:
- VOLUME_NAME בשם של הנפח המתמיד.
- CLAIM_NAME בשם שרוצים להשתמש בו בשביל PersistentVolumeClaim.
- EFS_ID במזהה המשאב של EFS. לדוגמה,
fs-12345678a.
נקודת גישה
כדי ליצור נפח אחסון שמבוסס על נקודת גישה, צריך להקצות אותו באופן ידני. מידע נוסף זמין במאמר עבודה עם נקודות גישה ל-EFS.
מעתיקים את מניפסט ה-YAML הבא לקובץ בשם
efs-volume.yaml. קובץ המניפסט מפנה לסוג האחסון EFS שיצרתם קודם.apiVersion: v1 kind: PersistentVolume metadata: name: VOLUME_NAME spec: capacity: # Note: storage capacity is not used by the EFS CSI driver. # It is required by the PersistentVolume spec. storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain # Set storageClassName to empty string for static provisioning. See [Use an EFS resource](/kubernetes-engine/multi-cloud/docs/aws/how-to/use-efs) storageClassName: "" claimRef: name: CLAIM_NAME namespace: default csi: driver: efs.csi.aws.com volumeHandle: EFS_ID::ACCESS_POINT_IDמחליפים את מה שכתוב בשדות הבאים:
- VOLUME_NAME בשם של הנפח המתמיד.
- CLAIM_NAME בשם שרוצים להשתמש בו בשביל PersistentVolumeClaim.
- EFS_ID במזהה המשאב של EFS. לדוגמה,
fs-12345678a. - ACCESS_POINT_ID עם המזהה של נקודת הגישה. לדוגמה,
fsap-1234567890abcde.
מחילים את ה-YAML על האשכול.
kubectl apply -f efs-volume.yamlהפלט מאשר את היצירה של PersistentVolume.
persistentvolume/VOLUME_NAME created
הקצאת הרשאות דינמית
בקטע הזה מוסבר איך ליצור StorageClass שמפנה למשאב EFS שיצרתם קודם. אחרי שמבצעים את הפעולה הזו, המפתחים יכולים לגשת למשאב EFS לפי השלבים שמתוארים במאמר שימוש במשאב EFS.
יוצרים StorageClass שמפנה למזהה משאב EFS.
מעתיקים את קטע ה-YAML הבא לקובץ חדש בשם
efs-storage-class.yaml. מידע נוסף על שינוי המאפיינים של StorageClass שמתואר בקובץ הזה זמין במאמר בנושא פרמטרים של EFS StorageClass.kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: EFS_STORAGE_CLASS_NAME provisioner: efs.csi.aws.com mountOptions: - tls parameters: provisioningMode: efs-ap fileSystemId: EFS_ID directoryPerms: "700"מחליפים את:
- EFS_STORAGE_CLASS_NAME בשם שבחרתם ל-StorageClass.
- EFS_ID עם מזהה משאב EFS – לדוגמה, fs-12345678a.
מחילים את ה-YAML על האשכול.
kubectl apply -f efs-storage-class.yamlאם הפקודה מסתיימת בלי שגיאות, הפלט שלה יכלול שורה שדומה לזו:
storageclass/EFS_STORAGE_CLASS_NAME created
הסרת המשאבים
כדי להסיר את המשאבים שיצרתם בקטעים הקודמים, מריצים את הפקודות הבאות:
משתמשים בפקודה
kubectlכדי להסיר את משאב התביעה של EFS מהאשכול:kubectl delete -f efs-claim.yamlאם משתמשים בהקצאת משאבים סטטית, משתמשים בפקודה
kubectlכדי להסיר את המשאבים המשויכים מהאשכול:kubectl delete -f efs-volume.yamlאם משתמשים בהקצאת משאבים דינמית, משתמשים בפקודה
kubectlכדי להסיר את המשאבים המשויכים מהאשכול:kubectl delete -f efs-storage-class.yamlמאתרים את המזהה של נקודת הצירוף:
aws efs describe-mount-targets \ --file-system-id EFS_ID \ --profile adminuser \ --region AWS_REGIONמחליפים את מה שכתוב בשדות הבאים:
- EFS_ID: המזהה של משאב ה-EFS
- AWS_REGION: האזור ב-AWS שבו האשכול פועל
הפלט כולל את מזהה יעד ההרכבה. שומרים את הערך הזה. תצטרכו אותו בהמשך.
מחיקת יעד ההרכבה של EFS:
aws efs delete-mount-target \ --mount-target-id MOUNT_TARGET_ID \ --profile adminuser \ --region AWS_REGIONמחליפים את מה שכתוב בשדות הבאים:
- MOUNT_TARGET_ID: המזהה של יעד הטעינה של EFS
- AWS_REGION: האזור ב-AWS של יעד ההרכבה
מוחקים את קבוצות האבטחה שיצרתם.
מוחקים את מערכת הקבצים באמצעות פקודת ה-CLI delete-file-system. אפשר לקבל רשימה של מערכות הקבצים באמצעות הפקודה describe-file-systems ב-CLI. מזהה מערכת הקבצים מופיע בתשובה.
aws efs delete-file-system \ --file-system-id EFS_ID \ --profile adminuser \ --region AWS_REGIONמחליפים את מה שכתוב בשדות הבאים:
- EFS_ID
- AWS_REGION
המאמרים הבאים
- איך משתמשים ב-
PersistentVolumeClaimמתוך עומס עבודה כדי לגשת לנפח EFS aws-efs-csi-driverדוגמאות לשימוש בנפחי EFS