הגדרת Terraform

כדי להשתמש ב-Terraform בסביבה עם Air Gap של Google Distributed Cloud ‏ (GDC), צריך להוריד אותו ולהגדיר אותו לטיפול במשאבים ב-Kubernetes.

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

  • מורידים את Terraform בגרסה 1.6.3 ואילך לתחנת העבודה, לפי המסמכים של HashiCorp: ‏https://developer.hashicorp.com/terraform/install. הגדרת הקצה העורפי במסמך הזה משתמשת בהגדרות שלא נתמכות בגרסאות ישנות יותר של Terraform.

  • מוודאים שיש לכם קטגוריית אחסון קיימת ב-GDC. אם אין לכם קטגוריית אחסון, צרו אחת.

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

ניהול קובץ תמונת המצב

קובץ תמונת המצב ב-Terraform משמש לתיעוד המצב הנוכחי של הפריסה ולמיפוי שלו להגדרות של Terraform. מכיוון שמאגר האובייקטים של GDC מוטמע באמצעות S3, אתם יכולים להשתמש ב-API של Terraform S3 כדי לסנכרן עם קובץ תמונת מצב משותף. כדי לעשות את זה, צריך להגדיר את Terraform לסנכרון עם המצב המרוחק:

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

    terraform {
      backend "s3" {
        bucket = "BUCKET_FQN"
        key = "TF_STATE_PATH"
        region = "ZONE"
        endpoints = {
          s3 = "BUCKET_ENDPOINT"
        }
        use_path_style = true
        access_key = "ACCESS_KEY"
        secret_key = "SECRET_KEY"
        skip_credentials_validation = true
        skip_requesting_account_id = true
        skip_metadata_api_check = true
        skip_region_validation = true
        skip_s3_checksum = true
      }
    }
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫BUCKET_FQN: הערך של status.fullyQualifiedName מהמשאב המותאם אישית Bucket. לדוגמה, aabc2z8-platform-terraform-state.

    • ‫TF_STATE_PATH: הנתיב של קובץ תמונת המצב של Terraform שרוצים לאחסן בקטגוריית האחסון. לדוגמה, main.tfstate.

    • ‫ZONE: האזור של המשאב בהתאמה אישית של Bucket (status.region). לדוגמה, zone1. ב-Terraform נדרש ערך של אזור, אבל הוא לא נבדק במאגר האובייקטים של GDC.

    • ‫BUCKET_ENDPOINT: הערך של status.endpoint מהמשאב המותאם אישית Bucket. לדוגמה, https://objectstorage.org-1.zone1.google.gdch.test.

    • ‫ACCESS_KEY: מפתח הגישה שנרכש מהסוד שמכיל את פרטי הכניסה שלכם. כדי לקבל את מפתח הגישה, פועלים לפי ההוראות במאמר קבלת פרטי כניסה לגישה לקטגוריה. הערך בסוד מקודד ב-base64. צריך לפענח אותו לפני שמשתמשים בו.

    • ‫SECRET_KEY: המפתח הסודי שנרכש מהסוד שמכיל את פרטי הכניסה שלכם. כדי לקבל את המפתח הסודי, פועלים לפי ההוראות במאמר קבלת פרטי כניסה לגישה לקטגוריה. הערך בסוד מקודד ב-base64. צריך לפענח אותו לפני שמשתמשים בו.

    מאגר האובייקטים של GDC תואם ל-S3, אבל הוא לא AWS. שאר ההגדרות קובעות את הקצה העורפי לאחסון ב-S3 שאינו של AWS:

    • ‫use_path_style: משתמש בכתובת קטגוריה בסגנון נתיב למאגר אובייקטים ב-GDC.

    • ‫skip_credentials_validation ו-skip_requesting_account_id: מונעים מ-Terraform לשלוח קריאות ל-AWS STS ול-AWS IAM. ‫GDC לא מספק את השירותים האלה.

    • ‫skip_metadata_api_check: מונע מ-Terraform לשלוח שאילתות לשירות המטא-נתונים של AWS EC2.

    • ‫skip_region_validation: מאפשר להשתמש בשם האזור כ-region.

    • ‫skip_s3_checksum: מונע מ-Terraform לבקש סיכום ביקורת (checksum) של SHA-256 כשהוא מעלה את קובץ תמונת המצב.

  2. מאתחלים את העריכות החדשות של קובץ תמונת המצב בקטגוריית האחסון שציינתם בשלב הקודם:

    terraform init
    

הגדרת ההרשאות

בנוסף להרשאות שנדרשות כדי לבצע משימה ספציפית באמצעות Terraform, כמו יצירת פרויקט ב-GDC, אתם צריכים גם הרשאות לצפייה בהגדרות של משאבים בהתאמה אישית בהיקף הזה. מפעילים את ההרשאות שנדרשות כדי להשתמש ב-Terraform:

  1. יוצרים את משאב התפקיד באשכול crd-viewer:

    kubectl apply --kubeconfig KUBECONFIG -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: crd-viewer
    rules:
    - apiGroups: ["apiextensions.k8s.io"]
      resources: ["customresourcedefinitions"]
      verbs: ["get", "list", "watch"]
    EOF
    

    מחליפים את KUBECONFIG בקובץ kubeconfig של שרת ה-API או האשכול שמארח את המשאב שמנהלים באמצעות Terraform. לדוגמה, רוב המשאבים פועלים בשרת Management API. לעומסי עבודה בקונטיינרים, מגדירים את קובץ kubeconfig של אשכול Kubernetes. אם אתם מנהלים משאב גלובלי, הקפידו להגדיר את שרת ה-API הגלובלי.

  2. מקשרים את תפקיד האשכול שהוגדר בשלב הקודם למשתמש:

    kubectl apply --kubeconfig KUBECONFIG -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: crd-viewer-binding
    subjects:
    - kind: User
      name: USER_EMAIL
    roleRef:
      kind: ClusterRole
      name: crd-viewer
      apiGroup: rbac.authorization.k8s.io
    EOF
    

חוזרים על השלבים האלה לכל שרת API או אשכול שרוצים להגדיר לו הרשאות Terraform.

התקנה והגדרה של ספק Terraform

כדי להקצות ולנהל משאבים ב-Kubernetes, צריך להתקין את Kubernetes Provider.

  1. בקובץ Terraform במודול, כמו הקובץ main.tf, מוסיפים את הבלוק required_providers הבא:

    terraform {
      required_providers {
        kubernetes = {
          source = "hashicorp/kubernetes"
          version = ">=2.24.0"
        }
      }
    }
    
  2. מאתחלים את ספריית העבודה ב-Terraform כדי להתקין את הספק:

    terraform init