בדף הזה מוסבר איך ליצור מאגר צמתים ב-GKE ב-AWS ואיך להתאים אישית את הגדרת הצמתים באמצעות קובץ הגדרה.
כדי ליצור מאגר צמתים, צריך לספק את המשאבים הבאים:
- השם של אשכול AWS קיים שבו רוצים ליצור את מאגר הצמתים
- פרופיל מופע של IAM למכונות וירטואליות במאגר הצמתים
- רשת משנה שבה יפעלו המכונות הווירטואליות של מאגר הצמתים
אם רוצים גישת SSH לצמתים, אפשר ליצור זוג מפתחות EC2.
הדף הזה מיועד לאדמינים ב-IT ולמפעילים שרוצים להגדיר, לנטר ולנהל תשתית ענן. מידע נוסף על תפקידים נפוצים ועל משימות לדוגמה שאנחנו מתייחסים אליהן בתוכן זמין במאמר תפקידים נפוצים של משתמשים ב-GKE ומשימות. Google Cloud
יצירת מאגר צמתים רגיל
אחרי שהמשאבים האלה יהיו זמינים, תוכלו ליצור מאגר צמתים באמצעות הפקודה הבאה:
gcloud container aws node-pools create NODE_POOL_NAME \
--cluster CLUSTER_NAME \
--instance-type INSTANCE_TYPE \
--root-volume-size ROOT_VOLUME_SIZE \
--iam-instance-profile NODEPOOL_PROFILE \
--node-version NODE_VERSION \
--min-nodes MIN_NODES \
--max-nodes MAX_NODES \
--max-pods-per-node MAX_PODS_PER_NODE \
--location GOOGLE_CLOUD_LOCATION \
--subnet-id NODEPOOL_SUBNET \
--ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
--config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
--tags "Name=CLUSTER_NAME-NODE_POOL_NAME"
מחליפים את מה שכתוב בשדות הבאים:
-
NODE_POOL_NAME: שם שבחרתם למאגר הצמתים -
CLUSTER_NAME: השם של האשכול שאליו רוצים לצרף את מאגר הצמתים -
INSTANCE_TYPE: סוג מכונת ה-AWS הרצוי למאגר הצמתים הזה – לדוגמה,m5.large -
ROOT_VOLUME_SIZE: הגודל הרצוי של נפח האחסון הבסיסי של כל צומת, בגיגה-בייט -
NODEPOOL_PROFILE: פרופיל המופע של IAM למכונות וירטואליות במאגר הצמתים. לפרטים על עדכון פרופיל מכונה ב-IAM, אפשר לעיין במאמר עדכון פרופיל מכונה ב-AWS IAM. -
NODE_VERSION: גרסת Kubernetes להתקנה בכל צומת במאגר הצמתים (לדוגמה, "1.34.1-gke.4700") -
MIN_NODES: המספר המינימלי של הצמתים שיכולים להיות במאגר הצמתים -
MAX_NODES: המספר המקסימלי של הצמתים שיכולים להיות במאגר הצמתים -
MAX_PODS_PER_NODE: המספר המקסימלי של פודים שאפשר ליצור בכל צומת יחיד במאגר -
GOOGLE_CLOUD_LOCATION: השם של Google Cloud המיקום שממנו ינוהל מאגר הצמתים הזה -
NODEPOOL_SUBNET: המזהה של רשת המשנה שבה יפעל מאגר הצמתים.- לא יכול להיות חפיפה בין טווחי כתובות ה-IP של ה-Pod או השירות של האשכול לבין רשת המשנה של מאגר הצמתים. מידע נוסף על בחירת טווחים של כתובות IP של Pod ושל שירות לאשכול זמין במאמר בחירת טווחי CIDR לאשכול
- אם רשת המשנה הזו נמצאת מחוץ לבלוק ה-CIDR הראשי של ה-VPC, צריך לבצע כמה שלבים נוספים. מידע נוסף זמין במאמר בנושא קבוצות אבטחה.
-
SSH_KEY_PAIR_NAME: השם של זוג מפתחות ה-SSH ב-AWS שנוצר לגישת SSH (אופציונלי) -
CONFIG_KMS_KEY_ARN: שם משאב Amazon (ARN) של מפתח AWS KMS שמצפין את נתוני המשתמש
אם הפרמטר --tags קיים, התג שצוין יוחל על כל הצמתים במאגר הצמתים. בדוגמה הזו, כל הצמתים במאגר מתויגים בשמות של האשכול ומאגר הצמתים שאליהם הצומת שייך.
התאמה אישית של הגדרות המערכת של הצומת
יש כמה שיטות להתאמה אישית של הגדרות הצומת. לדוגמה, אפשר לציין פרמטרים כמו מגבלת המעבד של ה-Pod כשיוצרים מאגר צמתים.
אתם יכולים להשתמש בהגדרות של מערכת צמתים כדי לציין הגדרות בהתאמה אישית לסוכן הצמתים של Kubernetes (kubelet) ולתצורות של ליבת Linux ברמה נמוכה (sysctl) במאגרי הצמתים.
הגדרת הסוכן kubelet
כדי להתאים אישית את תצורת הצומת באמצעות kubelet, משתמשים ב-Google Cloud CLI או ב-Terraform.
gcloud
כשיוצרים מאגרי צמתים, אפשר לציין הגדרות בהתאמה אישית לסוכן הצמתים של Kubernetes (kubelet). לדוגמה, כדי להגדיר את kubelet לשימוש במדיניות סטטית לניהול מעבד, מריצים את הפקודה הבאה:
gcloud container aws node-pools create POOL_NAME \
--cluster CLUSTER_NAME \
--location=LOCATION \
--kubelet_config_cpu_manager_policy=static
מחליפים את מה שכתוב בשדות הבאים:
-
POOL_NAME: השם של מאגר הצמתים. -
CLUSTER_NAME: שם האשכול שאליו רוצים להוסיף מאגר צמתים. -
LOCATION: אזור המחשוב או האזור של האשכול.
רשימה מלאה של השדות שאפשר להוסיף לפקודה הקודמת מופיעה במאמר אפשרויות ההגדרה של Kubelet.
Terraform
מידע נוסף על Terraform בסביבת AWS זמין במאמר בנושא מאגר צמתים של Terraform.
מגדירים את המשתנים של Terraform על ידי הוספת הבלוק הבא לקובץ
variables.tf:variable "node_pool_kubelet_config_cpu_manager" { default = "none" } variable "node_pool_kubelet_config_cpu_cfs_quota" { default = "true" } variable "node_pool_kubelet_config_cpu_cfs_quota_period" { default = "100ms" } variable "node_pool_kubelet_config_pod_pids_limit" { default = -1 }מוסיפים את הבלוק הבא להגדרות של Terraform:
resource "google_container_aws_node_pool" "NODE_POOL_RESOURCE_NAME" { provider = google cluster = CLUSTER_NAME name = POOL_NAME subnet_id = SUBNET_ID version = CLUSTER_VERSION location = CLUSTER_LOCATION kubelet_config { cpu_manager_policy = var.node_pool_kubelet_config_cpu_manager cpu_cfs_quota = var.node_pool_kubelet_config_cpu_cfs_quota cpu_cfs_quota_period = var.node_pool_kubelet_config_cpu_cfs_quota_period pod_pids_limit = var.node_pool_kubelet_config_pod_pids_limit } }מחליפים את מה שכתוב בשדות הבאים:
-
NODE_POOL_RESOURCE_NAME: השם של משאב מאגר הצמתים בתבנית Terraform. -
CLUSTER_NAME: השם של האשכול הקיים. -
POOL_NAME: השם של מאגר הצמתים שרוצים להתאים אישית. -
SUBNET_ID: תת-הרשת שהוקצתה למאגר הצמתים. -
CLUSTER_VERSION: הגרסה של מישור הבקרה והצמתים של אשכול GKE ב-AWS. -
CLUSTER_LOCATION: האזור או התחום של Compute Engine שבו נמצא האשכול.
-
הגדרת כלי השירות sysctl
כדי להתאים אישית את הגדרת מערכת הצמתים באמצעות sysctl, שולחים בקשת POST אל ה-method awsClusters.awsNodePools.create.
בקשת ה-POST הזו יוצרת מאגר צמתים עם ההתאמות האישיות שציינתם. בדוגמה הבאה, הפרמטרים busy_poll ו-busy_read מוגדרים ל-5,000 מיקרו-שניות כל אחד:
POST https://ENDPOINT/v1/projects/PROJECT_ID/locations/GOOGLE_CLOUD_LOCATION/CLUSTER_NAME/awsNodePools
{
"name": NODE_POOL_NAME,
"version": CLUSTER_VERSION,
"config": {
"linuxNodeConfig": {
"sysctls": {
"net.core.busy_poll": "5000",
"net.core.busy_read": "5000",
}
}
}
}
מחליפים את מה שכתוב בשדות הבאים:
-
ENDPOINT: נקודת הקצה של השירות ב- Google Cloud . -
PROJECT_ID: מזהה הפרויקט ב- Google Cloud . -
GOOGLE_CLOUD_LOCATION: Google Cloud המיקום של האשכול. -
CLUSTER_NAME: שם האשכול שאליו רוצים להוסיף מאגר צמתים. -
NODE_POOL_NAME: השם של מאגר הצמתים. -
CLUSTER_VERSION: מספר הגרסה של האשכול, לדוגמה, 1.31.0-gke.500.
הרשימה המלאה של צמדי מפתח/ערך שאפשר להוסיף לבקשת ה-JSON שלמעלה מופיעה במאמר אפשרויות ההגדרה של Sysctl.
אפשרויות ההגדרה של סוכן kubelet
בטבלה הבאה מוצגות האפשרויות של kubelet שאפשר לשנות.
| הגדרות התצורה של Kubelet | הגבלות | הגדרת ברירת המחדל | תיאור |
|---|---|---|---|
| kubelet_config_cpu_manager_policy |
הערך חייב להיות none או static
|
"none"
|
ההגדרה הזו קובעת את מדיניות ניהול המעבד של kubelet. ערך ברירת המחדל הוא none, שהוא סכמת זיקת המעבד שמוגדרת כברירת מחדל, ולא מספק זיקה מעבר למה שתזמן מערכת ההפעלה עושה באופן אוטומטי.הגדרת הערך הזה ל- static מאפשרת להקצות שימוש בלעדי במעבדים ל-Pods בסיווג Guaranteed QoS עם בקשות CPU של מספרים שלמים. |
| kubelet_config_cpu_cfs_quota |
הערך חייב להיות true או false
|
true
|
ההגדרה הזו אוכפת את מגבלת המעבד של ה-Pod. הגדרה של הערך false פירושה שהמערכת מתעלמת ממגבלות המעבד עבור ה-Pods.יכול להיות שתרצו להתעלם ממגבלות CPU בתרחישים מסוימים שבהם ה-Pods רגישים למגבלות CPU. הסיכון בהשבתת cpuCFSQuota הוא ש-Pod לא מורשה עלול לצרוך יותר משאבי CPU מהמתוכנן.
|
| kubelet_config_cpu_cfs_quota_period | הערך חייב להיות משך זמן |
"100ms"
|
ההגדרה הזו קובעת את ערך התקופה של מכסת ה-CPU CFS, cpu.cfs_period_us, שמציין את התקופה שבה צריך להקצות מחדש את הגישה של cgroup למשאבי ה-CPU. האפשרות הזו מאפשרת לכם לשנות את התנהגות ויסות הנתונים של יחידת העיבוד המרכזית (CPU). |
| kubelet_config_pod_pids_limit | הערך צריך להיות בין 1024 ל-4194304 |
-1
|
ההגדרה הזו קובעת את המספר המקסימלי של מזהי תהליכים (PID) שכל Pod יכול להשתמש בהם. אם הערך מוגדר כברירת המחדל, המגבלה של מזהי התהליך משתנה אוטומטית בהתאם לגודל המכונה הבסיסית. |
אפשרויות ההגדרה של כלי השירות sysctl
כדי לשפר את הביצועים של המערכת, אפשר לשנות את המאפיינים הבאים:
net.core.busy_pollnet.core.busy_readnet.core.netdev_max_backlognet.core.rmem_maxnet.core.wmem_defaultnet.core.wmem_maxnet.core.optmem_maxnet.core.somaxconnnet.ipv4.tcp_rmemnet.ipv4.tcp_wmemnet.ipv4.tcp_tw_reusenet.ipv6.conf.all.disable_ipv6net.ipv6.conf.default.disable_ipv6vm.max_map_count
מאגרי צמתים של מכונות Spot
GKE ב-AWS תומך במאגרי צמתים של AWS spot instance כגרסת Preview. מאגרי צמתים של מכונות Spot הם מאגרים של מכונות Spot ב-Amazon EC2 שזמינות ב-AWS בעלות נמוכה יותר.
שימוש במופעי Spot יכול לחסוך לכם כסף באפליקציות גמישות, עמידות בכשלים ובלי שמירת מצב. עם זאת, הם לא מתאימים לעומסי עבודה (workload) שהם לא גמישים, מבוססי מצב, לא סובלניים לתקלות או שיש ביניהם צימוד הדוק בין צמתי המופעים. יכול להיות ש-Amazon EC2 יפריע למכונות Spot אם הוא יצטרך את הקיבולת בחזרה, ולכן הן כפופות לתנודות בשוק Spot. אם עומסי העבודה שלכם דורשים קיבולת מובטחת ולא יכולים לסבול תקופות של חוסר זמינות מדי פעם, כדאי לבחור במאגר צמתים רגיל במקום במאגר צמתים של מופעים זמניים.
אסטרטגיית ההקצאה שמשמשת ב-GKE ב-AWS מתמקדת בבחירת מאגרי Spot Instance עם זמינות הקיבולת הגבוהה ביותר, כדי למזער את הסיכון להפרעות. הגישה הזו מועילה במיוחד לעומסי עבודה עם עלות גבוהה יותר של הפרעה, כמו רינדור של תמונות ומדיה או למידה עמוקה.
באופן ספציפי, הוטמעה אסטרטגיית ההקצאה capacityOptimized,
כפי שמתואר במאמר בנושא אסטרטגיות הקצאה של מופעי Spot.
יצירת מאגר צמתים מסוג Spot
כדי ליצור מאגר צמתים של Spot Instance, מריצים את הפקודה הבאה:
gcloud container aws node-pools create NODE_POOL_NAME \
--cluster CLUSTER_NAME \
--spot-instance-types INSTANCE_TYPE_LIST \
--root-volume-size ROOT_VOLUME_SIZE \
--iam-instance-profile NODEPOOL_PROFILE \
--node-version NODE_VERSION \
--min-nodes MIN_NODES \
--max-nodes MAX_NODES \
--max-pods-per-node MAX_PODS_PER_NODE \
--location GOOGLE_CLOUD_LOCATION \
--subnet-id NODEPOOL_SUBNET \
--ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
--config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
--tags "Name=CLUSTER_NAME-NODE_POOL_NAME"
מחליפים את מה שכתוב בשדות הבאים:
- NODE_POOL_NAME: השם שרוצים להקצות למאגר הצמתים הזה.
- CLUSTER_NAME: שם האשכול שאליו רוצים לצרף את מאגר הצמתים הזה.
- INSTANCE_TYPE_LIST: רשימה מופרדת בפסיקים של סוגי מופעים ב-AWS EC2. מאגר הצמתים מספק מכונות מסוג Spot עם סוגי המכונות האלה. סוגי המופעים צריכים להיות בעלי ארכיטקטורת CPU זהה, מספר CPU זהה וכמות זיכרון זהה. לדוגמה: "c6g.large,c6gd.large,c6gn.large,c7g.large,t4g.medium". אפשר להשתמש בכלי Amazon EC2 Instance Selector כדי למצוא סוגי מכונות עם הגדרות זהות של יחידת העיבוד המרכזית (CPU) וזיכרון.
-
ROOT_VOLUME_SIZE: הגודל הרצוי של נפח האחסון הבסיסי של כל צומת, בגיגה-בייט -
NODEPOOL_PROFILE: פרופיל מופע IAM למכונות וירטואליות במאגר הצמתים -
NODE_VERSION: גרסת Kubernetes להתקנה בכל צומת במאגר הצמתים (לדוגמה, "1.34.1-gke.4700") -
MIN_NODES: המספר המינימלי של הצמתים שיכולים להיות במאגר הצמתים -
MAX_NODES: המספר המקסימלי של הצמתים שיכולים להיות במאגר הצמתים -
MAX_PODS_PER_NODE: המספר המקסימלי של פודים שאפשר ליצור בכל צומת יחיד במאגר -
GOOGLE_CLOUD_LOCATION: השם של Google Cloud המיקום שממנו ינוהל מאגר הצמתים הזה -
NODEPOOL_SUBNET: המזהה של רשת המשנה שבה יפעל מאגר הצמתים.- לא יכול להיות חפיפה בין טווחי כתובות ה-IP של ה-Pod או השירות של האשכול לבין רשת המשנה של מאגר הצמתים. מידע נוסף על בחירת טווחים של כתובות IP של Pod ושל שירות לאשכול זמין במאמר בחירת טווחי CIDR לאשכול
- אם רשת המשנה הזו נמצאת מחוץ לבלוק ה-CIDR הראשי של ה-VPC, צריך לבצע כמה שלבים נוספים. מידע נוסף זמין במאמר בנושא קבוצות אבטחה.
-
SSH_KEY_PAIR_NAME: השם של זוג מפתחות ה-SSH ב-AWS שנוצר לגישת SSH (אופציונלי) -
CONFIG_KMS_KEY_ARN: שם משאב Amazon (ARN) של מפתח AWS KMS שמצפין את נתוני המשתמש
השיטה המומלצת היא לציין מספר סוגים של מופעים בשדה INSTANCE_TYPE_LIST. השיטה המומלצת הזו חשובה כי אם מאגר הצמתים מוגדר עם סוג אירוע יחיד, וסוג האירוע הזה לא זמין באף אחד מאזורי הזמינות הרצויים, לא ניתן להקצות צמתים חדשים למאגר הצמתים. הדבר עלול להשפיע על הזמינות של האפליקציות ולגרום לשיבושים בשירות.
שימו לב: השדה spot-instance-types לא יכול להתקיים בו-זמנית עם השדה instance-type. המשמעות היא שאפשר לספק רק אחד מהשדות האלה, ולא את שניהם.