מה זה Terraform?

יותר ויותר שירותי ענן ולא רק תומכים ב- Terraform כמו גם בעצמן תורמות רבות לפיתוחו, שירות דומה הוא CloudFormation של AWS כפי שאתם מבינים הוא תפור היטב על הפונקציונליות והשירותים של AWS, אם החברה בה אתם עובדים מושתתת על הענן של AWS לשימוש בשירות הזה יש הרבה יתרונות על גבי Terraform במובני אבטחת מידע והאינטגרציה הפנימיים בין שלל השירותים של AWS אבל…

במידה ואתם עובדים בסביבה דינמית עם כמה עננים ושירותים רבים ממגוון רחב של ספקים ברחבי הרשת אז Terraform עושה עבודה נהדרת. כפי שכבר צויין מרבית השירותים הפופולרים נתמכים וגם מתעדכנים עם כל עדכון שיוצא כמעט במיידי, חשוב לציין כי פרוייקט שתכתבו ב Terraform הוא יהיה ניתן להעתקה בין סביבות זהות, כלומר, כתבתם אוטומציה ליצירת מכונה וירטואלית ב AWS ועכשיו חשבתם לייצר אותה מכונה ב Microsoft Azure -זה לא ניתן לביצוע!

כמה נקודות ומושגים בסיסיים ב Terraform:

State File – הקובץ הכי חשוב שנוצר בעת הרצה ראשונה בתקיית הפרוייקט שלכם, קובץ זה מכיל את כל המשאבים שיצרתם בעזרת Terraform , כמו גם את הקשרים בין אותם משאבים. חשוב לזכור אם מחקתם את הקובץ או החלפתם מחשב והקובץ לא נמצא, במקרה כזה אם תריצו שוב Terraform על אותו פרוייקט , Terraform ייצר את המשאבים מחדש כי אין לו מושג מה קיים ללא קובץ ה- State File – לכן יש צורך להגדיר בפרוייקט Backends כדי לשמור את קובץ ה- State File במקום, ולמשבל בנוסף לזה לאפשר עבודה של צוותים מול אותו קובץ. תוכלו לקרוא בהרחבה כאן.

פקודות להרצה של Terraform:

terraform init – בודק שאין שגיאות בפרוייקט ומוריד Plugins שיהיו בשימוש בפרוייקט ומעדכן אותו במידה וכבר קיימים בתיקיית הפרוייקט.

terraform plan – ריצה יבשה על הפרוייקט שמוציאה פלט- מה קיים מה צריך למחוק ו/או הפעולות/שינויים הנדרשות כדי ליישם את הפרוייקט.

terraform apply – ביצוע הפרוייקט בפועל מצריך יישור קו סופי (בסוף לאחר הצגה נוספת של פלט ה- plan).

terraform destroy – פקודה אשר הורסת את המשאבים שנוצרו בפרוייקט Cleanup.

חלקים עקריים בכתיבת Terraform:

provider – אחראי להבנת אינטראקציות ה- API וחשיפת המשאבים. בדרך כלל אלו ספקי IaaS, PaaS או SaaS.

backend – קובע את אופן העלאתו של ה- State ואיך מתבצעת פעולה ה- apply. הפשטה זו מאפשרת אחסון של ה- State במקום מרוחק, ביצוע apply מרחוק וכו ‘.

main – בדרך כלל כל את הקונפיגורציה של התשתיות אותן אנחנו נרצה להקים במידה וקונפיגורציה מורכבת אפשר לרשום כל חלק ממנה כקובץ נפרד לדוגמה: vpc.tf, ec2.tf, etc…

output – ייצוא ערכים שניתן יהיה להשתמש בהם במקום אחר בקונפיגורציה.

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

  1. providers.tf
  2. backends.tf
  3. main.tf
  4. outputs.tf
  5. etc

דוגמה ל- providers.tf

provider "google" {
  credentials = "${file("credentials.json")}"
  project     = "your-project-id"
  region      = "europe-west1"
}

דוגמה ל- backends.tf

terraform {
  backend "gcs" {
    credentials = "./credentials.json"
    bucket  = "example-bucket"
    prefix  = "terraform/lab/state"
  }
}

דוגמה ל- main.tf

resource "google_container_cluster" "primary" {
  name     = "lab-cluster"
  location = "europe-west1-c"

  # We can't create a cluster with no node pool defined, but we want to only use
  # separately managed node pools. So we create the smallest possible default
  # node pool and immediately delete it.
  remove_default_node_pool = true
  initial_node_count       = 1

  master_auth {
    username = "user"
    password = "password"

    client_certificate_config {
      issue_client_certificate = true
    }
  }
}

resource "google_container_node_pool" "primary_preemptible_nodes" {
  name       = "lab-node-pool"
  location   = "europe-west1-c"
  cluster    = "${google_container_cluster.primary.name}"
  initial_node_count = 1

  management {
    auto_repair  = true
    auto_upgrade = true
  }

  autoscaling {
    min_node_count = 1
    max_node_count = 3
  }

  node_config {
    preemptible  = true
    machine_type = "e2-standard-2"

    metadata = {
      disable-legacy-endpoints = "true"
    }

    oauth_scopes = [
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring",
    ]
  }
}

דוגמה ל- outputs.tf

output "google_container_cluster_primary_endpoint" {
  value = "${google_container_cluster.primary.endpoint}"
}

output "google_container_cluster_primary_master_auth_client_certificate" {
  value = "${google_container_cluster.primary.master_auth.0.client_certificate}"
}

output "google_container_cluster_primary_master_auth_client_key" {
  value = "${google_container_cluster.primary.master_auth.0.client_key}"
}

output "google_container_cluster_primary_master_auth_cluster_ca_certificate" {
  value = "${google_container_cluster.primary.master_auth.0.cluster_ca_certificate}"
}

resource "local_file" "client_certificate" {
  content  = "${base64decode(google_container_cluster.primary.master_auth.0.client_certificate)}"
  filename = "${path.module}/.kube/client_certificate.pem"
}

resource "local_file" "client_key" {
  content  = "${base64decode(google_container_cluster.primary.master_auth.0.client_key)}"
  filename = "${path.module}/.kube/client_key.pem"
}

resource "local_file" "cluster_ca_certificate" {
  content  = "${base64decode(google_container_cluster.primary.master_auth.0.cluster_ca_certificate)}"
  filename = "${path.module}/.kube/cluster_ca_certificate.pem"
}

לסיכום

אם תשנו את הערכים בקבץ ה- providers.tf ו- beacends.tf לצרכים שלכם ותריצו apply בתיקייה בא תמקמו את כל קיבצי ה- Terraform אתם תיצרו לכם Kubernetes cluster על גבי הענן של Google כשירות שנקרא GKE.

** התצורה הזאת לצורכי לימוד בלבד.

דילוג לתוכן