בדף הזה מוסבר איך להשתמש בסנכרון תצורות וב-Terraform כדי ליצור באופן דינמי משאבים בהיקף צוותי בכל אשכולי ה-Fleet. סנכרון תצורות מרחיב את היכולות של ניהול צוותים ב-Fleet כדי ליצור ולנהל תצורות של תשתית ושל אשכולות בכל ה-Fleets.
במדריך הזה אנחנו מניחים שאתם כבר מכירים את המושגים שקשורים לניהול צוותים בצי רכב, כמו היקפי צוותים ומרחבי שמות של צי רכב. מידע נוסף מופיע במאמר סקירה כללית על ניהול צוותים בצי.
במאגר לדוגמה, תוכלו למצוא מדריך מקיף להגדרת דיירים ב-Fleet עם הגדרות לדוגמה.
רשימה של השדות שנתמכים ב-סנכרון תצורות ב-Terraform מופיעה במסמכי העזר של Terraform בנושא תכונות של GKE fleet.
דוגמה לתהליך עבודה
אתם אדמינים של פלטפורמה שרוצים ליצור משאבים באופן דינמי בצי של אשכולות, שבהם לצוותים שונים יש צרכים שונים. לדוגמה, יכול להיות שתרצו להחיל NetworkPolicy על מרחבי השמות של צוות ה-Backend, אבל לא על מרחבי השמות של צוות ה-Frontend.
בתרחיש הזה, התהליך ליצירת משאבים בהיקף הצוות במרחב שמות הוא כזה:
- בוחרים או יוצרים את צי הרכבים שבו רוצים לנהל את המשאבים של הצוותים.
מגדירים את מקור המידע האמין. מקור האמת מכיל את האובייקטים
NamespaceSelectorשבהם אתם משתמשים כדי לבחור מרחבי שמות ברמת הצי, בהיקפי הצוות, וכל משאב (כמוNetworkPolicy) שאתם רוצים לסנכרן בין מרחבי השמות האלה.יוצרים את הגדרת ברירת המחדל ברמת הצי ל-Config Sync. סנכרון תצורות משתמש בהגדרות ברירת המחדל האלה כשמסנכרנים ממקור האמת שנוצר בשלב הקודם. ההגדרות האלה של סנכרון תצורות חלות על כל האשכולות החדשים שנוצרו ב-Fleet.
יוצרים אשכולות בצי.
יוצרים את מרחבי השמות וההיקפים של צוותי ה-Frontend וה-Backend, כדי שסנכרון תצורות יוכל לזהות ולתאם את המשאבים במרחבי השמות.
אחרי שמבצעים את השלבים האלה, סנכרון תצורות יוצר את NetworkPolicy ומחיל אותו על מרחבי השמות של צוות ה-Backend על סמך NamespaceSelector. אם משנים או מוסיפים משאבים, סנכרון תצורות מזהה ומחיל באופן רציף את השינויים בקובצי התצורה, בהיקפי הצוות, במרחבי השמות של Fleet ובגורמים של Fleet.
תמחור
התכונות סנכרון תצורות וניהול צוותים ב-Fleet זמינות כחלק מ-GKE. למידע נוסף על תמחור, ראו דף התמחור של GKE.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים פרויקט ב- 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 .
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים פרויקט ב- 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 .
- ליצור מקור מידע (מאגר 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 כדי ש-Config Sync יוכל לפרוס ולסנכרן את המשאבים האלה באופן דינמי במרחבי שמות.
כדי להגדיר את מקור המידע המהימן:
במקור האמת, יוצרים ספרייה לקובצי התצורה שאתם רוצים ש-סנכרון תצורות יסנכרן.
לכל צוות, יוצרים אובייקט
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.-
יוצרים את האובייקטים שרוצים לסנכרן בין מרחבי השמות.
כדי לסנכרן אובייקט רק עם צוות מסוים, צריך להגדיר את ההערה הבאה במטא-נתונים של האובייקט:
annotations: configmanagement.gke.io/namespace-selector: NAMESPACE_SELECTOR_NAMEלדוגמה,
NetworkPolicyלצוות Backend יכול להיראות כך:
יצירת הגדרות ברירת מחדל ברמת הצי ל-Config Sync
בקטע הזה יוצרים הגדרות ברירת מחדל של סנכרון תצורות ברמת ה-Fleet, שמחילות את אותה ההגדרה של סנכרון תצורות על כל האשכולות שנוצרו ב-Fleet.
כדי ליצור הגדרת ברירת מחדל ברמת ה-Fleet לסנכרון תצורות:
יוצרים ספרייה לקובצי התצורה של Terraform שמוגדרים כברירת מחדל ב-Fleet. לספרייה הזו מוסיפים קובץ
main.tfוקובץvariables.tf.בקובץ
variables.tf, מוסיפים את המשתנים הבאים:בקובץ
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 בספרייה שיצרתם:
terraform initבודקים שהשינויים שאתם מציעים באמצעות Terraform תואמים לתוכנית הצפויה:
terraform planיצירת הגדרות ברירת המחדל של חברי הצי:
terraform apply
יצירת אשכולות בצי
בקטע הזה יוצרים הגדרת אשכול משותפת ואז יוצרים אשכולות בצי.
כדי ליצור ולאגד אשכולות חדשים לצי, מבצעים את השלבים הבאים:
יוצרים ספרייה לקובצי התצורה של Terraform לאשכול. לספרייה הזו מוסיפים קובץ
main.tfוקובץvariables.tf.מוסיפים את המשתנים הבאים לקובץ
variables.tf:יוצרים קובץ
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 }מוסיפים את המשאבים הבאים לקובץ
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.
צריך להגדיר קישור של חברות בצי לכל אשכול. אם לא מגדירים היקף צוות לאשכול, האשכול הזה לא נוצר למרחב השמות הזה. לדוגמה, אם יש לכם שלושה אשכולות באזורים
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 ולשנות את לחצן הבחירה View by ל-Cluster.
סנכרון תצורות מסנכרן את המשאבים שלכם בין מרחבי שמות על סמך ההיקפים של הצוותים, בהתאם להגדרה שמאוחסנת במקור המידע האמין. בכל פעם שמוסיפים משאב חדש, אם כוללים את ה<b>אנוטציה</b> הנכונה NamespaceSelector, <b>סנכרון תצורות</b> מבצע באופן אוטומטי תיאום של המשאב הזה במרחבי השמות של הצוות.
אם רוצים להחיל את ההגדרות של סנכרון תצורות על אשכולות קיימים, אפשר לעיין בהוראות להגדרת ברירות מחדל ברמת ה-Fleet במדריך להתקנת סנכרון תצורות.