ניהול משאבי הצוות בכל הצי

בדף הזה מוסבר איך להשתמש בסנכרון תצורות וב-Terraform כדי ליצור באופן דינמי משאבים בהיקף צוותי ב-Fleet של אשכולות. ‫סנכרון תצורות מרחיב את היכולות של ניהול צוותים ב-Fleet כדי ליצור ולנהל תצורות של תשתית ואשכולות בכל ה-Fleets.

במדריך הזה אנחנו מניחים שאתם כבר מכירים את המושגים שקשורים לניהול צוותים של Fleet, כמו היקפי צוותים ומרחבי שמות של Fleet. מידע נוסף מופיע במאמר סקירה כללית על ניהול צוותים בצי.

במאגר הדוגמאות יש מדריך בנושא דיירות ב-Fleet עם דוגמאות להגדרות.

רשימה של השדות שנתמכים ב-Config Sync ב-Terraform מופיעה במסמכי העיון של Terraform בנושא תכונות של GKE fleet.

תהליך עבודה לדוגמה

אתם אדמינים של פלטפורמה שרוצים ליצור משאבים באופן דינמי ב-Fleet של אשכולות, שבהם לצוותים שונים יש צרכים שונים. לדוגמה, יכול להיות שתרצו להחיל NetworkPolicy על מרחבי השמות של צוות ה-Backend, אבל לא על מרחבי השמות של צוות ה-Frontend. בתרחיש הזה, התהליך ליצירת משאבים בהיקף הצוות במרחב שמות הוא כזה:

  1. בוחרים או יוצרים את Fleet שבו רוצים לנהל את המשאבים של הצוותים.
  2. הגדרת מקור מידע אמין. מקור האמת מכיל את אובייקטי NamespaceSelector שמשמשים לבחירת מרחבי שמות ברמת הצי בטווחים של הצוות, וכל משאב (כמו NetworkPolicy) שרוצים לסנכרן בין מרחבי השמות האלה.

  3. יוצרים את הגדרת ברירת המחדל ברמת הצי ל-Config Sync. ‫סנכרון תצורות משתמש בהגדרות ברירת המחדל האלה כשמסנכרנים ממקור האמת שנוצר בשלב הקודם. ההגדרות האלה של סנכרון תצורות חלות על כל האשכולות החדשים שנוצרו ב-Fleet.

  4. יוצרים אשכולות ב-Fleet.

  5. יוצרים את מרחבי השמות וההיקפים של צוותי ה-Frontend וה-Backend כדי ש-Config Sync יוכל לזהות משאבים במרחבי השמות ולבצע התאמה ביניהם.

אחרי שמבצעים את השלבים האלה, סנכרון תצורות יוצר ומחיל את NetworkPolicy על סמך NamespaceSelector על מרחבי השמות של צוות ה-Backend. אם משנים או מוסיפים משאבים, סנכרון תצורות מזהה ומחיל באופן רציף את השינויים בקובצי התצורה, בהיקפי הצוות, במרחבי השמות של Fleet ובחברי Fleet.

תמחור

התכונות של סנכרון תצורות וניהול צוותים ב-Fleet זמינות כחלק מ-GKE. מידע נוסף על התמחור מופיע בדף התמחור של GKE.

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. התקינו את ה-CLI של Google Cloud.

  3. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  4. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  5. יוצרים או בוחרים 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 .

  6. התקינו את ה-CLI של Google Cloud.

  7. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  8. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  9. יוצרים או בוחרים 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 .

  10. ליצור מקור מידע (מאגר Git או תמונת OCI) או לקבל גישה למקור מידע שבו אפשר לאחסן את קובצי ההגדרות. בדוגמאות במדריך הזה נעשה שימוש במאגר Git.

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות ליצירת משאבים של צוות לצי, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

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

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

קבלת פרטי כניסה של משתמשים

כדי להריץ את פקודות Terraform במדריך הזה בסביבה המקומית, מריצים את הפקודה הבאה כדי לקבל פרטי כניסה חדשים של משתמש:

gcloud auth application-default login

הגדרת המאגר

בקטע הזה יוצרים את צי המכשירים ומפעילים את השירותים הנדרשים.

