הגדרת ניתוב TLS בשער
במדריך הזה מוסבר איך להגדיר שער כניסה (ingress) מבוסס-פרוקסי של Envoy עם משאבי Gateway ו-TLSRoute. אפשר גם לצרף TLSRoute משאב.
הפריסה שאתם מגדירים מוצגת בתרשים הבא. מאזן עומסי רשת אזורי חיצוני להעברת סיגנל ללא שינוי מפנה את התנועה לשרתי proxy של Envoy שפועלים כשער כניסה. פרוקסי Envoy משתמשים בניתוב TLS passthrough ומפנים תעבורה ישירות לשרתי HTTPS שפועלים במכונות וירטואליות של הבק-אנד.
לפני שמתחילים
חשוב להשלים את המשימות שמתוארות במאמר הכנה להגדרה של Envoy ועומסי עבודה בלי שרת Proxy.
הגדרת כללים לחומת אש
בקטע הזה, יוצרים כללים של חומת אש כדי לאפשר חיבורים נכנסים של בדיקות תקינות למכונות וירטואליות ברשת.
יוצרים כלל לחומת האש:
gcloud compute firewall-rules create allow-gateway-health-checks \ --network=NETWORK_NAME \ --direction=INGRESS \ --action=ALLOW \ --rules=tcp \ --source-ranges="35.191.0.0/16,209.85.152.0/22,209.85.204.0/22" \ --target-tags=gateway-proxy
הגדרת כלל של חומת אש שמאפשר תעבורת נתונים מכל מקור. עורכים את הפקודות של היציאות ושל טווחי כתובות ה-IP של המקור:
gcloud compute firewall-rules create allow-gateway-ingress-traffic \ --network=NETWORK_NAME \ --direction=INGRESS \ --action=ALLOW \ --rules=tcp:443 \ --source-ranges="0.0.0.0/0" \ --target-tags=gateway-proxy
הגדרת הרשאות לניהול זהויות והרשאות גישה
בקטע הזה מציינים את חשבון השירות עבור שרתי ה-proxy של השער ומקצים לחשבון השירות את התפקידים הנכונים ב-IAM.
יוצרים זהות של חשבון שירות לשרתי ה-proxy של השער:
gcloud iam service-accounts create gateway-proxy
מקצים את תפקידי ה-IAM הנדרשים לזהות של חשבון השירות:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/trafficdirector.client"
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/logging.logWriter"
הגדרת המשאב Gateway
יוצרים קובץ בשם
gateway443.yamlעם המפרטGatewayלתנועת HTTP:name: gateway443 scope: gateway-proxy ports: - 443 type: OPEN_MESH
יוצרים את המשאב
Gatewayבאמצעות המפרטgateway443.yaml:gcloud network-services gateways import gateway443 \ --source=gateway443.yaml \ --location=global
יצירת קבוצת מופעי מכונה מנוהלים עם שרתי proxy של Envoy
בקטע הזה יוצרים את שרתי ה-proxy של Envoy שמשויכים לשער הכניסה.
יצירת תבנית של הגדרות מכונה עבור VM שמופעל בה פרוקסי של שירות Envoy שנפרס באופן אוטומטי. ההיקף של הנציגים מוגדר ל-
gateway-proxy. אל תעבירו את יציאת ההצגה כפרמטר של הדגל--service-proxy.gcloud beta compute instance-templates create gateway-proxy \ --machine-type=n1-standard-1 \ --boot-disk-size=10GB \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=gateway-proxy \ --network-interface=network=NETWORK_NAME,no-address \ --service-account="gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \ --service-proxy=enabled,scope=gateway-proxy
יוצרים קבוצה אזורית של מופעי מכונה מנוהלים מתבנית של הגדרות מכונה:
gcloud compute instance-groups managed create gateway-proxy \ --region=REGION \ --size=1 \ --template=gateway-proxy
מגדירים את שם יציאת ההגשה לקבוצה של מופעי מכונה מנוהלים:
gcloud compute instance-groups managed set-named-ports gateway-proxy \ --named-ports=https:443 \ --region=REGION
הגדרת מאזן עומסי רשת אזורי חיצוני להעברת סיגנל ללא שינוי
בקטע הזה יוצרים את מאזן עומסי הרשת החיצוני להעברת סיגנל ללא שינוי.
יוצרים כתובת IP חיצונית סטטית אזורית:
gcloud compute addresses create xnlb-REGION \ --region=REGION
מקבלים את כתובת ה-IP ששמורה למאזן העומסים החיצוני:
gcloud compute addresses describe xnlb-REGION \ --region=REGION --format='value(address)'
כתובת ה-IP הזו משמשת כמשתנה
IP_ADDRESSבהמשך מדריך ההגדרה הזה.יוצרים בדיקת תקינות לשרתי ה-Proxy של השער:
gcloud compute health-checks create tcp xnlb-REGION \ --region=REGION \ --use-serving-port
יוצרים שירות קצה עורפי לשרתי ה-proxy של השער:
gcloud compute backend-services create xnlb-REGION \ --health-checks=xnlb-REGION \ --health-checks-region=REGION \ --load-balancing-scheme=EXTERNAL \ --protocol=TCP \ --region=REGION \ --port-name=https
מוסיפים את קבוצת מופעי המכונה המנוהלים כקצה עורפי:
gcloud compute backend-services add-backend xnlb-REGION \ --instance-group=gateway-proxy \ --instance-group-region=REGION \ --region=REGION
יוצרים כלל העברה לניתוב תנועה לשרתי ה-Proxy של השער:
gcloud compute forwarding-rules create xnlb-REGION \ --region=REGION \ --load-balancing-scheme=EXTERNAL \ --address=IP_ADDRESS \ --ip-protocol=TCP \ --ports=443 \ --backend-service=xnlb-REGION \ --backend-service-region=REGION
הגדרת קבוצת מופעי מכונה מנוהלים שמריצים שירות HTTPS
לצורך הדגמה, יוצרים שירות לקצה העורפי עם מכונות וירטואליות שמתבצעת בהן התאמה אוטומטית לעומס בקבוצת מופעי מכונה מנוהלים. המכונות הווירטואליות מחזירות פרטים על בקשות אינטרנט באמצעות פרוטוקול HTTPS ביציאה 443.
יוצרים תבנית של הגדרות מכונה עם שירות HTTPS שנחשף ביציאה
443:gcloud compute instance-templates create td-https-vm-template \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=https-td-server \ --image-family=debian-10 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash sudo rm -rf /var/lib/apt/lists/* sudo apt-get -y clean sudo apt-get -y update sudo apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" sudo apt-get -y update sudo apt-get -y install docker-ce sudo which docker echo "{ \"registry-mirrors\": [\"https://mirror.gcr.io\"] }" | sudo tee -a /etc/docker/daemon.json sudo service docker restart sudo docker run -e HTTPS_PORT=9999 -p 443:9999 --rm -dt mendhak/http-https-echo:22'יוצרים קבוצה של מופעי מכונה מנוהלים על סמך תבנית של הגדרות מכונה:
gcloud compute instance-groups managed create https-td-mig-us-REGION \ --zone=ZONE \ --size=2 \ --template=td-https-vm-template
מגדירים את שם יציאת ההגשה לקבוצה של מופעי מכונה מנוהלים:
gcloud compute instance-groups managed set-named-ports https-td-mig-us-REGION \ --named-ports=https:443 \ --zone=ZONE
יוצרים בדיקת תקינות:
gcloud compute health-checks create https https-helloworld-health-check \ --port=443
יוצרים כלל של חומת אש שמאפשר חיבורים נכנסים של בדיקות תקינות למופעים ברשת:
gcloud compute firewall-rules create https-vm-allow-health-checks \ --network NETWORK_NAME --action allow --direction INGRESS \ --source-ranges 35.191.0.0/16,130.211.0.0/22 \ --target-tags https-td-server \ --rules tcp:443
יוצרים שירות לקצה עורפי גלובלי עם סכמת איזון עומסים של
INTERNAL_SELF_MANAGEDומוסיפים את בדיקת תקינות:gcloud compute backend-services create https-helloworld-service \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --port-name=https \ --health-checks https-helloworld-health-check
מוסיפים את קבוצת מופעי המכונה המנוהלים כקצה עורפי לשירות לקצה העורפי:
gcloud compute backend-services add-backend https-helloworld-service \ --instance-group=https-td-mig-us-REGION \ --instance-group-zone=ZONE \ --global
הגדרת ניתוב באמצעות משאב TLSRoute
בסעיפים הקודמים הגדרתם משאב Gateway ושרת HTTPS.
בשלב הבא, מחברים אותם באמצעות משאב TLSRoute שמשייך שם מארח של SNI לשירות קצה עורפי.
יוצרים את המפרט
TLSRouteבקובץ בשםtls_route.yaml:name: helloworld-tls-route gateways: - projects/PROJECT_NUMBER/locations/global/gateways/gateway443 rules: - matches: - sniHost: - example.com alpn: - h2 action: destinations: - serviceName: projects/PROJECT_NUMBER/locations/global/backendServices/https-helloworld-serviceבהוראה הקודמת,
TLSRouteתואם ל-example.comכ-SNI ול-h2כ-ALPN. אם ההתאמות ישתנו באופן הבא,TLSRouteיתאים ל-SNI או ל-ALPN:- matches: - sniHost: - example.com - alpn: - h2משתמשים במפרט
tls_route.yamlכדי ליצור את משאבTLSRoute:gcloud network-services tls-routes import helloworld-tls-route \ --source=tls_route.yaml \ --location=global
מגדירים את Cloud Service Mesh לאיזון עומסים של התנועה בשירותים שצוינו במשאב TLSRoute בשרתי הקצה העורפיים בקבוצת המופעים המנוהלת.
אימות הפריסה
בקטע הזה מאמתים שאפשר לגשת לשירות מלקוח חיצוני דרך מאזן העומסים החיצוני של הרשת להעברת סיגנל ללא שינוי ודרך משאב Cloud Service Mesh Gateway.
מריצים את הפקודה
curlהבאה כדי לוודא שיש קישוריות HTTP לשירותי הבדיקה שיצרתם:curl https://example.com --resolve example.com:443:IP_ADDRESS -k
הפקודה מחזירה תגובה מאחת המכונות הווירטואליות בקבוצת מופעי מכונה מנוהלים. הפלט שיתקבל:
"path": "/",
"headers": {
"host": "example.com",
"user-agent": "curl/7.81.0",
"accept": "*/*"
},
"method": "GET",
"body": "",
"fresh": false,
"hostname": "example.com",
"ip": "::ffff:10.142.0.2",
"ips": [],
"protocol": "https",
"query": {},
"subdomains": [],
"xhr": false,
"os": {
"hostname": "0cd3aec9b351"
},
"connection": {
"servername": "example.com"
}
}
אימות באמצעות אימות שלילי
אפשר גם להריץ אימות שלילי. אם מריצים את הפקודות שבקטע הזה, הבקשה נפסלת כי היא לא עומדת בקריטריונים של TLSRoute.
בפקודה הבאה, ה-SNI לא תואם ל-example.com, ולכן הפקודה Gateway דוחה את החיבור:
curl https://invalid-server.com --resolve invalid-server.com:443:IP_ADDRESS -k
בפקודה הבאה, פרוטוקול ALPN לא תואם ל-h2 (פרוטוקול HTTP2), ולכן Gateway דוחה את החיבור:
curl https://example.com --resolve example.com:443:IP_ADDRESS -k --http1.1
בפקודה הבאה, הלקוח יוצר חיבור של טקסט רגיל (לא מוצפן), ולכן Gateway דוחה את החיבור:
curl example.com:443 --resolve example.com:443:IP_ADDRESS -k
כל הפקודות הקודמות מחזירות את השגיאה הבאה:
curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection.
המאמרים הבאים
- במאמר רשימת משאבי
Routeמוסבר איך מציגים רשימה של משאבי ניתוב שמשויכים למשאבMeshאוGateway.