המדריך הזה מיועד למשתמשים ולמנהלים של Kubernetes שרוצים להשתמש ב-Istio service mesh כדי לפרוס בצורה מאובטחת שירותי Kubernetes ולהפעיל תקשורת הדדית של 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 לעומסי עבודה בלי להעניק הרשאות מורחבות לקונטיינרים.
- אתם יכולים לראות לוחות בקרה מפורטים של הרשת והשירותים שלכם בלי לבצע הגדרות נוספות, ואז להשתמש במדדים האלה כדי להגדיר יעדים ברמת השירות (SLO) והתראות למעקב אחרי תקינות האפליקציות.
- מישור הבקרה של Cloud Service Mesh המנוהל משודרג באופן אוטומטי כדי להבטיח שתקבלו את תיקוני האבטחה והתכונות העדכניים ביותר.
- מישור הנתונים המנוהל של Cloud Service Mesh משדרג אוטומטית את ה-sidecar proxies בעומסי העבודה, כך שלא צריך להפעיל מחדש את השירותים כשזמינים שדרוגי 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, אתם צריכים להתקין את gcloud CLI.
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-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, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידיםgcloud services enable container.googleapis.com
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-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, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידים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: המזהה של חשבון המשתמש . לדוגמה,myemail@example.com. -
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 כשהם מתחברים לעומסי עבודה ללא שרתי proxy מסוג sidecar.
Istio יכול להגדיר mTLS כך שיפעל בשלושה מצבים:
-
PERMISSIVE: עומסי העבודה מקבלים תנועה גם ב-mTLS וגם בטקסט רגיל. -
STRICT: עומסי העבודה מקבלים רק תנועה ב-mTLS. -
DISABLE: mTLS מושבת. כדאי להשתמש במצב הזה אם רוצים להשתמש בפתרון אבטחה משלכם.
אפשר להחיל את הגדרת ה-mTLS באופן גלובלי, לכל מרחב שמות או לכל עומס עבודה. במדריך הזה, אתם מחילים הגדרה לכל מרחב שמות באמצעות מצב STRICT mTLS.
בודקים את קובץ המניפסט הבא:
במניפסט הזה מתואר משאב מותאם אישית של אימות עמיתים ב-Istio.
מחילים את המניפסט על האשכול:
kubectl apply -f peer-authentication.yaml
מידע נוסף על mTLS ב-Istio זמין במאמר בנושא אימות TLS בו-זמני (mTLS).
איך מוודאים ש-mTLS מופעל
Kiali הוא לוח בקרה מבוסס-אינטרנט למעקב אחרי נתונים ב-Istio service mesh. הוא מספק תצוגה גרפית של סביבת המיקרו-שירותים, ומאפשר לכם לעקוב אחרי האפליקציות ולפתור בעיות בהן. אתם יכולים להשתמש ב-Kiali כדי לוודא שאימות mTLS מופעל ופועל בצורה תקינה ב-Service mesh של Istio. כדי להשתמש ב-Kiali, צריך להגדיר את Prometheus כמקור נתוני טלמטריה. במדריך הזה נעשה שימוש בשירות המנוהל של Google Cloud ל-Prometheus.
התקנת ממשק שאילתות
יוצרים חשבון שירות ב-IAM עם ההרשאה
roles/monitoring.viewerכדי לאפשר לממשק השאילתות לגשת למדדים:gcloud iam service-accounts create monitoring \ --display-name="Service account for query interface" gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:monitoring@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts add-iam-policy-binding \ monitoring@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[monitoring/default]"יוצרים מרחב שמות של Kubernetes:
kubectl create namespace monitoringמוסיפים הערה לחשבון השירות של Kubernetes שמוגדר כברירת מחדל במרחב השמות כדי להגדיר איחוד זהויות של עומסי עבודה ל-GKE:
kubectl annotate serviceaccount -n monitoring default \ iam.gke.io/gcp-service-account=monitoring@PROJECT_ID.iam.gserviceaccount.com --overwriteפורסים את עומס העבודה של ממשק השאילתות:
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פותחים את התצוגה המקדימה באינטרנט. ב-Kiali, עוברים לקטע Graph (גרף) ובתפריט הנפתח Display (תצוגה) בוחרים באפשרות Security (אבטחה). בתצוגה הזו מוצג מצב האבטחה של כל צומת בתרשים. צמתים עם תג 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.