בדף הזה מוסבר איך לאבטח את התעבורה ולבצע אופטימיזציה שלה ב-Google Kubernetes Engine (GKE) Ingress. אפשר להגדיר אישורי SSL בין הלקוח לבין מאזן העומסים, ולאבטח את התנועה בין מאזן העומסים לבין אפליקציית הבק-אנד. לפני שממשיכים, חשוב לוודא שמכירים את האופן שבו GKE מאבטח את Ingress באמצעות HTTPS.
הדף הזה מיועד למומחי רשתות שתפקידם לתכנן את הרשת של הארגון, להתקין ציוד רשת, להגדיר אותו ולתת לו תמיכה. כדי לקבל מידע נוסף על תפקידים נפוצים ועל משימות לדוגמה שאנחנו מתייחסים אליהן בGoogle Cloud תוכן, אפשר לעיין במאמר תפקידים נפוצים של משתמשי GKE ומשימות.
אבטחה ואופטימיזציה של התנועה בין הלקוח למאזן העומסים
כדי לאשר בקשות HTTPS מהלקוחות, למאזן העומסים צריך להיות אישור שמוכיח את הזהות שלו ללקוחות. בנוסף, למאזן העומסים צריך להיות מפתח פרטי כדי להשלים את לחיצת היד של HTTPS. מידע נוסף על מתן אישורי SSL למאזן עומסים מסוג HTTP(S) זמין במאמר הגדרת TLS בין הלקוח למאזן העומסים.
שימוש באישורים שמנוהלים על ידי Google
כדי להגדיר אישור SSL אחד או יותר בניהול Google ולשייך אותם ל-Ingress, צריך:
- יוצרים אובייקט
ManagedCertificateאחד או יותר באותו מרחב שמות כמו Ingress. אפשר לציין עד 15 אישורים למאזן העומסים - משייכים את האובייקטים
ManagedCertificateל-Ingress על ידי הוספת ההערהnetworking.gke.io/managed-certificatesל-Ingress. ההערה הזו היא רשימה מופרדת בפסיקים שלManagedCertificateאובייקטים.
מגבלות
בקטע הזה מתוארות המגבלות של אישורים שמנוהלים על ידי Google. אם אתם צריכים אישורים בניהול עצמי או אם כבר יש לכם אישורי SSL שאתם רוצים להגדיר ב-Ingress, תוכלו לעיין במאמר הגדרת HTTPS (TLS) בין הלקוח למאזן העומסים.
אישורים שמנוהלים על ידי Google הם פחות גמישים מאשר אישורים שאתם מקבלים ומנהלים בעצמכם. אישורים שמנוהלים על ידי Google תומכים בעד 100 דומיינים ללא תו כללי לחיפוש. בניגוד לאישורים בניהול עצמי, אישורים שמנוהלים על ידי Google לא תומכים בדומיינים עם תו כללי לחיפוש.
מספר האישורים והסוג שלהם שנתמכים על ידי Ingress מוגדרים על ידי המגבלות של אישורי SSL בניהול Google.
אין תמיכה בעדכונים של אישורים שמנוהלים על ידי Google. מידע נוסף זמין במאמר עדכון ידני של אישור בניהול Google.
אם האישור מבוטל ישירות דרך רשות האישורים, Google לא מבצעת רוטציה אוטומטית של האישור. צריך למחוק את ה-ManagedCertificate וליצור חדש.
GKE Ingress לא תומך באישורים שמנוהלים על ידי Certificate Manager. כדי להשתמש באישורים שמנוהלים על ידי Certificate Manager, צריך להשתמש ב-Gateway API.
דרישות מוקדמות
אתם חייבים להיות הבעלים של שם הדומיין. שם הדומיין לא יכול להיות ארוך מ-63 תווים. אתם יכולים להשתמש בכל רשם שמות דומיין כדי לקבל שם דומיין.
אם אתם משתמשים באשכול GKE Standard, צריך להפעיל את התוסף
HttpLoadBalancing.קובץ המניפסט של Ingress חייב לכלול את ההערה
kubernetes.io/ingress.class: "gce". אין תמיכה בשדהingressClassName.צריך להחיל את המשאבים של
IngressושלManagedCertificateבאותו פרויקט ובאותו מרחב שמות.יוצרים כתובת IP חיצונית שמורה (סטטית). שמירת כתובת IP סטטית מבטיחה שהיא תישאר שלכם, גם אם תמחקו את ה-Ingress. אם לא שומרים כתובת IP, היא עלולה להשתנות, ואז צריך להגדיר מחדש את רשומות ה-DNS של הדומיין. משתמשים ב-Google Cloud CLI או במסוף Google Cloud כדי ליצור כתובת IP שמורה.
gcloud
כדי ליצור כתובת IP שמורה, מריצים את הפקודה הבאה:
gcloud compute addresses create ADDRESS_NAME --globalמחליפים את
ADDRESS_NAMEבשם של כתובת ה-IP השמורה שאתם יוצרים.כדי למצוא את כתובת ה-IP הסטטית שיצרתם, מריצים את הפקודה הבאה:
gcloud compute addresses describe ADDRESS_NAME --globalהפלט אמור להיראות כך:
address: 203.0.113.32 ...המסוף
כדי ליצור כתובת IP שמורה:
נכנסים לדף כתובות IP חיצוניות במסוף Google Cloud .
מציינים שם לכתובת ה-IP (לדוגמה,
example-ip-address).מציינים אם רוצים כתובת IPv4 או IPv6.
בוחרים באפשרות Global (גלובלי) בשדה Type (סוג).
לוחצים על Reserve. כתובת ה-IP מופיעה בעמודה External Address.
Config Connector
הערה: כדי לבצע את השלב הזה, צריך להשתמש ב-Config Connector. פועלים לפי הוראות ההתקנה כדי להתקין את Config Connector באשכול.
כדי לפרוס את המניפסט הזה, מורידים אותו למחשב בתורcompute-address.yamlומריצים את הפקודה:kubectl apply -f compute-address.yaml
הגדרת אישור שמנוהל על ידי Google
יוצרים אובייקט
ManagedCertificate. במשאב הזה מצוינים הדומיינים של אישור ה-SSL. דומיינים עם תו כללי לחיפוש אינם נתמכים.המניפסט הבא מתאר אובייקט
ManagedCertificate. שומרים את קובץ המניפסט בשםmanaged-cert.yaml.apiVersion: networking.gke.io/v1 kind: ManagedCertificate metadata: name: FIRST_CERT_NAME spec: domains: - FIRST_DOMAIN --- apiVersion: networking.gke.io/v1 kind: ManagedCertificate metadata: name: SECOND_CERT_NAME spec: domains: - SECOND_DOMAINמחליפים את מה שכתוב בשדות הבאים:
-
FIRST_CERT_NAME: השם של אובייקטManagedCertificateהראשון. -
FIRST_DOMAIN: הדומיין הראשון שבבעלותכם. -
SECOND_CERT_NAME: השם של אובייקטManagedCertificateהשני. -
SECOND_DOMAIN: הדומיין השני שבבעלותכם.
השמות של אובייקטים מסוג
ManagedCertificateשונים מהשמות של האישורים בפועל שהם יוצרים. כדי להשתמש באובייקטיםManagedCertificateב-Ingress, צריך לדעת רק את השמות שלהם.-
מחילים את המניפסט על האשכול:
kubectl apply -f managed-cert.yamlפועלים לפי ההוראות ליצירת פריסה ושירות כדי לחשוף את האפליקציה לאינטרנט.
כדי שהאובייקט
ManagedCertificateיהפוך לאובייקטActive, צריך לצרף אותו ל-Ingress באמצעות ההערהnetworking.gke.io/managed-certificates, כמו בדוגמה הבאה. לא צריך ש-ManagedCertificateכבר יהיהActiveכדי לצרף אותו ל-Ingress.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-gmc-ingress annotations: networking.gke.io/managed-certificates: "FIRST_CERT_NAME,SECOND_CERT_NAME" spec: rules: - host: FIRST_DOMAIN http: paths: - pathType: ImplementationSpecific backend: service: name: my-mc-service port: number: 60001 - host: SECOND_DOMAIN http: paths: - pathType: ImplementationSpecific backend: service: name: my-mc-service port: number: 60002 ``` Replace <code><var>FIRST_DOMAIN</var></code> and <code><var>SECOND_DOMAIN</var></code> with your domain names. This manifest describes an Ingress that lists pre-shared certificate resources in an annotation. Note: It might take several hours for Google Cloud to provision the load balancer and the managed certificates, and for the load balancer to begin using the new certificates. For more information, see [Deploy a Google-managed certificate with load balancer authorization](/certificate-manager/docs/deploy-google-managed-lb-auth#wait_until_the_certificate_has_been_activated).ממתינים לסיום הקצאת האישורים שמנוהלים על ידי Google. התהליך עשוי להימשך עד 60 דקות. אפשר לבדוק את הסטטוס של האישורים באמצעות הפקודה הבאה:
kubectl describe managedcertificate managed-certהפלט אמור להיראות כך:
Name: managed-cert Namespace: default Labels: <none> Annotations: <none> API Version: networking.gke.io/v1 Kind: ManagedCertificate (...) Spec: Domains: FQDN_1 FQDN_2 Status: CertificateStatus: Active (...)הערך בשדה
Status.CertificateStatusמציין שהוקצה אישור. אם הערך שלStatus.CertificateStatusהוא לאActive, האישור עדיין לא הוקצה.כדי לוודא ש-SSL פועל, נכנסים לדומיינים באמצעות הקידומת
https://. הדפדפן מציין שהחיבור מאובטח ואפשר לראות את פרטי האישור.
מעבר לאישורים שמנוהלים על ידי Google מאשרים שמנוהלים באופן עצמאי
כשמעבירים Ingress משימוש באישורי SSL בניהול עצמי לשימוש באישורי SSL בניהול Google, אל תמחקו אישורי SSL בניהול עצמי לפני שאישורי ה-SSL בניהול Google יהיו פעילים. אחרי שהקצאת אישורי ה-SSL שמנוהלים על ידי Google מסתיימת בהצלחה, הם מופעלים באופן אוטומטי. אחרי שאישורי ה-SSL בניהול Google יהיו פעילים, תוכלו למחוק את אישורי ה-SSL בניהול עצמי.
ההוראות האלה מיועדות למעבר מאישורי SSL בניהול עצמי לאישורי SSL בניהול Google.
- מוסיפים אישור חדש שמנוהל על ידי Google ל-Ingress, כמו שמתואר בקטע הקודם.
ממתינים עד שהסטטוס של משאב האישור שמנוהל על ידי Google יהיה
Active. בודקים את סטטוס האישור באמצעות הפקודה הבאה:kubectl describe managedcertificate managed-certכשהסטטוס הוא
Active, מעדכנים את Ingress כדי להסיר את ההפניות לאישור שמנוהל עצמאית.
הסרת אישור שמנוהל על ידי Google
כדי להסיר אישור שמנוהל על ידי Google מהאשכול, צריך למחוק את האובייקט ManagedCertificate ולהסיר את הערת ה-Ingress שמפנה אליו.
מחיקת האובייקט
ManagedCertificate:kubectl delete -f managed-cert.yamlהפלט אמור להיראות כך:
managedcertificate.networking.gke.io "managed-cert" deletedמסירים את ההערה מ-Ingress:
kubectl annotate ingress managed-cert-ingress networking.gke.io/managed-certificates-שימו לב לסימן המינוס,
-, בסוף הפקודה.משחררים את כתובת ה-IP הסטטית ששמרתם למאזן העומסים.
אפשר להשתמש ב-Google Cloud CLI, במסוף Google Cloud או ב-Config Connector כדי לבטל הקצאה של כתובת IP שמורה.
gcloud
כדי לשחרר את כתובת ה-IP השמורה, משתמשים בפקודה הבאה:
gcloud compute addresses delete ADDRESS_NAME --globalמחליפים את
ADDRESS_NAMEבשם של כתובת ה-IP.המסוף
כדי לשחרר את כתובת ה-IP השמורה, מבצעים את השלבים הבאים:
נכנסים לדף כתובות IP חיצוניות במסוף Google Cloud .
מסמנים את התיבה לצד כתובת ה-IP שרוצים לשחרר.
לוחצים על Release IP address.
Config Connector
הערה: כדי לבצע את השלב הזה, צריך להשתמש ב-Config Connector. פועלים לפי הוראות ההתקנה כדי להתקין את Config Connector באשכול.
כדי לפרוס את המניפסט הזה, מורידים אותו למחשב בתור
compute-address.yamlומריצים את הפקודה:kubectl delete -f compute-address.yaml
יצירת אישורים ומפתחות
כדי להשתמש באישור ששותף מראש או ב-Kubernetes Secrets, קודם צריך אישור אחד או יותר, עם מפתחות פרטיים תואמים. לכל אישור צריך להיות שם נפוץ (CN) ששווה לשם דומיין שבבעלותכם. אם כבר יש לכם שני קובצי אישורים עם הערכים המתאימים של השם הנפוץ, אתם יכולים לדלג אל השלב הבא.
כדי ליצור את המפתח הראשון:
openssl genrsa -out test-ingress-1.key 2048יוצרים את בקשת החתימה על האישור הראשונה:
openssl req -new -key test-ingress-1.key -out test-ingress-1.csr \ -subj "/CN=FIRST_DOMAIN"מחליפים את
FIRST_DOMAINבשם דומיין שבבעלותכם, כמוexample.com.יוצרים את האישור הראשון:
openssl x509 -req -days 365 -in test-ingress-1.csr -signkey test-ingress-1.key \ -out test-ingress-1.crtיוצרים את המפתח השני:
openssl genrsa -out test-ingress-2.key 2048יוצרים את בקשת החתימה השנייה על אישור:
openssl req -new -key test-ingress-2.key -out test-ingress-2.csr \ -subj "/CN=SECOND_DOMAIN"מחליפים את
SECOND_DOMAINבשם דומיין אחר שבבעלותכם, כמוexamplepetstore.com.יוצרים את האישור השני:
openssl x509 -req -days 365 -in test-ingress-2.csr -signkey test-ingress-2.key \ -out test-ingress-2.crt
מידע נוסף על אישורים ומפתחות זמין בסקירה הכללית על אישורי SSL.
עכשיו יש לכם שני קובצי אישורים ושני קובצי מפתחות.
במשימות הנותרות נעשה שימוש בערכי ה-placeholder הבאים כדי להתייחס לדומיינים, לאישורים ולמפתחות שלכם:
-
FIRST_CERT_FILE: הנתיב לקובץ האישור הראשון. -
FIRST_KEY_FILE: הנתיב לקובץ המפתח שמתאים לאישור הראשון. -
FIRST_DOMAIN: שם דומיין שבבעלותכם. -
FIRST_SECRET_NAME: השם של הסוד שמכיל את האישור והמפתח הראשונים. -
SECOND_CERT_FILE: הנתיב לקובץ האישור השני. -
SECOND_KEY_FILE: הנתיב לקובץ המפתח שמתאים לאישור השני. -
SECOND_DOMAIN: שם דומיין שני שבבעלותכם. -
SECOND_SECRET_NAME: השם של הסוד שמכיל את האישור והמפתח השני.
שימוש באישור ששותף מראש
אפשר להשתמש באישורי SSL בניהול עצמי שמעלים לפרויקט Google Cloud . האישורים האלה נקראים אישורים ששותפו מראש. אפשר לציין אישור אחד או יותר ששותפו מראש עבור Ingress.
כדי להשתמש בכמה אישורים ששותפו מראש, צריך לבצע את השלבים הבאים:
לכל זוג של אישור ומפתח, יוצרים משאב אישור SSL שגלוי לכולם ב- Google Cloud.
gcloud compute ssl-certificates create FIRST_CERT_NAME \ --certificate=FIRST_CERT_FILE \ --private-key=FIRST_KEY_FILE ``` ```sh gcloud compute ssl-certificates create SECOND_CERT_NAME \ --certificate=SECOND_CERT_FILE \ --private-key=SECOND_KEY_FILE ``` Replace the following:-
FIRST_CERT_NAME, SECOND_CERT_NAME: השמות של האישורים הראשון והשני. -
FIRST_CERT_FILE,SECOND_CERT_FILE: קובצי האישורים הראשונים והשניים שלכם. -
FIRST_KEY_FILE:,SECOND_KEY_FILEקובצי המפתחות הראשון והשני.
-
במניפסט של Ingress, מוסיפים את ההערה
ingress.gcp.kubernetes.io/pre-shared-cert. הערך של האנוטציה הוא רשימה של שמות האישורים שמופרדים בפסיקים. בנוסף, בקטעspec.rules, צריך לכלול את השדותhostכדי לציין את הדומיינים של השירותים.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-psc-ingress annotations: ingress.gcp.kubernetes.io/pre-shared-cert: "FIRST_CERT_NAME,SECOND_CERT_NAME" spec: rules: - host: FIRST_DOMAIN http: paths: - pathType: ImplementationSpecific backend: service: name: my-mc-service port: number: 60001 - host: SECOND_DOMAIN http: paths: - pathType: ImplementationSpecific backend: service: name: my-mc-service port: number: 60002 ``` Replace <code><var>FIRST_DOMAIN</var></code> and <code><var>SECOND_DOMAIN</var></code> with your domain names. This manifest describes an Ingress that lists pre-shared certificate resources in an annotation.
שימוש בסודות של Kubernetes
כדי לספק למאזן עומסים ב-HTTP(S) אישורים ומפתחות שיצרתם בעצמכם, צריך ליצור אובייקט Secret אחד או יותר של Kubernetes. כל סוד מכיל אישור ומפתח. מוסיפים את הסודות לשדה tls במניפסט Ingress. מאזן העומסים משתמש ב-SNI (אינדיקציה של שם השרת) כדי לקבוע איזה אישור להציג ללקוח, על סמך שם הדומיין בלחיצת היד של TLS.
כדי להשתמש בכמה אישורים:
יוצרים Secret לכל זוג של אישור ומפתח:
kubectl create secret tls FIRST_SECRET_NAME \ --cert=FIRST_CERT_FILE \ --key=FIRST_KEY_FILE ``` ```sh kubectl create secret tls SECOND_SECRET_NAME \ --cert=SECOND_CERT_FILE \ --key=SECOND_KEY_FILE ```במניפסט של Ingress, בקטע
spec.tls, מפרטים את הסודות שיצרתם. בנוסף, בקטעspec.rules, צריך לכלול את השדותhostכדי לציין את הדומיינים של השירותים.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-mc-ingress spec: tls: - secretName: FIRST_SECRET_NAME - secretName: SECOND_SECRET_NAME rules: - host: FIRST_DOMAIN http: paths: - pathType: ImplementationSpecific backend: service: name: my-mc-service port: number: 60001 - host: SECOND_DOMAIN http: paths: - pathType: ImplementationSpecific backend: service: name: my-mc-service port: number: 60002מחליפים את
FIRST_DOMAINואתSECOND_DOMAINבשמות דומיין שבבעלותכם, למשלexample.comו-examplepetstore.com.
השינויים ב-Secrets מתעדכנים מעת לעת, כך שאם משנים את הנתונים בתוך ה-Secret, יידרשו עד 10 דקות עד שהשינויים יחולו על מאזן העומסים.
כדי לאבטח את ה-Ingress המוצפן ב-HTTPS עבור אשכולות GKE, אפשר לעיין בדוגמה Secure Ingress.
השבתת HTTP
אם רוצים שכל התנועה בין הלקוח לבין מאזן העומסים תשתמש ב-HTTPS, אפשר להשבית את ה-HTTP על ידי הוספת ההערה kubernetes.io/ingress.allow-http למניפסט של Ingress. מגדירים את ערך ההערה כ-"false".
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress-2
annotations:
kubernetes.io/ingress.allow-http: "false"
spec:
tls:
- secretName: SECRET_NAME
...
המניפסט הזה כולל את SECRET_NAME, שהוא השם של הסוד שיצרתם.
HTTP/2 בין הלקוח למאזן העומסים
לקוחות יכולים להשתמש ב-HTTP/2 כדי לשלוח בקשות למאזן העומסים. לא נדרשת הגדרה.
אבטחה ואופטימיזציה של התנועה בין מאזן העומסים לבין האפליקציה
אתם יכולים להגדיר את הפרוטוקול שמשמש לתקשורת בין מאזן העומסים לבין ה-Pods של האפליקציה, כדי להבטיח אבטחה מקצה לקצה או כדי לשפר את הביצועים של התנועה הפנימית. למרות שברירת המחדל של מאזן העומסים היא HTTP/1.1 לא מוצפן לחיבורי בק-אנד, אתם יכולים להפעיל HTTPS או HTTP/2 כדי לעמוד בדרישות הספציפיות של האפליקציה.
HTTPS בין מאזן העומסים לבין האפליקציה
אם האפליקציה שלכם, שפועלת ב-Pod של GKE, יכולה לקבל בקשות HTTPS, אתם יכולים להגדיר את מאזן העומסים כך שישתמש ב-HTTPS כשהוא מעביר בקשות לאפליקציה. מידע נוסף אפשר למצוא במאמר בנושא HTTPS (TLS) בין מאזן העומסים לבין האפליקציה.
כדי להגדיר את הפרוטוקול שמשמש בין מאזן העומסים לבין האפליקציה, משתמשים בהערה cloud.google.com/app-protocols במניפסט של השירות.
המניפסט של השירות הזה צריך לכלול את type: NodePort, אלא אם אתם משתמשים באיזון עומסים מובנה בקונטיינר.
אם אתם משתמשים באיזון עומסים שמקורם בקונטיינר, אתם צריכים להשתמש ב-type: ClusterIP.
במניפסט השירות הבא מצוינות שתי יציאות. ההערה מציינת שכאשר מאזן עומסים מסוג HTTP(S) מכוון ליציאה 80 של השירות, הוא צריך להשתמש ב-HTTP. וכשמאזן העומסים מכוון ליציאה 443 של השירות, הוא צריך להשתמש ב-HTTPS.
מניפסט השירות חייב לכלול ערך name בהערת היציאה. אפשר לערוך את יציאת השירות רק באמצעות name שהוקצה לה, ולא באמצעות הערך targetPort שלה.
apiVersion: v1
kind: Service
metadata:
name: my-service-3
annotations:
cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
spec:
type: NodePort
selector:
app: metrics
department: sales
ports:
- name: my-https-port
port: 443
targetPort: 8443
- name: my-http-port
port: 80
targetPort: 50001
שימוש ב-HTTP/2 בין מאזן העומסים לבין האפליקציה
אם האפליקציה שלכם, שפועלת ב-Pod של GKE, יכולה לקבל בקשות HTTP/2, אתם יכולים להגדיר את מאזן העומסים כך שישתמש ב-HTTP/2 כשהוא מעביר בקשות לאפליקציה.
כדי להפעיל HTTP/2, צריך להשתמש בהערת cloud.google.com/app-protocols במניפסט של שירות Kubernetes. ההערה הזו מציינת את הפרוטוקול שמאזן העומסים משתמש בו כדי לתקשר עם האפליקציה. כדי לוודא שמאזן העומסים שולח בקשת HTTP/2 נכונה לשרת העורפי, השרת העורפי צריך להיות מוגדר עם SSL.
הדוגמה הבאה היא של מניפסט שירות שהוגדר ל-HTTP/2:
apiVersion: v1
kind: Service
metadata:
name: my-http2-service
annotations:
cloud.google.com/app-protocols: '{"my-port":"HTTP2"}'
spec:
type: NodePort
selector:
app: my-app
ports:
- name: my-port
protocol: TCP
port: 443
targetPort: 8443
שימו לב לנקודות הבאות:
- ההערה
cloud.google.com/app-protocolsמוגדרת לערך'{"my-port":"HTTP2"}', שמורה למאזן העומסים להשתמש ב-HTTP/2 לתעבורה שנשלחת ליציאה שנקראתmy-port. - היציאה מוגדרת ל-
443ומפנה את התנועה אל ה-Pods ב-targetPort8443.