המדריך הזה מיועד למשתמשים ולאדמינים ב-Kubernetes שמעוניינים להשתמש בService mesh של Istio כדי לפרוס באופן מאובטח את שירותי Kubernetes ולאפשר תקשורת באמצעות Mutual TLS (mTLS).
Istio ו-Cloud Service Mesh
Istio הוא לא מוצר נתמך של Google. מומלץ להריץ במקום זאת את Cloud Service Mesh מנוהל. מידע נוסף זמין במאמר הקצאת מישור בקרה מנוהל של Cloud Service Mesh ב-GKE.
היתרונות של Cloud Service Mesh:
- אפשר להקצות Cloud Service Mesh מנוהל באמצעות Fleet API בלי כלים בצד הלקוח כמו
istioctl. - Cloud Service Mesh מחדיר אוטומטית פרוקסי מסוג sidecar לעומסי עבודה בלי להעניק הרשאות מורחבות לקונטיינרים.
- אתם יכולים לראות מרכזי בקרה עשירים של רשת ה-mesh והשירותים שלכם בלי הגדרות נוספות, ואז להשתמש במדדים האלה כדי להגדיר יעדים ברמת השירות (SLO) והתראות למעקב אחרי תקינות האפליקציות.
- מישור הבקרה של Cloud Service Mesh המנוהל משודרג באופן אוטומטי כדי להבטיח שתקבלו את תיקוני האבטחה והתכונות העדכניים ביותר.
- מישור הנתונים המנוהל של Cloud Service Mesh משדרג אוטומטית את ה-proxies של sidecar בעומסי העבודה, כך שלא צריך להפעיל מחדש את השירותים כשזמינים שדרוגים של proxy ותיקוני אבטחה.
- Cloud Service Mesh הוא מוצר נתמך, ואפשר להגדיר אותו באמצעות ממשקי API רגילים של Istio בקוד פתוח. מידע נוסף זמין במאמר בנושא תכונות נתמכות.
מטרות
המדריך הזה כולל את השלבים הבאים:
- יוצרים אשכול GKE Autopilot.
- מתקינים את Istio באמצעות כלי שורת הפקודה
istioctl. - פורסים אפליקציה לדוגמה כדי לבדוק אימות TLS בו-זמני (mTLS).
- מגדירים את Istio כך שישתמש באימות mTLS לתקשורת בין שירותים באמצעות
PeerAuthenticationמשאב בהתאמה אישית. - מאמתים את אימות mTLS באמצעות לוח הבקרה של Kiali.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
בעזרת מחשבון העלויות אתם יכולים להעריך את העלויות בהתאם לשימוש הצפוי.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
ב-Cloud Shell מותקנות מראש התוכנות שנדרשות למדריך הזה, כולל kubectl, ה-CLI של gcloud ו-Terraform.
אם אתם לא משתמשים ב-Cloud Shell, אתם צריכים להתקין את ה-CLI של gcloud.
-
התקינו את ה-CLI של Google Cloud.
-
הגדירו שה-CLI של gcloud ישתמש בזהות המאוחדת שלכם.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Google Cloud פרויקט.
התפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים פרויקט ב- Google Cloud :
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם ב- Google Cloud :
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
מפעילים את GKE API, אם הוא עדיין לא מופעל:
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידיםgcloud services enable container.googleapis.com
-
מעניקים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM:
roles/container.clusterAdmingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט. -
USER_IDENTIFIER: המזהה של חשבון המשתמש . דוגמאות מופיעות במאמר ייצוג המשתמשים במאגרי כוח עבודה בכללי מדיניות IAM. -
ROLE: תפקיד ה-IAM שאתם מקצים לחשבון המשתמש.
-
הכנת הסביבה
כדי להגדיר את הסביבה:
הגדרת משתני סביבה:
export PROJECT_ID=PROJECT_ID gcloud config set project $PROJECT_ID gcloud config set compute/region us-central1מחליפים את
PROJECT_IDבמזהה הפרויקט. Google Cloudמשכפלים את המאגר ב-GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.gitעוברים לספריית העבודה:
cd kubernetes-engine-samples/service-mesh/istio-tutorial
יצירת אשכול GKE
מפעילים את היכולות של Linux שנדרשות ל-Istio: NET_RAW ו-NET_ADMIN.
ב-GKE Autopilot, NET_ADMIN לא מופעל כברירת מחדל, אבל אפשר להפעיל אותו NET_ADMIN באמצעות הפקודה --workload-policies=allow-net-admin בגרסאות GKE 1.27 ואילך:
gcloud container clusters create-auto istio-cluster \
--location="us-central1" \
--workload-policies="allow-net-admin"
מידע נוסף על אבטחת GKE Autopilot זמין במאמר בנושא הגדרות אבטחה מובנות.
התקנת Istio
אפשר להתקין את Istio באשכול GKE באמצעות Istioctl.
במדריך הזה מתקינים את Istio עם פרופיל ההגדרות שמוגדר כברירת מחדל ומומלץ לפריסות בסביבת הייצור.
מתקינים את Istio:
כדי להתקין את הגרסה העדכנית של Istio:
curl -L https://istio.io/downloadIstio | sh -כדי להתקין גרסה ספציפית של Istio:
export ISTIO_VERSION=VERSION_NUMBER curl -L https://istio.io/downloadIstio | TARGET_ARCH=$(uname -m) sh -מחליפים את VERSION_NUMBER בגרסה של Istio שרוצים להתקין. מידע על גרסאות של Istio זמין בהודעות על גרסאות.
מוסיפים את כלי שורת הפקודה
istioctlלנתיב:cd istio-* export PATH=$PWD/bin:$PATHמתקינים את Istio באשכול:
istioctl install --set profile="default" -yהשלב הזה עשוי להימשך כמה דקות.
ממתינים עד שה-Pods של Istio יהיו מוכנים:
watch kubectl get pods -n istio-systemהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE istio-ingressgateway-5c47bff876-wjm96 1/1 Running 0 2m54s istiod-5fc7cb65cd-k8cp4 1/1 Running 0 2m57sכשה-Pods של Istio הם
Running, חוזרים לשורת הפקודה על ידי לחיצה עלCtrl+C.
פריסת האפליקציה לדוגמה
בקטע הזה תשתמשו באפליקציה לדוגמה Bank of Anthos כדי ליצור Service mesh עם אימות mTLS.
מוסיפים תווית של מרחב שמות שמורה ל-Istio להפעיל הזרקה אוטומטית של פרוקסי Envoy sidecar:
kubectl label namespace default istio-injection=enabledפורסים את האפליקציה לדוגמה:
cd .. git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git kubectl apply -f bank-of-anthos/extras/jwt/jwt-secret.yaml kubectl apply -f bank-of-anthos/kubernetes-manifests/ממתינים עד שהאפליקציה תהיה מוכנה:
watch kubectl get podsהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE accounts-db-0 2/2 Running 0 2m16s balancereader-5c695f78f5-x4wlz 2/2 Running 0 3m8s contacts-557fc79c5-5d7fg 2/2 Running 0 3m7s frontend-7dd589c5d7-b4cgq 2/2 Running 0 3m7s ledger-db-0 2/2 Running 0 3m6s ledgerwriter-6497f5cf9b-25c6x 2/2 Running 0 3m5s loadgenerator-57f6896fd6-lx5df 2/2 Running 0 3m5s transactionhistory-6c498965f-tl2sk 2/2 Running 0 3m4s userservice-95f44b65b-mlk2p 2/2 Running 0 3m4sכשה-Pods במצב
Running, חוזרים לשורת הפקודה בלחיצה עלCtrl+C.בודקים את קובץ המניפסט הבא:
המניפסט הזה מתאר את המשאבים Gateway ו-VirtualService של Istio שחושפים את האפליקציה ומשתמשים ב-Istio כבקר Ingress.
מחילים את המניפסט על האשכול:
kubectl apply -f bank-of-anthos/extras/istio/frontend-ingress.yaml
הגדרת mTLS
אימות TLS בו-זמני (mTLS) מופעל כברירת מחדל ב-Istio. כלומר, Istio עוקב אחרי עומסי עבודה בשרת שהועברו לשרתי proxy של Istio, ומגדיר אוטומטית שרתי proxy של לקוחות כדי ליצור חיבורי mTLS עם עומסי העבודה האלה. בנוסף, Istio מגדיר שרתי proxy של לקוחות כך שלא ישתמשו ב-mTLS כשהם מתחברים לעומסי עבודה בלי קובצי עזר חיצוניים.
אפשר להגדיר את Istio כך שיפעל בשלושה מצבים של mTLS:
-
PERMISSIVE: עומסי העבודה מקבלים תנועה גם ב-mTLS וגם בטקסט רגיל. -
STRICT: עומסי העבודה מקבלים רק תנועה ב-mTLS. -
DISABLE: mTLS מושבת. כדאי להשתמש במצב הזה אם אתם רוצים להשתמש בפתרון אבטחה משלכם.
אפשר להחיל את הגדרת ה-mTLS באופן גלובלי, לכל מרחב שמות או לכל עומס עבודה. במדריך הזה, אתם מחילים הגדרה לכל מרחב שמות באמצעות מצב mTLS STRICT.
בודקים את המניפסט הבא:
במניפסט הזה מתואר משאב מותאם אישית של אימות עמיתים ב-Istio.
מחילים את המניפסט על האשכול:
kubectl apply -f peer-authentication.yaml
מידע נוסף על mTLS ב-Istio זמין במאמר בנושא אימות TLS בו-זמני (mTLS).
אימות ההפעלה של mTLS
Kiali הוא לוח בקרה מבוסס-אינטרנט לצפייה בנתונים (observability) של Istio service mesh. הוא מספק תצוגה גרפית של סביבת המיקרו-שירותים, ומאפשר לכם לעקוב אחרי האפליקציות ולפתור בעיות בהן. אפשר להשתמש ב-Kiali כדי לוודא שאימות mTLS מופעל ופועל בצורה תקינה ב-Service mesh של Istio. כדי להשתמש ב-Kiali, צריך להגדיר את Prometheus כמקור נתוני טלמטריה. במדריך הזה משתמשים בשירות המנוהל של Google Cloud ל-Prometheus.
התקנה של ממשק שאילתות
יוצרים מרחב שמות ב-Kubernetes לממשק של שאילתות המעקב:
kubectl create namespace monitoringמקצים את התפקיד
roles/monitoring.viewerל-Kubernetes ServiceAccountdefaultבמרחב השמותmonitoring, כדי שממשק השאילתות יוכל לקרוא מדדים באמצעות איחוד זהויות של עומסי עבודה ל-GKE:PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)") gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID./subject/ns/monitoring/sa/default" \ --role=roles/monitoring.viewer \ --condition=Noneפורסים את עומס העבודה של ממשק השאילתות:
kubectl -n monitoring apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yamlבודקים את קובץ המניפסט הבא:
קובץ המניפסט הזה מתאר משאב
PodMonitoringשאוסף מדדים של Istio ושל Envoy Proxy.מחילים את המניפסט על האשכול:
kubectl apply -f pod-monitorings.yamlכדי לקבל קישור לאפליקציית הדוגמה:
INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo "http://$INGRESS_HOST"פותחים את הקישור כדי לראות את האפליקציה לדוגמה. נכנסים באמצעות שם המשתמש והסיסמה שמוגדרים כברירת מחדל כדי ליצור תעבורה בין המיקרו-שירותים.
התקנת Kiali
מומלץ להתקין את Kiali באמצעות Kiali Operator.
מתקינים את Kiali Operator:
helm repo add kiali https://kiali.org/helm-charts helm repo update helm install \ --namespace kiali-operator \ --create-namespace \ kiali-operator \ kiali/kiali-operatorבודקים את קובץ המניפסט הבא:
המניפסט הזה מתאר משאב מותאם אישית של Operator שמגדיר את שרת Kiali.
מחילים את המניפסט על האשכול:
kubectl apply -f kiali.yamlמחכים עד ששרת Kiali יהיה מוכן:
watch kubectl get pods -n istio-systemהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE istio-ingressgateway-6845466857-92zp8 1/1 Running 0 9m11s istiod-6b47d84cf-4cqlt 1/1 Running 0 12m kiali-5f6b7c8d9-abcde 1/1 Running 0 1mכשהסטטוס של ה-Pods הוא
Running, חוזרים לשורת הפקודה על ידי לחיצה עלCtrl+C.מגדירים העברת ליציאה אחרת בשירות של שרת Kiali כדי לגשת ללוח הבקרה:
kubectl -n istio-system port-forward svc/kiali 8080:20001פותחים את Web Preview. ב-Kiali, עוברים לקטע Graph ובוחרים באפשרות Security בתפריט הנפתח Display. בתצוגה הזו מוצג מצב האבטחה של כל צומת בתרשים. צמתים עם התג mTLS enabled מציינים ש-mTLS מופעל בשירות הזה, וצמתים בלי התג מציינים ש-mTLS לא מופעל.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת הפרויקט
כדי למחוק Google Cloud פרויקט:
gcloud projects delete PROJECT_ID
מחיקת המשאבים הבודדים
אם השתמשתם בפרויקט קיים ואתם לא רוצים למחוק אותו, אתם יכולים למחוק את המשאבים בנפרד.
מחיקת Kiali:
kubectl -n istio-system delete kiali kiali helm uninstall --namespace kiali-operator kiali-operatorמוחקים את משאבי המעקב:
kubectl -n monitoring delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yamlמוחקים את האפליקציה לדוגמה:
kubectl delete -f bank-of-anthos/extras/istio/frontend-ingress.yaml kubectl delete -f bank-of-anthos/kubernetes-manifestsהסרת Istio:
istioctl uninstall --purge -yמוחקים את אשכול ה-GKE:
gcloud container clusters delete --location us-central1 istio-cluster --quiet
המאמרים הבאים
- כדאי להעמיק את הקריאה ולהכיר דוגמאות לארכיטקטורות, תרשימים ושיטות מומלצות בנושאי Google Cloud. כל אלה זמינים במרכז הארכיטקטורה של Cloud.