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

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

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

במאגר לדוגמה, תוכלו למצוא מדריך מקיף להגדרת דיירים ב-Fleet עם הגדרות לדוגמה.

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

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

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

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

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

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

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

אחרי שמבצעים את השלבים האלה, סנכרון תצורות יוצר את NetworkPolicy ומחיל אותו על מרחבי השמות של צוות ה-Backend על סמך NamespaceSelector. אם משנים או מוסיפים משאבים, סנכרון תצורות מזהה ומחיל באופן רציף את השינויים בקובצי התצורה, בהיקפי הצוות, במרחבי השמות של 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 .

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • בחירת פרויקט: כדי לבחור פרויקט לא נדרש תפקיד 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 .

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • בחירת פרויקט: כדי לבחור פרויקט לא נדרש תפקיד 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 כדי ש-Config Sync יוכל לפרוס ולסנכרן את המשאבים האלה באופן דינמי במרחבי שמות.

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

  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 מקבלים באופן אוטומטי את התווית fleet.gke.io/fleet-scope: SCOPE_NAME. הפקודה NamespaceSelector בוחרת את כל מרחבי השמות של צי הרכבים בהיקף של צוות באמצעות התווית הזו. דוגמאות נוספות להכללה או להחרגה של מרחבי שמות זמינות בדוגמאות של 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

יצירת הגדרות ברירת מחדל ברמת הצי ל-Config Sync

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

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

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

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

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

  3. בקובץ main.tf, מוסיפים את המשאב הבא כדי להגדיר את ההגדרות של סנכרון תצורות:

    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
    

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

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

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

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

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

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

  3. יוצרים קובץ cluster.tf שמכיל ערכי ברירת מחדל שמשמשים בכל האשכולות, כמו מזהי הפרויקט והצי:

    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.

      צריך להגדיר קישור של חברות בצי לכל אשכול. אם לא מגדירים היקף צוות לאשכול, האשכול הזה לא נוצר למרחב השמות הזה. לדוגמה, אם יש לכם שלושה אשכולות באזורים 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 ולשנות את לחצן הבחירה View by ל-Cluster.

לדף Packages

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

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

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