במאמר הזה מוסבר איך מגדירים פריסה של Spanner Omni בכמה אשכולות של Kubernetes. אפשר לפרוס את Spanner Omni עם הצפנת TLS או בלי. אם משתמשים בהצפנה, Spanner Omni משתמש ב-Transport Layer Security (TLS) 1.3 כדי להצפין ולאמת את התקשורת בתוך הפריסה ועם הלקוחות שלה.
פריסה ללא הצפנת TLS כוללת את סיכוני האבטחה הבאים:
- כל מי שיש לו גישה לכתובת ה-IP של הפריסה יכול לגשת לפריסה.
- אין הצפנה של הרשת בין הלקוח לשרת או בין הפודים.
בגלל הסיכונים האלה, מומלץ להימנע מפריסה שלא מוגדרת עם הצפנת TLS בסביבות ייצור.
גרסת הטרום-השקה של Spanner Omni לא תומכת בהצפנת TLS, והיא מפסיקה לכתוב נתונים 90 יום אחרי שיוצרים פריסה. כדי לקבל גישה מוקדמת למהדורה עם כל התכונות, אפשר לפנות אל Google.
לפני שמתחילים
כדי להתכונן לפריסה, צריך לעמוד בדרישות הבאות:
יוצרים כמה אשכולות Kubernetes בכל מיקום לפריסה. אפשר להגדיר את האשכולים לפי אזורים אם מבצעים פריסה רק באזור אחד באשכול. Spanner Omni תומך בהגדרת תרשימי Helm עבור סביבות Google Kubernetes Engine (GKE) ו-Amazon Elastic Kubernetes Service (Amazon EKS). יכול להיות שבסביבות אחרות יידרשו הגדרות בהתאמה אישית.
קבלת גישה לקובץ אימג' של קונטיינר שמתארח ב-Artifact Registry.
מתקינים ומגדירים את כלי שורת הפקודה
kubectlואת Helm.אם הגדרתם את סביבת Kubernetes במכונות של פלטפורמת הווירטואליזציה vSphere, צריך להשבית את הווירטואליזציה של Time Stamp Counter (TSC) על ידי הוספת
monitor_control.virtual_rdtsc = FALSEלקובץ ההגדרה.vmxשל המכונה הווירטואלית. כך TrueTime פועל בצורה תקינה.מגדירים את הרשת של אשכול Kubernetes כך שקבוצות Pod באשכול אחד יוכלו להתחבר לקבוצות Pod באשכול אחר. כברירת מחדל, Spanner Omni משתמש ביציאות TCP 15000 עד 15025 לתקשורת פנימית. כדי לאפשר תקשורת בין ה-Pods באשכולות האלה, צריך לפתוח את היציאות האלה לתעבורה.
מגדירים את ה-DNS של האשכול כדי לזהות את שם המארח של הפוד, כמו
spanner-a-0.pod.spanner-ns-r1, ולתרגם אותו לכתובת ה-IP שלו. ב-Spanner Omni נדרש תרגום שם (name resolution) המארח לחיבורי TCP בין פודים באשכולות שונים.
הכנת ההגדרות של תרשים Helm
יוצרים הגדרת Helm. למידע נוסף, ראו יצירת הגדרת Helm.
מספר שרתי הבסיס בכל אזור חייב להיות מספר אי-זוגי בין אחד לתשעה, כולל, כדי להבטיח קוורום לעקביות. אם מספר השרתים הוא מספר זוגי, יכול להיות שהפריסות ייכשלו. כשמגדירים את האזורים, מציינים ששרתים מסוימים הם שרתי הבסיס. מומלץ להשתמש באזור אחד לפיתוח או לבדיקות, ובשלושה אזורים לסביבת ייצור עם זמינות גבוהה.
מכיוון שמדובר בפריסה של כמה אשכולות, צריך לוודא שקובץ ה-YAML של הגדרת Helm כולל את ההגדרות הבאות:
# This is required for a multi-cluster deployment setup.
deployment:
multiCluster: true
דוגמה להגדרת תרשים Helm לפריסה מרובת אשכולות
בדוגמה הבאה מוצג תרשים Helm שמוגדר לפריסה של Spanner Omni בכמה אשכולות. ההגדרה הזו יוצרת פריסה בשלושה אזורים: Google Cloud , us-west1 ו-us-west3.us-west2 הפריסה מתבצעת בחמישה אזורים, וכל אזור מייצג עותק. הרפליקות ב-us-west1 וב-us-west2 הן רפליקות לקריאה ולכתיבה, ואילו הרפליקה היחידה ב-us-west3 היא רפליקת עדות.
# The platform of the deployment
global:
platform: gke
# This is required for a multi-cluster deployment setup.
deployment:
multiCluster: true
# Locations and zones where clusters are created for the deployment
locations:
- name: us-west1
namespace: spanner-ns-usw1
zones:
- name: "us-west1-a"
shortName: "a"
- name: "us-west1-b"
shortName: "b"
- name: us-west2
namespace: spanner-ns-usw2
zones:
- name: "us-west2-a"
shortName: "a"
- name: "us-west2-b"
shortName: "b"
- name: us-west3
namespace: spanner-ns-usw3
zones:
- name: "us-west3-a"
shortName: "a"
replicaType: WITNESS
# Remaining configuration like storage, resources, isn't included in this sample.
הגדרת kubectl לחיבור לכמה אשכולות
לפני שממשיכים, יוצרים אשכולות עם kubectl הקשרים. לדוגמה, בקובץ ה-YAML של הגדרות Helm, אפשר לתת הקשרים שמות לפי המיקום, כמו ctx-usw1, ctx-usw2 ו-ctx-usw3.
הגדרת הצפנת TLS
אם אתם מגדירים פריסה ללא הצפנה, דלגו אל התקנת תרשים Helm לכל אשכול.
כדי להגדיר הצפנת TLS בפריסה מרובת אשכולות, צריך ליצור רשות אישורים (CA) וליצור אישורים לכל אשכול. מידע נוסף זמין במאמר בנושא הוספת הצפנת TLS לפריסת Kubernetes.
יצירת האישורים
יוצרים את ה-CA ואת האישורים לשרת ול-API. האישורים של השרת ושל ה-API צריכים לכלול את המארחים מכל האשכולות.
יצירת אישור שרת Spanner Omni
שרתי Spanner Omni משתמשים באישורי שרת כדי להצפין תקשורת בין שרתים.
כדי ליצור את אישור השרת, מריצים את הפקודה הבאה. מחליפים את SERVER_LIST ברשימה מופרדת בפסיקים של שמות דומיין שמוגדרים במלואם (FQDN) של פודים של שרתי Spanner Omni, או משתמשים בתווים כלליים.
SERVER_NAMES=*.pod.spanner-ns-usw1,*.pod.spanner-ns-usw2,*.pod.spanner-ns-usw3
Spanner Omni CLI certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs
יצירת אישור API
אישורי API מצפינים את התקשורת ממערכות שמתקשרות עם הפריסה.
כדי ליצור את אישור ה-API, מריצים את הפקודה הבאה. מחליפים את OMNI_ENDPOINT בנקודות הקצה של השירות לכל אשכול.
OMNI_ENDPOINT=spanner.spanner-ns-usw1,spanner.spanner-ns-usw2,spanner.spanner-ns-usw3
Spanner Omni CLI certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs
דחיפת האישורים לכל אשכול Kubernetes
לכל אשכול, יוצרים את מרחב השמות ואת ה-Secret הגנרי שמכיל את האישורים.
# Repeat for each context (for example, ctx-usw1, ctx-usw2, ctx-usw3)
# Replace NAMESPACE with the appropriate namespace for each region
kubectl create namespace <var>NAMESPACE</var> --context <var>CONTEXT</var>
kubectl create secret generic tls-certs \
--from-file=ca.crt="certs/ca.crt" \
--from-file=ca-api.crt="certs/ca-api.crt" \
--from-file=server.crt="certs/server.crt" \
--from-file=server.key="certs/server.key" \
--from-file=api.crt="certs/api.crt" \
--from-file=api.key="certs/api.key" \
-n <var>NAMESPACE</var> \
--context <var>CONTEXT</var>
התקנת תרשים Helm לכל אשכול
יוצרים הגדרת Helm. למידע נוסף, ראו יצירת הגדרת Helm.
בפריסה מרובת אשכולות, מחילים את הגדרת תרשים Helm מקובץ ההגדרות של Helm על כל אשכול Kubernetes. בכל פקודה, צריך לטרגט מיקום ספציפי ומרחב השמות שלו כדי לקשר אותו לפריסת Spanner Omni. ההגדרה תחול על כל מיקום באותו סדר שבו הם מופיעים בקובץ ההגדרות של Helm. כשמחילים את ההגדרה על המיקום הסופי, המערכת יוצרת משימת אתחול של פריסה באותו אשכול.
לפני שמתקינים את Helm בכל אשכול, צריך ליצור את מרחב השמות של המעקב באשכול שבו מתכננים לארח את חבילת הכלים למעקב:
kubectl create namespace monitoring --context ctx-usw1
דוגמאות לפקודות התקנה של תרשימי Helm
הפקודות הבאות מתקינות תרשים Helm באשכולות. בכל פקודה, PATH_TO_HELM_CONFIG_FILE הוא הנתיב לקובץ ה-YAML של תצורת תרשים Helm שיצרתם לפריסה.
התקנת תרשים ב-us-west1 עם הפעלת מעקב
helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.2.0 \
-f PATH_TO_HELM_CONFIG_FILE \
--namespace spanner-ns-usw1 \
--set currentLocation=us-west1 \
--set monitoring.enabled=true \
--create-namespace \
--kube-context ctx-usw1
התקנת תרשים ב-us-west2 ללא מעקב
helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.2.0 \
-f PATH_TO_HELM_CONFIG_FILE \
--namespace spanner-ns-usw2 \
--set currentLocation=us-west2 \
--create-namespace \
--kube-context ctx-usw2
התקנת תרשים ב-us-west3 ללא מעקב
helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.2.0 \
-f PATH_TO_HELM_CONFIG_FILE \
--namespace spanner-ns-usw3 \
--set currentLocation=us-west3 \
--create-namespace \
--kube-context ctx-usw3
מעקב אחרי ההתקדמות של הפריסה
אחרי שמחילים את ההגדרה של תרשים Helm, מתחילה משימת bootstrap בכל אשכול Kubernetes. אחרי שתהליך האתחול יתחיל באשכול האחרון, מריצים את הפקודה הבאה כדי לעקוב אחרי תהליך הפריסה:
kubectl logs -n spanner-ns-usw3 -l app.kubernetes.io/component=bootstrap -f
אם היומנים מציינים שלא ניתן להגיע לכל השרתים, צריך לוודא ששירות ה-DNS בכל אשכול מוגדר בצורה נכונה.
הגדרת שירות ה-DNS של האשכול
אם אתם משתמשים בDNS חיצוני עם אשכול Kubernetes והוא מנהל רשומות DNS עבור שירותים ללא כתובת IP, אתם יכולים לדלג על השלב הזה.
Spanner משתמש בשם המארח של ה-pod לכל התקשורת הפנימית.
מגדירים את ה-DNS כך שה-pods יוכלו לפענח שמות מארחים גם כשהם פועלים באשכולות שונים של Kubernetes. כדי לעשות זאת, צריך לחשוף את השירות kube-dns בכל אשכול כדי שאשכולות אחרים יוכלו להגיע אליו על ידי הפעלת הסקריפט dns-setup.sh.
הסקריפט הזה פורס שירות של מאזן עומסים בכל אשכול עבור האפליקציה kube-dns, ומעדכן את תצורת ה-DNS כך שתצביע על שירותי מאזן העומסים. dns-setup.sh מגדיר את kube-dns ואת CoreDNS ב-GKE וב-Amazon EKS, אבל יכול להיות שתצטרכו להגדיר אותו לסביבה שלכם.
כדי להגדיר את שירות ה-DNS של האשכול:
אם עדיין לא עשיתם זאת, מורידים את הסקריפט
dns-setup.shמקטגוריית Cloud Storagespanner-omni.מריצים את הסקריפט
dns-setup.sh:dns-setup.sh -n CSV_NAME_SPACE_LIST CONTEXTSמחליפים את CSV_NAME_SPACE_LIST ברשימה מופרדת בפסיקים של מרחבי השמות.
מחליפים את CONTEXTS ברשימת ההקשרים.
הדוגמה הבאה מראה איך להשתמש בסקריפט
dns-setup.sh:dns-setup.sh -n spanner-ns-usw1,spanner-ns-usw2,spanner-ns-usw3 ctx-usw1 ctx-usw2 ctx-usw3
אחרי שמריצים את הסקריפט, בודקים את היומנים ממשימת הפריסה. הודעות מציינות שהפריסה מתקדמת, ומופיעה הודעה Deployment created successfully.
עדכון אישור ה-API
אם אתם מגדירים פריסה ללא הצפנת TLS, אתם יכולים להמשיך אל אינטראקציה עם Spanner Omni.
כדי להטמיע הצפנת TLS, צריך לעדכן את אישור ה-API עם כתובות ה-IP החיצוניות או שמות ה-DNS של מאזני העומסים לכל אשכול. כך מוודאים שהלקוחות יוכלו להתחבר לפריסה דרך ערוצים מאובטחים.
מקבלים את פרטי השירות של כל אשכול:
kubectl get service spanner -n spanner-ns-usw1 --context ctx-usw1 kubectl get service spanner -n spanner-ns-usw2 --context ctx-usw2 kubectl get service spanner -n spanner-ns-usw3 --context ctx-usw3מעדכנים את אישור ה-API עם כתובות ה-IP החיצוניות:
# Replace <var>EXTERNAL_IP_USW1</var>, <var>EXTERNAL_IP_USW2</var>, and <var>EXTERNAL_IP_USW3</var> # with the actual external IP addresses or DNS names. OMNI_ENDPOINT=<var>EXTERNAL_IP_USW1</var>,<var>EXTERNAL_IP_USW2</var>,<var>EXTERNAL_IP_USW3</var>,spanner.spanner-ns.svc Spanner Omni CLI certificates update --filename_prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output_directory certs --overwriteמעדכנים את הסודות בכל אשכול Kubernetes עם אישור ה-API החדש:
# Repeat for each context kubectl patch secret tls-certs -n spanner-ns-usw1 --context ctx-usw1 -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}" kubectl patch secret tls-certs -n spanner-ns-usw2 --context ctx-usw2 -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}" kubectl patch secret tls-certs -n spanner-ns-usw3 --context ctx-usw3 -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"
אינטראקציה עם Spanner Omni
לכל אשכול בהגדרה מרובת אשכולות יש שירות מאזן עומסים אחד. אתם יכולים להשתמש בכל אחת מכתובות ה-IP החיצוניות של השירות כדי לבצע אינטראקציה עם Spanner Omni. לפעולות כתיבה וקריאה חזקות, צריך להשתמש בכתובת שמשמשת כאזור המוביל. כדי להשיג ביצועים אופטימליים, כשמדובר בבקשות קריאה של נתונים לא עדכניים, צריך להשתמש באזור הקרוב ביותר לאפליקציה.
מריצים את הפקודה הבאה כדי לקבל את כתובת השירות:
kubectl get service spanner -n spanner-ns-usw1 --context ctx-usw1הערך
EXTERNAL-IP:PORTהוא DEPLOYMENT_ENDPOINT עבור הפריסה שלכם.אם עוד לא עשיתם זאת, הורידו את Spanner Omni CLI מ
spanner-omniקטגוריה של Cloud Storage.אם יצרתם פריסה עם הצפנת TLS, צריך לכלול את אישור ה-CA בכל פקודה כדי ליצור חיבור מוצפן. אם הפעלתם mTLS ללקוחות, צריך לכלול גם את ספריית אישורי הלקוח.
--ca-certificate-file=certs/ca-api.crt--client-certificate-directory=clientcerts
אפשר להשתמש ב-Spanner Omni CLI כדי ליצור מסד נתונים של GoogleSQL או PostgreSQL ולבצע איתו אינטראקציה.
GoogleSQL
כדי ליצור מסד נתונים של GoogleSQL ולנהל איתו אינטראקציה, מריצים את הפקודה הבאה:
Spanner Omni CLI databases create DATABASE_NAME \ --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \ --ca-certificate-file=certs/ca-api.crt Spanner Omni CLI sql --database=DATABASE_NAME \ --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \ --ca-certificate-file=certs/ca-api.crtPostgreSQL
כדי ליצור מסד נתונים של PostgreSQL ולבצע בו פעולות, מריצים את הפקודה הבאה:
Spanner Omni CLI databases create POSTGRESQL_DATABASE_NAME \ --database_dialect POSTGRESQL \ --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \ --ca-certificate-file=certs/ca-api.crt Spanner Omni CLI sql --database=POSTGRESQL_DATABASE_NAME \ --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \ --ca-certificate-file=certs/ca-api.crtאפשר גם ליצור אינטראקציה עם מסד נתונים של PostgreSQL באמצעות ההוראות שבמאמר חיבור באמצעות PGAdapter כדי להגדיר את PGAdapter ולהשתמש בכלים של PostgreSQL, כמו
psql, עם מסדי נתונים בניב PostgreSQL.
המאמרים הבאים
- כאן מוסבר איך להשתמש בספריות לקוח ובדרייברים של JDBC כדי לחבר את האפליקציה לפריסה.