Managed Service for Apache Spark Component Gateway

חלק מרכיבי הקוד הפתוח שכלולים כברירת מחדל בשירות המנוהל של Google לאשכולות Apache Spark, כמו Apache Hadoop ו-Apache Spark, מספקים ממשקי אינטרנט. אפשר להשתמש בממשקים האלה כדי לנהל ולנטר משאבים ומתקנים של אשכול, כמו מנהל המשאבים של YARN, מערכת הקבצים המבוזרת של Hadoop‏ (HDFS),‏ MapReduce ו-Spark. ‫Component Gateway מספק גישה מאובטחת לנקודות קצה באינטרנט עבור ברירת המחדל של Managed Service for Apache Spark ורכיבים אופציונליים.

בקטעים הבאים מוסבר איך להפעיל גישה לממשקי אינטרנט של רכיבים בלי להסתמך על מנהרות SSH או על שינוי כללי חומת האש כדי לאפשר תעבורה נכנסת. אפשר לעשות את זה באשכולות שנוצרו באמצעות גרסאות נתמכות של תמונות Managed Service for Apache Spark.

לתשומת ליבכם

  • למשתמשים צריכה להיות הרשאת dataproc.clusters.use לניהול זהויות והרשאות גישה (IAM) כדי לגשת לממשקי אינטרנט של רכיבים מופעלים. מידע נוסף זמין במאמר בנושא תפקידים ב-Managed Service for Apache Spark.
  • אפשר להשתמש ב-Component Gateway כדי לגשת לממשקי REST API, כמו Apache Hadoop YARN ו-Apache Livy, וגם לשרתי היסטוריה.
  • כשהרכיב Component Gateway מופעל, השירות Managed Service for Apache Spark מוסיף את השירותים הבאים לצומת הראשי הראשון באשכול:
    • Apache Knox. אישור ה-SSL של Knox Gateway שמוגדר כברירת מחדל תקף למשך 13 חודשים מתאריך היצירה של האשכול. אם התוקף שלו יפוג, כל כתובות ה-URL של ממשק האינטרנט של Component Gateway יהפכו ללא פעילות. כדי לקבל אישור חדש, אפשר לעיין במאמר בנושא יצירה מחדש של אישור SSL של Component Gateway.
    • Inverting Proxy
  • שער הרכיבים לא מאפשר גישה ישירה לממשקי node:port, אבל הוא מעביר באופן אוטומטי קבוצת משנה ספציפית של שירותים. אם רוצים לגשת לשירותים בצמתים (node:port), צריך להשתמש בשרת proxy של SSH SOCKS.

יצירת אשכול באמצעות Component Gateway

מסוףGoogle Cloud

ממשקי המשתמש של רכיבי Managed Service for Apache Spark (דרך Component Gateway) מופעלים כברירת מחדל כשיוצרים אשכול באמצעות מסוף Google Cloud . כדי להשבית את ההגדרה הזו, מבטלים את הסימון של התיבה הפעלת רכיבים בממשק המשתמש:

  1. פותחים את הדף Create cluster.
  2. לוחצים על הגדרה נוספת כדי להרחיב את הקטע.
  3. עורכים את הרכיבים האופציונליים.
  4. בחלונית שנפתחת, מסמנים או מבטלים את הסימון בתיבת הסימון הפעלת רכיבים בממשק המשתמש.
  5. לוחצים על Save.

פקודה ב-CLI של gcloud

מריצים את הפקודה gcloud dataproc clusters create של ה-CLI של gcloud באופן מקומי בחלון טרמינל או ב-Cloud Shell.

gcloud dataproc clusters create cluster-name \
    --enable-component-gateway \
    --region=region \
    other args ...

‫API בארכיטקטורת REST

מגדירים את המאפיין EndpointConfig.enableHttpPortAccess לערך true כחלק מבקשת clusters.create.

שימוש בכתובות URL של שער רכיבים כדי לגשת לממשקי אינטרנט

כש-Component Gateway מופעל באשכול, אפשר להתחבר לממשקי האינטרנט של הרכיבים שפועלים בצומת הראשי הראשון של האשכול על ידי לחיצה על הקישורים שמופיעים במסוף Google Cloud . בנוסף, Component Gateway מגדיר את endpointConfig.httpPorts עם מיפוי של שמות יציאות לכתובות URL. כאפשרות חלופית לשימוש במסוף, אפשר להשתמש בכלי gcloud של שורת הפקודה או ב-Dataproc API בארכיטקטורת REST כדי להציג את פרטי המיפוי האלה, ואז להעתיק את כתובת ה-URL ולהדביק אותה בדפדפן כדי להתחבר לממשק המשתמש של הרכיב.

המסוף

עוברים לטופס Managed Service for Apache Spark Clusters במסוף Google Cloud , ואז בוחרים את האשכול כדי לפתוח את הטופס Cluster details. לוחצים על הכרטיסייה Web Interfaces (ממשקי אינטרנט) כדי להציג רשימה של קישורים ל-Component Gateway לממשקי האינטרנט של רכיבי ברירת המחדל והרכיבים האופציונליים שהותקנו באשכול. לוחצים על קישור כדי לפתוח את ממשק האינטרנט שפועל בצומת הראשי של האשכול בדפדפן המקומי.