כדי להגדיר את צי הרכבים, מבצעים את השלבים הבאים:

  1. יוצרים ספרייה לקובצי Terraform של תצורת הצי. לספרייה הזו מוסיפים קובץ main.tf וקובץ variables.tf.

  2. מוסיפים את המשתנים הבאים לקובץ variables.tf:

    variable "project" {
      type = string
      description = "GCP project ID"
    }

  3. מוסיפים את המשאבים הבאים לקובץ main.tf:

    terraform {
      required_providers {
        google = {
          source = "hashicorp/google"
          version = ">= 5.16.0"
        }
      }
    }
    
    provider "google" {
      # project variable must be provided at runtime
      project = var.project
    }
    
    # Enable API services
    resource "google_project_service" "services" {
      for_each = toset([
        "gkehub.googleapis.com",
        "container.googleapis.com",
        "connectgateway.googleapis.com",
        "cloudresourcemanager.googleapis.com",
        "iam.googleapis.com",
        "anthos.googleapis.com",
        "anthosconfigmanagement.googleapis.com",
      ])
      service = each.value
      disable_on_destroy = false
    }
    
    # Declare a fleet in the project
    resource "google_gke_hub_fleet" "default" {
      display_name = "demo"
    
      depends_on = [google_project_service.services]
    }
  4. מייצאים את המשתנה PROJECT_ID:

    export TF_VAR_project=PROJECT_ID
    

    מחליפים את PROJECT_ID במזהה הפרויקט שבו רוצים ליצור את צי המכונות.

  5. מפעילים את Terraform בספרייה שיצרתם:

    terraform init
    
  6. מוודאים שהשינויים שאתם מציעים באמצעות Terraform תואמים לתוכנית הצפויה:

    terraform plan
    
  7. יוצרים את צי הרכבים, מפעילים את ממשקי ה-API ויוצרים את חשבון השירות:

    terraform apply
    

    לפעמים לוקח כמה דקות עד שכל השירותים מופעלים.

הגדרת מקור מידע אמין

בקטע הזה מוסיפים קובצי הגדרה למקור אמת. צריך אובייקט NamespaceSelector לכל היקף קבוצה שרוצים להשתמש בו. לדוגמה, אם יש לכם צוות Frontend וצוות Backend, אתם צריכים ליצור אובייקט NamespaceSelector לכל צוות. האובייקט NamespaceSelector בוחר את כל מרחבי השמות או חלק מהם בהיקף של צוות. אתם יכולים להוסיף משאבים נוספים של הצוות למקור האמת, כמו NetworkPolicy. כשיוצרים את המשאבים האלה, מפנים אל NamespaceSelector כדי שסנכרון תצורות יוכל לפרוס ולסנכרן את המשאבים האלה באופן דינמי במרחבי שמות.

כדי להגדיר את מקור האמת:

  1. במקור האמת, יוצרים ספרייה לקובצי התצורה שרוצים שסנכרון תצורות יסנכרן מהם.

  2. לכל צוות, יוצרים אובייקט 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.

  3. יוצרים את האובייקטים שרוצים לסנכרן בין מרחבי השמות.

    כדי לסנכרן אובייקט רק עם צוות מסוים, צריך להגדיר את ההערה הבאה במטא-נתונים של האובייקט:

    annotations:
      configmanagement.gke.io/namespace-selector: NAMESPACE_SELECTOR_NAME
    

    לדוגמה, NetworkPolicy לצוות Backend יכול להיראות כך:

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: be-deny-all
      annotations:
        configmanagement.gke.io/namespace-selector: backend-scope # Actuate this resource in the namespaces with labels matched by the namespace selector
    spec:
      ingress:
      - from:
        - podSelector: {}
      podSelector:
        matchLabels: null

יצירת הגדרות ברירת מחדל ברמת ה-Fleet עבור סנכרון תצורות

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

כדי ליצור הגדרת ברירת מחדל ברמת ה-Fleet ל-סנכרון תצורות, מבצעים את השלבים הבאים:

  1. יוצרים ספרייה לקובצי Terraform של תצורת ברירת המחדל של הצי. לספרייה הזו מוסיפים קובץ main.tf וקובץ variables.tf.

  2. מוסיפים את המשתנים הבאים לקובץ variables.tf:

    variable "project" {
      type = string
      description = "GCP project ID"
    }

  3. בקובץ 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 {
      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 = "1.17.0" # Use the default latest version; if specifying a version, it must be at or after 1.17.0
          config_sync {
            source_format = "unstructured"
            git {
              sync_repo = "https://github.com/GoogleCloudPlatform/anthos-config-management-samples"
              sync_branch = "main"
              policy_dir = "fleet-tenancy/config"
              secret_type = "none"
            }
          }
        }
      }
    }
  4. מפעילים את Terraform בספרייה שיצרתם:

    terraform init
    
  5. מוודאים שהשינויים שאתם מציעים באמצעות Terraform תואמים לתוכנית הצפויה:

    terraform plan
    
  6. יצירת הגדרות ברירת מחדל לחברי הצי:

    terraform apply
    

יצירת אשכולות בצי

בקטע הזה יוצרים הגדרת אשכול משותפת ואז יוצרים אשכולות ב-Fleet.

