ניתוב תעבורה מעומסי עבודה של Cloud Service Mesh למכונה וירטואלית ב-Compute Engine

בדף הזה מוסבר איך לנתב בצורה מאובטחת תעבורת רשת מעומסי עבודה של Cloud Service Mesh ב-GKE למכונה וירטואלית ב-Compute Engine שמוצגת על ידי BackendService.

שימו לב: כשמנתבים תעבורה מ-GKE למכונה וירטואלית ב-Compute Engine, לא צריך שהמכונה הווירטואלית ב-Compute Engine או BackendService יצטרפו ל-Cloud Service Mesh. עם זאת, המכונה הווירטואלית של Compute Engine וה-BackendService חייבים להיות באותו פרויקט כמו אשכול GKE של Cloud Service Mesh. המגבלה הזו קיימת בזמן שהתכונה זמינה בגרסת Public Preview. ‫mTLS לא נתמך במכונות וירטואליות של Compute Engine

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

בקטעים הבאים אנחנו מניחים:

  1. אשכול GKE עם Cloud Service Mesh מופעל.
  2. פריסת מכונה וירטואלית ב-Compute Engine שמוצגת על ידי BackendService.

לחלופין, אפשר להריץ את הפקודות הבאות כדי לפרוס מכונת VM לדוגמה ב-Compute Engine עם BackendService בחזית.

  1. פורסים מכונה וירטואלית לדוגמה ב-Compute Engine ו-BackendService:

    gcloud compute instance-templates create td-httpd-vm-template \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=http-td-server \
      --image-family=debian-11 \
      --image-project=debian-cloud \
      --metadata=startup-script="#! /bin/bash
    sudo apt-get update -y
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype <html><body><h1>'\`$(/bin/hostname)\`'</h1></body></html>' | sudo tee /var/www/html/index.html"
    
    gcloud compute instance-groups managed create http-td-mig-us-east1 \
      --zone=VM_ZONE   \
      --size=2 \
      --template=td-httpd-vm-template
    
    gcloud compute health-checks create http http-helloworld-health-check
    
    gcloud compute firewall-rules create http-vm-allow-health-checks \
      --network=default \
      --action=ALLOW \
      --direction=INGRESS \
      --source-ranges=0.0.0.0/0 \
      --target-tags=http-td-server \
      --rules=tcp:80
    
    gcloud compute backend-services create helloworld \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED \
      --protocol=HTTP \
      --health-checks http-helloworld-health-check
    
    gcloud compute backend-services add-backend helloworld \
      --instance-group=http-td-mig-us-east1 \
      --instance-group-zone=VM_ZONE  \
      --global
    

    כאשר:

    • VM_ZONE הוא התחום שבו רוצים לפרוס את המכונה הווירטואלית ב-Compute Engine.

הגדרת מכונה וירטואלית ב-Compute Engine כ-GCPBackend

בקטע הזה, חושפים את המכונה הווירטואלית ב-Compute Engine לעומסי העבודה ב-GKE באמצעות GCPBackend. ‫GCPBackend מורכב מהרכיבים הבאים:

  1. פרטים על חזית העורף (frontend) – במיוחד, שם המארח והיציאה שבהם עומסי העבודה של GKE ישתמשו כדי לקרוא ל-GCPBackend הזה.
  2. פרטים על הקצה העורפי – פרטי BackendService כמו שם השירות, המיקום ומספר הפרויקט.

ה-GCPBackend מכיל את שם המארח ופרטי היציאה, וגם את פרטי ה-BackendService (שם השירות, המיקום ומספר הפרויקט). עומסי העבודה (workloads) של GKE צריכים להשתמש בשם המארח ובפורט של GCPBackend בבקשות ה-HTTP שלהם כדי לגשת למכונת ה-VM של Compute Engine.

כדי שניתן יהיה לפענח את ה-DNS של שם המארח בתוך האשכול (כברירת מחדל אי אפשר לפענח אותו), צריך להגדיר את Google Cloud ה-DNS כך שיפענח את כל המארחים בשם מארח נבחר לכתובת IP שרירותית. הבקשה תיכשל עד שתגדירו את רשומת ה-DNS הזו. הגדרת ה-DNS של Google Cloud היא הגדרה חד-פעמית לכל דומיין מותאם אישית.

  1. יוצרים אזור מנוהל:

    gcloud dns managed-zones create prod \
        --description="zone for gcpbackend" \
        --dns-name=gcpbackend \
        --visibility=private \
        --networks=default
    

    בדוגמה הזו, שם ה-DNS הוא gcpbackend ורשת ה-VPC היא default.

  2. מגדירים את הרשומה כך שהדומיין יהיה ניתן לפתרון:

    gcloud beta dns record-sets create *.gcpbackend \
      --ttl=3600 --type=A --zone=prod \
      --rrdatas=10.0.0.1
    
  3. יוצרים את GCPBackend עם שם מארח בדומיין הקודם:

    cat <<EOF > gcp-backend.yaml
    apiVersion: networking.gke.io/v1
    kind: GCPBackend
    metadata:
      name: vm-gcp-backend
      namespace: NAMESPACE
    spec:
      type: "BackendService"
      hostname: hello-world.gcpbackend
      backendservice:
        name: helloworld
        location: global
    EOF
    kubectl apply -f gcp-backend.yaml
    

    בדוגמה הזו, GCP_BACKEND_NAME הוא vm-gcp-backend.

  4. יוצרים Pod לבדיקה כדי לוודא שיש קישוריות מ-GKE למכונה וירטואלית ב-Compute Engine:

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: testcurl
      namespace: default
    spec:
      containers:
      - name: curl
        image: curlimages/curl
        command: ["sleep", "3000"]
    EOF
    
    kubectl exec testcurl -c curl -- curl http://hello-world.gcpbackend:80
    

    מעכשיו, עומסי העבודה שלכם ב-GKE יכולים לגשת למכונת ה-VM ב-Compute Engine על ידי שליחת בקשות HTTP אל hello-world.gcpbackend:80.

כדי למנוע התנגשות עם שירותי Kubernetes קיימים או עם רשומות שירות של Istio, מומלץ להשתמש בשמות שונים ל-GCPBackend. אם יש התנגשות, סדר העדיפות (מהגבוה לנמוך) הוא Kubernetes Service,‏ istio ServiceEntry ו-GCPBackend.

שימו לב שהשירות הווירטואלי ו-GCPBackend חייבים להיות באותו מרחב שמות, והמכונה הווירטואלית ב-Compute Engine חייבת להיות באותו פרויקט כמו אשכול GKE של Cloud Service Mesh.