פקודה ב-CLI של gcloud

מריצים את הפקודה של ה-CLI של gcloud‏ gcloud dataproc clusters describe באופן מקומי בחלון טרמינל או ב-Cloud Shell.

gcloud dataproc clusters describe cluster-name \
    --region=region

פלט לדוגמה

...
config:
  endpointConfig:
    enableHttpPortAccess: true
    httpPorts:
      HDFS NameNode:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/hdfs/ MapReduce Job History:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/jobhistory/ Spark HistoryServer:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/sparkhistory/ YARN ResourceManager:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/yarn/ YARN Application Timeline:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/apphistory/ ...

‫API בארכיטקטורת REST

מפעילים את clusters.get כדי לקבל את המיפוי endpointConfig.httpPorts של שמות יציאות לכתובות URL.

שימוש ב-Component Gateway עם VPC-SC

שער הרכיבים תומך ב-VPC Service Controls. לצורך אכיפה של גבולות גזרה לשירות, בקשות לממשקים דרך Component Gateway נחשבות כחלק מ-Dataproc API surface, וכל מדיניות גישה ששולטת בהרשאות ל-dataproc.googleapis.com תשלוט גם בגישה לממשקי המשתמש של Component Gateway.

Component Gateway תומך גם בהגדרות של VPC-SC שמסתמכות על קישוריות פרטית ל-Google עבור אשכולות של Managed Service for Apache Spark ללא כתובות IP חיצוניות. אבל צריך להגדיר את הרשת באופן ידני כדי לאפשר גישה מהמכונה הווירטואלית הראשית של Managed Service for Apache Spark אל *.dataproc.cloud.google.com דרך טווח כתובות ה-IP הווירטואליות המוגבל של Google‏ 199.36.153.4/30. כדי לעשות את זה:

  1. פועלים לפי ההוראות להגדרת קישוריות פרטית ל-Google לכל ממשקי Google API.
  2. אפשר להגדיר DNS באמצעות Cloud DNS או להגדיר DNS באופן מקומי בצומת הראשי של Managed Service for Apache Spark כדי לאפשר גישה אל *.dataproc.cloud.google.com.

הגדרת DNS באמצעות Cloud DNS

יוצרים תחום DNS של Cloud DNS שממפה את התנועה שמיועדת ל-*.dataproc.cloud.google.com לטווח כתובות ה-IP הווירטואליות המוגבל של Google API.

  1. יוצרים אזור פרטי מנוהל לרשת ה-VPC.

    gcloud dns managed-zones create ZONE_NAME \
     --visibility=private \
     --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME \
     --description=DESCRIPTION \
     --dns-name=dataproc.cloud.google.com \
     --project=PROJECT_ID
    
    • ZONE_NAME הוא שם האזור שאתם יוצרים. לדוגמה, vpc. השם של האזור הזה ישמש בכל אחד מהשלבים הבאים.

    • PROJECT_ID הוא מזהה הפרויקט שמארח את רשת ה-VPC.

    • NETWORK_NAME הוא השם של רשת ה-VPC.

    • DESCRIPTION הוא תיאור אופציונלי של האזור המנוהל, שכתוב בצורה שקריאה לאנשים.

  2. מתחילים עסקה.

    gcloud dns record-sets transaction start --zone=ZONE_NAME
    
    • ZONE_NAME הוא שם האזור.
  3. מוסיפים רשומות DNS.

    gcloud dns record-sets transaction add --name=*.dataproc.cloud.google.com. \
        --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
        --zone=ZONE_NAME \
        --ttl=300
    
    • ZONE_NAME הוא שם האזור.
    gcloud dns record-sets transaction add --name=dataproc.cloud.google.com. \
        --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
        --zone=ZONE_NAME \
        --ttl=300
    
    • ZONE_NAME הוא שם האזור.
  4. מבצעים את העסקה.

    gcloud dns record-sets transaction execute --zone=ZONE_NAME --project=PROJECT_ID
    
    • ZONE_NAME הוא שם האזור.

    • PROJECT_ID הוא מזהה הפרויקט שמארח את רשת ה-VPC.

הגדרת DNS באופן מקומי בצומת הראשי של Managed Service for Apache Spark באמצעות פעולת אתחול

