בדף הזה מוסבר איך להשתמש בסנכרון תצורות וב-Terraform כדי ליצור באופן דינמי משאבים בהיקף צוותי ב-Fleet של אשכולות. סנכרון תצורות מרחיב את היכולות של ניהול צוותים ב-Fleet כדי ליצור ולנהל תצורות של תשתית ואשכולות בכל ה-Fleets.
במדריך הזה אנחנו מניחים שאתם כבר מכירים את המושגים שקשורים לניהול צוותים של Fleet, כמו היקפי צוותים ומרחבי שמות של Fleet. מידע נוסף מופיע במאמר סקירה כללית על ניהול צוותים בצי.
במאגר הדוגמאות יש מדריך בנושא דיירות ב-Fleet עם דוגמאות להגדרות.
רשימה של השדות שנתמכים ב-Config Sync ב-Terraform מופיעה במסמכי העיון של Terraform בנושא תכונות של GKE fleet.
תהליך עבודה לדוגמה
אתם אדמינים של פלטפורמה שרוצים ליצור משאבים באופן דינמי ב-Fleet של אשכולות, שבהם לצוותים שונים יש צרכים שונים. לדוגמה, יכול להיות שתרצו להחיל NetworkPolicy על מרחבי השמות של צוות ה-Backend, אבל לא על מרחבי השמות של צוות ה-Frontend.
בתרחיש הזה, התהליך ליצירת משאבים בהיקף הצוות במרחב שמות הוא כזה:
- בוחרים או יוצרים את Fleet שבו רוצים לנהל את המשאבים של הצוותים.
הגדרת מקור מידע אמין. מקור האמת מכיל את אובייקטי
NamespaceSelectorשמשמשים לבחירת מרחבי שמות ברמת הצי בטווחים של הצוות, וכל משאב (כמוNetworkPolicy) שרוצים לסנכרן בין מרחבי השמות האלה.יוצרים את הגדרת ברירת המחדל ברמת הצי ל-Config Sync. סנכרון תצורות משתמש בהגדרות ברירת המחדל האלה כשמסנכרנים ממקור האמת שנוצר בשלב הקודם. ההגדרות האלה של סנכרון תצורות חלות על כל האשכולות החדשים שנוצרו ב-Fleet.
יוצרים אשכולות ב-Fleet.
יוצרים את מרחבי השמות וההיקפים של צוותי ה-Frontend וה-Backend כדי ש-Config Sync יוכל לזהות משאבים במרחבי השמות ולבצע התאמה ביניהם.
אחרי שמבצעים את השלבים האלה, סנכרון תצורות יוצר ומחיל את NetworkPolicy על סמך NamespaceSelector על מרחבי השמות של צוות ה-Backend. אם משנים או מוסיפים משאבים, סנכרון תצורות מזהה ומחיל באופן רציף את השינויים בקובצי התצורה, בהיקפי הצוות, במרחבי השמות של Fleet ובחברי Fleet.
תמחור
התכונות של סנכרון תצורות וניהול צוותים ב-Fleet זמינות כחלק מ-GKE. מידע נוסף על התמחור מופיע בדף התמחור של GKE.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Google Cloud פרויקט.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים Google Cloud פרויקט:
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם: Google Cloud
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Google Cloud פרויקט.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים Google Cloud פרויקט:
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם: Google Cloud
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
- ליצור מקור מידע (מאגר Git או תמונת OCI) או לקבל גישה למקור מידע שבו אפשר לאחסן את קובצי ההגדרות. בדוגמאות במדריך הזה נעשה שימוש במאגר Git.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות ליצירת משאבים של צוות לצי, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
-
ניהול משאבי Fleet:
אדמין של Fleet (לשעבר אדמין של GKE Hub) (
roles/gkehub.admin) -
יצירת אשכולות GKE:
Kubernetes Engine Cluster Admin (
roles/container.clusterAdmin)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
קבלת פרטי כניסה של משתמשים
כדי להריץ את פקודות Terraform במדריך הזה בסביבה המקומית, מריצים את הפקודה הבאה כדי לקבל פרטי כניסה חדשים של משתמש:
gcloud auth application-default login
הגדרת המאגר
בקטע הזה יוצרים את צי המכשירים ומפעילים את השירותים הנדרשים.
כדי להגדיר את צי הרכבים, מבצעים את השלבים הבאים:
יוצרים ספרייה לקובצי Terraform של תצורת הצי. לספרייה הזו מוסיפים קובץ
main.tfוקובץvariables.tf.מוסיפים את המשתנים הבאים לקובץ
variables.tf:מוסיפים את המשאבים הבאים לקובץ
main.tf:מייצאים את המשתנה PROJECT_ID:
export TF_VAR_project=PROJECT_IDמחליפים את
PROJECT_IDבמזהה הפרויקט שבו רוצים ליצור את צי המכונות.מפעילים את Terraform בספרייה שיצרתם:
terraform initמוודאים שהשינויים שאתם מציעים באמצעות Terraform תואמים לתוכנית הצפויה:
terraform planיוצרים את צי הרכבים, מפעילים את ממשקי ה-API ויוצרים את חשבון השירות:
terraform applyלפעמים לוקח כמה דקות עד שכל השירותים מופעלים.
הגדרת מקור מידע אמין
בקטע הזה מוסיפים קובצי הגדרה למקור אמת.
צריך אובייקט NamespaceSelector לכל היקף קבוצה שרוצים להשתמש בו.
לדוגמה, אם יש לכם צוות Frontend וצוות Backend, אתם צריכים ליצור אובייקט NamespaceSelector
לכל צוות. האובייקט NamespaceSelector בוחר את כל מרחבי השמות או חלק מהם בהיקף של צוות. אתם יכולים להוסיף משאבים נוספים של הצוות למקור האמת, כמו NetworkPolicy. כשיוצרים את המשאבים האלה, מפנים אל NamespaceSelector כדי שסנכרון תצורות יוכל לפרוס ולסנכרן את המשאבים האלה באופן דינמי במרחבי שמות.
כדי להגדיר את מקור האמת:
במקור האמת, יוצרים ספרייה לקובצי התצורה שרוצים שסנכרון תצורות יסנכרן מהם.
לכל צוות, יוצרים אובייקט
NamespaceSelectorבספריית ההגדרות:apiVersion: configmanagement.gke.io/v1 kind: NamespaceSelector metadata: name: NAMESPACE_SELECTOR_NAME spec: mode: dynamic selector: matchLabels: fleet.gke.io/fleet-scope: SCOPE_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
NAMESPACE_SELECTOR_NAME: השם של אובייקטNamespaceSelector, לדוגמהbackend-scope. -
SCOPE_NAME: השם של היקף הצוות, למשלbackend.
לכל מרחבי השמות שכלולים במרחב שמות של צי יש באופן אוטומטי את התווית
fleet.gke.io/fleet-scope: SCOPE_NAME. הפקודהNamespaceSelectorבוחרת את כל מרחבי השמות של Fleet בהיקף של צוות באמצעות התווית הזו. דוגמאות נוספות להכללה או להחרגה של מרחבי שמות זמינות בדוגמאות שלNamespaceSelector.-
יוצרים את האובייקטים שרוצים לסנכרן בין מרחבי השמות.
כדי לסנכרן אובייקט רק עם צוות מסוים, צריך להגדיר את ההערה הבאה במטא-נתונים של האובייקט:
annotations: configmanagement.gke.io/namespace-selector: NAMESPACE_SELECTOR_NAMEלדוגמה,
NetworkPolicyלצוות Backend יכול להיראות כך:
יצירת הגדרות ברירת מחדל ברמת ה-Fleet עבור סנכרון תצורות
בקטע הזה יוצרים הגדרות ברירת מחדל של סנכרון תצורות ברמת ה-Fleet, כך שאותה הגדרה של סנכרון תצורות תחול על כל האשכולות שנוצרו ב-Fleet.
כדי ליצור הגדרת ברירת מחדל ברמת ה-Fleet ל-סנכרון תצורות, מבצעים את השלבים הבאים:
יוצרים ספרייה לקובצי Terraform של תצורת ברירת המחדל של הצי. לספרייה הזו מוסיפים קובץ
main.tfוקובץvariables.tf.מוסיפים את המשתנים הבאים לקובץ
variables.tf:בקובץ
main.tf, מוסיפים את המשאב הבא כדי להגדיר את ההגדרות של Config Sync:Git
terraform { required_providers { google = { source = "hashicorp/google" version = ">=5.16.0" } } } provider "google" { project = var.project } resource "google_gke_hub_feature" "feature" { name = "configmanagement" location = "global" provider = google fleet_default_member_config { configmanagement { version = "VERSION" config_sync { source_format = "unstructured" git { sync_repo = "REPO" sync_branch = "BRANCH" policy_dir = "DIRECTORY" secret_type = "SECRET" } } } } }מחליפים את מה שכתוב בשדות הבאים:
-
VERSION: (אופציונלי) מספר הגרסה של סנכרון תצורות. אם לא מציינים גרסה, ברירת המחדל היא הגרסה האחרונה. -
REPO: כתובת ה-URL למאגר שמכיל את קובצי ההגדרות. -
BRANCH: הענף במאגר, לדוגמהmain. -
DIRECTORY: הנתיב במאגר Git שמייצג את הרמה העליונה של המאגר שרוצים לסנכרן. SECRET: סוג האימות הסודי.
רשימה מלאה של ההגדרות שנתמכות בבלוק
gitשל סנכרון תצורות מופיעה במאמרי העזרה של Terraform בנושא תכונות של GKE Hub.OCI
terraform { required_providers { google = { source = "hashicorp/google" version = ">=5.16.0" } } } provider "google" { project = var.project } resource "google_gke_hub_feature" "feature" { name = "configmanagement" location = "global" provider = google fleet_default_member_config { configmanagement { version = "VERSION" config_sync { source_format = "unstructured" oci { sync_repo = "REPO" policy_dir = "DIRECTORY" secret_type = "SECRET" } } } } }מחליפים את מה שכתוב בשדות הבאים:
-
VERSION: מספר הגרסה של סנכרון תצורות. אם לא מציינים גרסה, ברירת המחדל היא הגרסה האחרונה. -
REPO: כתובת ה-URL למאגר תמונות OCI שמכיל קובצי תצורה. -
DIRECTORY: הנתיב המוחלט של הספרייה שמכילה את המשאבים שרוצים לסנכרן. כדי להשתמש בספריית הבסיס, צריך להשאיר את השדה ריק. SECRET: סוג האימות הסודי.
רשימה מלאה של ההגדרות שנתמכות בבלוק
ociשל סנכרון תצורות מופיעה במאמרי העזרה של Terraform בנושא תכונות של GKE Hub.לדוגמה, קובץ התצורה
main.tfהבא מגדיר את סנכרון תצורות לסנכרון ממאגר Git, ומסנכרן את כל האובייקטים שנמצאים בספרייהconfig:-
מפעילים את Terraform בספרייה שיצרתם:
terraform initמוודאים שהשינויים שאתם מציעים באמצעות Terraform תואמים לתוכנית הצפויה:
terraform planיצירת הגדרות ברירת מחדל לחברי הצי:
terraform apply
יצירת אשכולות בצי
בקטע הזה יוצרים הגדרת אשכול משותפת ואז יוצרים אשכולות ב-Fleet.
כדי ליצור ולרשום אשכולות חדשים ל-Fleet, מבצעים את השלבים הבאים:
יוצרים ספרייה לקובצי התצורה של Terraform לאשכול. לספרייה הזו מוסיפים קובץ
main.tfוקובץvariables.tf.מוסיפים את המשתנים הבאים לקובץ
variables.tf:יוצרים קובץ
cluster.tfשמכיל ערכי ברירת מחדל שמשמשים בכל האשכולות, כמו מזהה הפרויקט ומזהה ה-Fleet:variable "location" { type = string } variable "cluster_name" { type = string } data "google_project" "project" { provider = google } resource "google_container_cluster" "cluster" { provider = google name = var.cluster_name location = var.location initial_node_count = 3 project = data.google_project.project.project_id fleet { project = data.google_project.project.project_id } workload_identity_config { workload_pool = "${data.google_project.project.project_id}.svc.id.goog" } deletion_protection = false }מוסיפים את המשאבים הבאים לקובץ
main.tf:terraform { required_providers { google = { source = "hashicorp/google" version = ">=5.16.0" } } } provider "google" { project = var.project } module "MODULE_NAME" { source = "CLUSTER_CONFIGURATION_FILEPATH" cluster_name = "CLUSTER_NAME" location="CLUSTER_LOCATION" }מחליפים את מה שכתוב בשדות הבאים:
-
MODULE_NAME: השם שרוצים לתת למודול של האשכול. הערכים של MODULE_NAME ו-CLUSTER_NAME יכולים להיות זהים, למשלus-east-cluster. -
CLUSTER_CONFIGURATION_FILEPATH: הנתיב היחסי לקובץcluster.tfשיצרתם. -
CLUSTER_NAME: השם של האשכול. הערכים של MODULE_NAME ו-CLUSTER_NAME יכולים להיות זהים, למשלus-east-cluster. -
CLUSTER_LOCATION: המיקום של האשכול, לדוגמהus-east1.
אפשר ליצור כמה אשכולות שרוצים. לדוגמה, קובץ
main.tfהבא יוצר 3 אשכולות באזורים שונים:-
מפעילים את Terraform בספרייה שיצרתם:
terraform initמוודאים שהשינויים שאתם מציעים באמצעות Terraform תואמים לתוכנית הצפויה:
terraform planיוצרים את האשכולות:
terraform apply
הגדרת היקפי צוותים ומרחבי שמות של צי
בקטע הזה יוצרים את היקפי הצוות ומשייכים את האשכולות להיקפים האלה. לאחר מכן יוצרים את מרחבי השמות של ה-Fleet שנדרשים, למשל אחד לכל צוות, בכל היקף, וסנכרון תצורות יוצר את המשאבים בכל מרחבי השמות.
כדי להגדיר את ההיקפים והמרחבים של הצוות, מבצעים את השלבים הבאים:
יוצרים ספרייה לקובצי התצורה של Terraform עבור מרחב השמות וההיקף של הצוות. לספרייה הזו מוסיפים קובץ
main.tfוקובץvariables.tf.מוסיפים את המשתנים הבאים לקובץ
variables.tf:מוסיפים את המשאבים הבאים לקובץ
main.tf:מוסיפים את פרטי הספק:
terraform { required_providers { google = { source = "hashicorp/google" version = ">=5.16.0" } } } provider "google" { project = var.project }מוסיפים את המשאב של היקף הצוות:
resource "google_gke_hub_scope" "scope" { provider = google for_each = toset([ "SCOPE_NAME", "SCOPE_NAME_2", ]) scope_id = each.value }מחליפים את מה שכתוב בשדות הבאים:
-
SCOPE_NAME: השם של היקף הצוות, למשלbackend. -
SCOPE_NAME_2: היקף נוסף של צוות, אם יצרתם כזה.
אפשר להוסיף כמה היקפי צוות שרוצים. כשיוצרים מרחב שמות של Fleet באשכול, המערכת מוסיפה לו באופן אוטומטי את התווית
fleet.gke.io/fleet-scope: SCOPE_NAME, וכך סנכרון תצורות יכול לבחור מרחבי שמות על סמך התוויותNamespaceSelectorשקיימות כשמסנכרנים משאבי Kubernetes.לדוגמה, משאב Terraform בהיקף צוותי שכולל היקף גם לצוות Frontend וגם לצוות Backend יכול להיראות כך:
-
מוסיפים קשר בין חברות ב-Fleet לבין כל אשכול שרוצים להחיל על היקף הצוות:
resource "google_gke_hub_membership_binding" "membership-binding" { provider = google for_each = { MEMBERSHIP_BINDING_NAME = { membership_binding_id = "MEMBERSHIP_BINDING_ID" scope = google_gke_hub_scope.scope["SCOPE_NAME"].name membership_id = "CLUSTER_NAME" location = "CLUSTER_LOCATION" } MEMBERSHIP_BINDING_NAME_2 = { membership_binding_id = "MEMBERSHIP_BINDING_ID_2" scope = google_gke_hub_scope.scope["SCOPE_NAME_2"].name membership_id = "CLUSTER_NAME_2" location = "CLUSTER_LOCATION_2" } } membership_binding_id = each.value.membership_binding_id scope = each.value.scope membership_id = each.value.membership_id location = each.value.location depends_on = [google_gke_hub_scope.scope] }מחליפים את מה שכתוב בשדות הבאים:
-
MEMBERSHIP_BINDING_NAME: שם הקישור לחברות, למשלus-east-backend. -
MEMBERSIP_BINDING_ID: מזהה הקישור של החברות. הערך כאן יכול להיות זהה לערך של MEMBERSHIP_BINDING_NAME. -
SCOPE_NAME: בורר התוויות שנתתם להיקף הצוות כשיצרתםNamespaceSelector, לדוגמהbackend. -
CLUSTER_NAME: השם של האשכול שיצרתם כשיצרתם אשכולות, למשלus-east-cluster. -
CLUSTER_LOCATION: מיקום האשכול, לדוגמהus-east1.
צריך להגדיר קישור של חברות ב-Fleet לכל אשכול. אם לא מגדירים היקף צוות לאשכול, האשכול לא נוצר למרחב השמות הזה. לדוגמה, אם יש לכם שלושה אשכולות באזורים
us-east1,us-west1ו-us-central1, אבל האשכולus-central1מיועד רק לצוות Frontend, משאב קישור החברות שלכם ייראה כך:-
מוסיפים את מרחבי השמות שרוצים להגדיר לצוותים:
resource "google_gke_hub_namespace" "fleet_namespace" { provider = google for_each = { FLEET_NAMESPACE = { scope_id = "SCOPE_NAME" scope_namespace_id = "FLEET_NAMESPACE_ID" scope = google_gke_hub_scope.scope["SCOPE_NAME"].name } FLEET_NAMESPACE_2 = { scope_id = "SCOPE_NAME" scope_namespace_id = "FLEET_NAMESPACE_ID_2" scope = google_gke_hub_scope.scope["SCOPE_NAME"].name } } scope_namespace_id = each.value.scope_namespace_id scope_id = each.value.scope_id scope = each.value.scope depends_on = [google_gke_hub_scope.scope] }מחליפים את מה שכתוב בשדות הבאים:
-
FLEET_NAMESPACE: השם שרוצים לתת למרחב השמות, למשלbackend-a. -
SCOPE_NAME: בורר התוויות שנתתם להיקף הצוות כשיצרתםNamespaceSelector, לדוגמהbackend. -
FLEET_NAMESPACE_ID: מזהה מרחב השמות. הערך כאן יכול להיות זהה לערך של FLEET_NAMESPACE.
לדוגמה, אם רוצים שגם צוות ה-Frontend וגם צוות ה-Backend יקבלו שני מרחבי שמות כל אחד, משאב מרחב השמות של הצי יכול להיראות כך:
-
מפעילים את Terraform בספרייה שיצרתם:
terraform initמוודאים שהשינויים שאתם מציעים באמצעות Terraform תואמים לתוכנית הצפויה:
terraform planיוצרים את ההיקפים ואת מרחבי השמות של הצי:
terraform apply
אחרי שיוצרים היקפים ומרחבי שמות של Fleet, סנכרון תצורות מזהה את מרחבי השמות החדשים ואת ההיקפים שלהם, בוחר משאבים במרחבי השמות של Fleet ומבצע התאמה ביניהם לבין קובצי ההגדרות.
כדי לוודא שהמשאבים שלכם הוחלו על האשכול הנכון, אתם יכולים להשתמש ב-nomos status או לעבור לכרטיסייה Packages של סנכרון תצורות ב- Google Cloud console ולשנות את לחצן הבחירה View by ל-Cluster.
סנכרון תצורות מסנכרן את המשאבים שלכם בין מרחבי שמות על סמך היקפי הצוותים, בהתאם להגדרה שמאוחסנת במקור המידע האמין. בכל פעם שמוסיפים משאב חדש, אם כוללים את האנוטציה הנכונה NamespaceSelector, סנכרון תצורות מבצע באופן אוטומטי תיאום של המשאב הזה במרחבי השמות של הצוות.
אם רוצים להחיל את ההגדרות של סנכרון תצורות על אשכולות קיימים, אפשר לעיין בהוראות להגדרת ברירות מחדל ברמת ה-Fleet במדריך להתקנת סנכרון תצורות.