ניתוב תעבורה משירותי Cloud Run לעומסי עבודה של Cloud Service Mesh ב-GKE
בדף הזה מוסבר איך לנתב בצורה מאובטחת תעבורת רשת משירותי Cloud Run לעומסי עבודה של Cloud Service Mesh ב-GKE, כדי להשתמש בממשקי Istio API וליהנות מ-Envoy sidecar בניהול מלא.
לפני שמתחילים
בקטעים הבאים מניחים שיש לכם אשכול GKE עם Cloud Service Mesh מופעל.
אם לא פרסתם שירות GKE, תוכלו להשתמש בפקודה הבאה כדי לפרוס שירות לדוגמה:
cat <<EOF > /tmp/service.yaml
apiVersion: v1
kind: Service
metadata:
name: ads
spec:
ports:
- port: 9999
targetPort: 8000
selector:
run: ads
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ads
spec:
replicas: 1
selector:
matchLabels:
run: ads
template:
metadata:
labels:
run: ads
spec:
containers:
- image: docker.io/waip/simple-http:v1.0.1
name: my-http2-svc
ports:
- protocol: TCP
containerPort: 8000
securityContext:
fsGroup: 1337
EOF
kubectl apply -f /tmp/service.yaml
הגדרת דומיין מותאם אישית למארחי VirtualService
שירות וירטואלי מגדיר כללי ניתוב של תעבורת נתונים. כל תעבורת נתונים שתואמת לכלל הזה נשלחת לשירות יעד עם שם
יוצרים אזור מנוהל חדש:
gcloud dns managed-zones create ZONE_NAME \ --description="zone for service mesh routes" \ --dns-name=DNS_SUFFIX. \ --networks=default \ --visibility=privatewhere:
- ZONE_NAME הוא שם האזור (לדוגמה: prod).
- DNS_SUFFIX הוא כל מארח DNS תקין (לדוגמה: mesh.private).
יצירת קבוצת רשומות משאבים:
IP=10.0.0.1 gcloud dns record-sets create '*.'"DNS_SUFFIX." --type=A --zone="ZONE_NAME" \ --rrdatas=10.0.0.1 --ttl 3600מוודאים שכתובת ה-IP (נדרש RFC 1918) לא נמצאת בשימוש. אפשר גם לשמור כתובת IP פנימית סטטית.
ייצוא של
VirtualServiceללקוחות חיצוניים של Cloud Run:cat <<EOF > virtual-service.yaml apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: VIRTUAL_SERVICE_NAME namespace: NAMESPACE spec: hosts: - GKE_SERVICE_NAME.DNS_SUFFIX gateways: - external-mesh http: - route: - destination: host: GKE_SERVICE_NAME EOF kubectl apply -f virtual-service.yamlwhere:
- VIRTUAL_SERVICE_NAME הוא שם של
VirtualService. - NAMESPACE הוא
defaultאם אתם משתמשים בדוגמה שסיפקנו לשירות, אחרת מחליפים את NAMESPACE בשם מרחב השמות. - GKE_SERVICE_NAME הוא
adsאם משתמשים בשירות לדוגמה שצוין, אחרת מחליפים את GKE_SERVICE_NAME בשם של שירות GKE.
- VIRTUAL_SERVICE_NAME הוא שם של
אפשר להוסיף שער external-mesh כיעד ל-VirtualService קיים, אבל מומלץ ליצור VirtualService נפרד כדי לייצא שירות Kubernetes ללקוחות חיצוניים של Cloud Run. שימוש ב-VirtualService נפרד מאפשר לנהל את השירותים המיוצאים ואת ההגדרות שלהם בלי להשפיע על לקוחות GKE קיימים.
בנוסף, חלק מהשדות ב-VirtualServices לא רלוונטיים ל-VirtualServices חיצוני של רשת משנה, אבל ממשיכים לפעול כמצופה בשירותי GKE. לכן, יכול להיות שיהיה יתרון בניהול ובפתרון בעיות של VirtualServices בנפרד.
כדי שגם לקוחות GKE יקבלו את ההגדרה VirtualService, צריך להוסיף את שער mesh או mesh/default.
צריך להגדיר את רשת ה-mesh החיצונית VirtualService באותו מרחב שמות כמו שירות Kubernetes ביעד VirtualService.
הגדרת שירות Cloud Run להצטרפות ל-Service mesh
כדי להוסיף שירות Cloud Run לרשת שירותים:
קובעים את מזהה ה-mesh שתומך באשכול Cloud Service Mesh GKE:
MESH=$(kubectl get controlplanerevision --namespace istio-system -o json | jq -r '.items[0].metadata.annotations["mesh.cloud.google.com/external-mesh"]')פורסים שירות Cloud Run באמצעות מזהה הרשת, ומוודאים שמתחברים גם לרשת ה-VPC של האשכול:
gcloud alpha run deploy --mesh "$MESH" --network default \ mesh-svc --image=fortio/fortio \ --region=REGION --project=PROJECT_ID --no-allow-unauthenticatedמוודאים ששירות Cloud Run יכול לשלוח בקשה לעומס העבודה של GKE:
TEST_SERVICE_URL=$(gcloud run services describe mesh-svc --region REGION --format="value(status.url)" --project=PROJECT_ID) curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" "$TEST_SERVICE_URL/fortio/fetch/GKE_SERVICE_NAME.DNS_SUFFIX"הפלט צריך להיות תגובה תקינה מסוג HTTP 200.
פתרון בעיות
בקטע הזה מוסבר איך לפתור בעיות נפוצות ב-Cloud Service Mesh וב-Cloud Run.
יומנים של Cloud Run Sidecar
שגיאות ב-Envoy מתועדות ב-Cloud Logging.
לדוגמה, אם לחשבון השירות של Cloud Run לא ניתן התפקיד trafficdirector client בפרויקט של רשת ה-mesh, השגיאה הבאה תתועד ביומן:
StreamAggregatedResources gRPC config stream to trafficdirector.googleapis.com:443 closed: 7, Permission 'trafficdirector.networks.getConfigs' denied on resource '//trafficdirector.googleapis.com/projects/525300120045/networks/mesh:test-mesh/nodes/003fb3e0c8927482de85f052444d5e1cd4b3956e82b00f255fbea1e114e1c0208dbd6a19cc41694d2a271d1ab04b63ce7439492672de4499a92bb979853935b03d0ad0' (or it may not exist).
CSDS
אפשר לאחזר את מצב הלקוח של Traffic Director באמצעות CSDS:
gcloud alpha container fleet mesh debug proxy-status --membership=<CLUSTER_MEMBERSHIP> --location=<CLUSTER_LOCATION>
External Clients:
....