כדי ליצור ולרשום אשכולות חדשים ל-Fleet, מבצעים את השלבים הבאים:

  1. יוצרים ספרייה לקובצי התצורה של Terraform לאשכול. לספרייה הזו מוסיפים קובץ main.tf וקובץ variables.tf.

  2. מוסיפים את המשתנים הבאים לקובץ variables.tf:

    variable "project" {
      type = string
      description = "GCP project ID"
    }

  3. יוצרים קובץ 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
    }
    
  4. מוסיפים את המשאבים הבאים לקובץ 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 {
      required_providers {
        google = {
          source = "hashicorp/google"
          version = ">= 5.16.0"
        }
      }
    }
    
    provider "google" {
      project = var.project
    }
    
    module "us-west-cluster" {
      source = "./cluster"
      cluster_name = "us-west-cluster"
      location="us-west1-a"
    }
    
    module "us-east-cluster" {
      source = "./cluster"
      cluster_name = "us-east-cluster"
      location="us-east1-b"
    }
    
    module "us-central-cluster" {
      source = "./cluster"
      cluster_name = "us-central-cluster"
      location="us-central1-c"
    }
  5. מפעילים את Terraform בספרייה שיצרתם:

    terraform init
    
  6. מוודאים שהשינויים שאתם מציעים באמצעות Terraform תואמים לתוכנית הצפויה:

    terraform plan
    
  7. יוצרים את האשכולות:

    terraform apply
    

הגדרת היקפי צוותים ומרחבי שמות של צי

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

כדי להגדיר את ההיקפים והמרחבים של הצוות, מבצעים את השלבים הבאים:

  1. יוצרים ספרייה לקובצי התצורה של Terraform עבור מרחב השמות וההיקף של הצוות. לספרייה הזו מוסיפים קובץ main.tf וקובץ variables.tf.

  2. מוסיפים את המשתנים הבאים לקובץ variables.tf:

    variable "project" {
      type = string
      description = "GCP project ID"
    }
    

  3. מוסיפים את המשאבים הבאים לקובץ main.tf:

    1. מוסיפים את פרטי הספק:

      terraform {
        required_providers {
          google = {
            source = "hashicorp/google"
            version = ">=5.16.0"
           }
         }
       }
      
      provider "google" {
        project = var.project
      }
      
    2. מוסיפים את המשאב של היקף הצוות:

      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 יכול להיראות כך:

      resource "google_gke_hub_scope" "scope" {
        provider = google
        for_each = toset([
          "backend",
          "frontend",
        ])
        scope_id = each.value
      }
    3. מוסיפים קשר בין חברות ב-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_membership_binding" "membership-binding" {
        provider = google
        for_each = {
          us-east-backend = {
            membership_binding_id = "us-east-backend"
            scope = google_gke_hub_scope.scope["backend"].name
            membership_id = "us-east-cluster"
            location = "us-east1"
          }
          us-west-backend = {
            membership_binding_id = "us-west-backend"
            scope = google_gke_hub_scope.scope["backend"].name
            membership_id = "us-west-cluster"
            location = "us-west1"
          }
          us-east-frontend = {
            membership_binding_id = "us-east-frontend"
            scope = google_gke_hub_scope.scope["frontend"].name
            membership_id = "us-east-cluster"
            location = "us-east1"
          }
          us-west-frontend = {
            membership_binding_id = "us-west-frontend"
            scope = google_gke_hub_scope.scope["frontend"].name
            membership_id = "us-west-cluster"
            location = "us-west1"
          }
          us-central-frontend = {
            membership_binding_id = "us-central-frontend"
            scope = google_gke_hub_scope.scope["frontend"].name
            membership_id = "us-central-cluster"
            location = "us-central1"
          }
        }
      
        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]
      }
    4. מוסיפים את מרחבי השמות שרוצים להגדיר לצוותים:

      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 יקבלו שני מרחבי שמות כל אחד, משאב מרחב השמות של הצי יכול להיראות כך:

      resource "google_gke_hub_namespace" "fleet_namespace" {
        provider = google
      
        for_each = {
          bookstore = {
            scope_id = "backend"
            scope_namespace_id = "bookstore"
            scope = google_gke_hub_scope.scope["backend"].name
          }
          shoestore = {
            scope_id = "backend"
            scope_namespace_id = "shoestore"
            scope = google_gke_hub_scope.scope["backend"].name
          }
          frontend_a = {
            scope_id = "frontend"
            scope_namespace_id = "frontend-a"
            scope = google_gke_hub_scope.scope["frontend"].name
          }
          frontend_b = {
            scope_id = "frontend"
            scope_namespace_id = "frontend-b"
            scope = google_gke_hub_scope.scope["frontend"].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]
      }
  4. מפעילים את Terraform בספרייה שיצרתם:

    terraform init
    
  5. מוודאים שהשינויים שאתם מציעים באמצעות Terraform תואמים לתוכנית הצפויה:

    terraform plan
    
  6. יוצרים את ההיקפים ואת מרחבי השמות של הצי:

    terraform apply
    

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

כדי לוודא שהמשאבים שלכם הוחלו על האשכול הנכון, אתם יכולים להשתמש ב-nomos status או לעבור לכרטיסייה Packages של סנכרון תצורות ב- Google Cloud console ולשנות את לחצן הבחירה View by ל-Cluster.

לדף Packages

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

אם רוצים להחיל את ההגדרות של סנכרון תצורות על אשכולות קיימים, אפשר לעיין בהוראות להגדרת ברירות מחדל ברמת ה-Fleet במדריך להתקנת סנכרון תצורות.

המאמרים הבאים