אפשר להגדיר DNS באופן מקומי בצמתי הראשיים של Managed Service for Apache Spark כדי לאפשר קישוריות פרטית אל dataproc.cloud.google.com. ההליך הזה מיועד לבדיקות ולפיתוח לטווח קצר. לא מומלץ להשתמש בו בעומסי עבודה של ייצור.

  1. מעבירים את פעולת האתחול ל-Cloud Storage.

    cat <<EOF >component-gateway-vpc-sc-dns-init-action.sh
    #!/bin/bash
    readonly ROLE="$(/usr/share/google/get_metadata_value attributes/dataproc-role)"
    
    if [[ "${ROLE}" == 'Master' ]]; then
      readonly PROXY_ENDPOINT=$(grep "^dataproc.proxy.agent.endpoint=" \
        "/etc/google-managed-spark/dataproc.properties" | \
        tail -n 1 | cut -d '=' -f 2- | sed -r 's/\\([#!=:])/\1/g')
    
      readonly HOSTNAME=$(echo ${PROXY_ENDPOINT} | \
        sed -n -E 's;^https://([^/?#]*).*;\1;p')
    
      echo "199.36.153.4 ${HOSTNAME}  # Component Gateway VPC-SC" >> "/etc/hosts"
    fi
    EOF
    
    gcloud storage cp component-gateway-vpc-sc-dns-init-action.sh gs://BUCKET/
    
    • BUCKET היא קטגוריה של Cloud Storage שאפשר לגשת אליה מאשכול Managed Service for Apache Spark.
  2. יוצרים אשכול Managed Service for Apache Spark עם פעולת האתחול בשלבים ועם Component Gateway מופעל.

    gcloud dataproc clusters create cluster-name \
        --region=region \
        --initialization-actions=gs://BUCKET/component-gateway-vpc-sc-dns-init-action.sh \
        --enable-component-gateway \
        other args ...
    
    • BUCKET היא קטגוריית Cloud Storage שבה השתמשתם בשלב 1.

שימוש פרוגרמטי בממשקי HTTP API דרך Component Gateway

Component Gateway הוא פרוקסי שמשולב בו Apache Knox. נקודות הקצה שנחשפות על ידי Apache Knox זמינות דרך https://component-gateway-base-url/component-path.

כדי לבצע אימות פרוגרמטי באמצעות Component Gateway, צריך להעביר את הכותרת Proxy-Authorization עם אסימון Bearer מסוג OAuth 2.0.

$ ACCESS_TOKEN="$(gcloud auth print-access-token)"
$ curl -H "Proxy-Authorization: Bearer ${ACCESS_TOKEN}" "https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/yarn/jmx"
{
  "beans" : [ {
    "name" : "Hadoop:service=ResourceManager,name=RpcActivityForPort8031",
    "modelerType" : "RpcActivityForPort8031",
    "tag.port" : "8031",
    "tag.Context" : "rpc",
    "tag.NumOpenConnectionsPerUser" : "{\"yarn\":2}",
    "tag.Hostname" : "demo-cluster-m",
    "ReceivedBytes" : 1928581096,
    "SentBytes" : 316939850,
    "RpcQueueTimeNumOps" : 7230574,
    "RpcQueueTimeAvgTime" : 0.09090909090909091,
    "RpcProcessingTimeNumOps" : 7230574,
    "RpcProcessingTimeAvgTime" : 0.045454545454545456,
...

רכיב Gateway מסיר את הכותרת Proxy-Authorization לפני העברת הבקשות אל Apache Knox.

כדי למצוא את כתובת הבסיס של Component Gateway, מריצים את הפקודה: gcloud dataproc clusters describe:

$ gcloud dataproc clusters describe <var>cluster-name</var> &#92;
    &nbsp;&nbsp;&nbsp;&nbsp;--region=<var>region</var>
...
  endpointConfig:
    enableHttpPortAccess: true
    httpPorts:
      HDFS NameNode: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/hdfs/dfshealth.html
      MapReduce Job History: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/jobhistory/
      Spark History Server: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/sparkhistory/
      Tez: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/apphistory/tez-ui/
      YARN Application Timeline: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/apphistory/
      YARN ResourceManager: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/yarn/

...

כתובת ה-URL הבסיסית היא החלקים של הסכימה והרשות בכתובות ה-URL שמופיעות בקטע httpPorts. בדוגמה הזו, הוא https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/.

יצירה מחדש של אישור SSL של Component Gateway

אישור ה-SSL של Knox Gateway שמוגדר כברירת מחדל ב-Component Gateway תקף ל:

  • ‫5 שנים מתאריך היצירה של אשכול Managed Service for Apache Spark באשכולות שנוצרו עם גרסאות התמונות 2.0.93, ‏ 2.1.41, ‏ 2.2.7 ואילך.

  • ‫13 חודשים מתאריך היצירה של אשכול Managed Service for Apache Spark באשכולות שנוצרו באמצעות גרסאות קודמות של תמונות.

אם התוקף של האישור פג, כל כתובות ה-URL של ממשק האינטרנט של Component Gateway מושבתות.

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

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

  1. משתמשים ב-SSH כדי להתחבר לצומת הראשי של אשכול Managed Service for Apache Spark עם הסיומת m-0 בשם.

  2. מחפשים את gateway.jks בנתיב /var/lib/knox/security/keystores/gateway.jks.

    keytool -list -v -keystore /var/lib/knox/security/keystores/gateway.jks
    
  3. מעבירים את הקובץ gateway.jks לתיקיית גיבוי.

    mv /var/lib/knox/security/keystores/gateway.jks /tmp/backup/gateway.jks
    
  4. יוצרים אישור חדש בחתימה עצמית על ידי הפעלה מחדש של שירות Knox.

    systemctl restart knox
    
  5. בודקים את הסטטוס של Component Gateway ו-Knox.

    systemctl status google-dataproc-component-gateway
    systemctl status knox
    

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