פריסה במספר אזורים ב-GKE וב-GKE On-Prem

במאמר הזה מתוארת פריסה מרובת אזורים של Apigee Hybrid ב-GKE ושל Anthos GKE שנפרסו באתר.

טופולוגיות לפריסה במספר אזורים כוללות את האפשרויות הבאות:

  • Active-Active: אם יש לכם אפליקציות שפרוסות בכמה מיקומים גיאוגרפיים ואתם צריכים תגובת API עם זמן אחזור נמוך לפריסות שלכם. יש לכם אפשרות לפרוס פריסה היברידית בכמה מיקומים גיאוגרפיים שהכי קרובים ללקוחות שלכם. לדוגמה: החוף המערבי של ארה"ב, החוף המזרחי של ארה"ב, אירופה, APAC.
  • Active-Passive: כשמוגדר אזור ראשי ואזור מעבר לגיבוי או אזור להתאוששות מאסון.

האזורים בפריסה היברידית במספר אזורים מתקשרים באמצעות Cassandra, כפי שמוצג בתמונה הבאה:

דרישות מוקדמות

לפני שמגדירים את ההיברידיות למספר אזורים, צריך לוודא שמתקיימים התנאים המוקדמים הבאים:

  • הגדרת אשכולות Kubernetes בכמה אזורים עם בלוקים שונים של CIDR
  • הגדרת תקשורת בין אזורים
  • פותחים את הפורטים 7000 ו-7001 של Cassandra בין אשכולות Kubernetes בכל האזורים (יכול להיות שיהיה צורך להשתמש ב-7000 כאפשרות גיבוי במהלך פתרון בעיות). אפשר לעיין גם במאמר בנושא הגדרת יציאות.

מידע מפורט זמין במאמרי העזרה בנושא Kubernetes.

הגדרת מארח הזרעים במספר אזורים

בקטע הזה מתואר איך להרחיב את אשכול Cassandra הקיים לאזור חדש. ההגדרה הזו מאפשרת לאזור החדש להפעיל את האשכול ולהצטרף למרכז הנתונים הקיים. בלי ההגדרה הזו, קלאסטרים של Kubernetes בכמה אזורים לא ידעו על קיומם של קלאסטרים אחרים.

  1. מריצים את הפקודה הבאה kubectl כדי לזהות כתובת של מארח seed ל-Cassandra באזור הנוכחי.

    כתובת של מארח seed מאפשרת למופע אזורי חדש למצוא את האשכול המקורי בהפעלה הראשונה, כדי ללמוד את הטופולוגיה של האשכול. כתובת המארח הראשוני מוגדרת כנקודת הקשר באשכול.

    kubectl get pods -o wide -n apigee
    
    NAME                      READY   STATUS      RESTARTS   AGE   IP          NODE                                          NOMINATED NODE
    apigee-cassandra-0        1/1     Running     0          5d    10.0.0.11   gke-k8s-dc-2-default-pool-a2206492-p55d
    apigee-cassandra-1        1/1     Running     0          5d    10.0.2.4    gke-k8s-dc-2-default-pool-e9daaab3-tjmz
    apigee-cassandra-2        1/1     Running     0          5d    10.0.3.5    gke-k8s-dc-2-default-pool-e589awq3-kjch
  2. מחליטים איזו מכתובות ה-IP שמוחזרות מהפקודה הקודמת תהיה מארח ה-seed של כמה אזורים.
  3. ההגדרה בשלב הזה תלויה בשימוש ב-GKE או ב-GKE on-prem:

    GKE בלבד: במרכז הנתונים 2, מגדירים את cassandra.multiRegionSeedHost ואת cassandra.datacenter בניהול רכיבי מישור זמן הריצה, כאשר multiRegionSeedHost הוא אחת מכתובות ה-IP שמוחזרות מהפקודה הקודמת:

    cassandra:
      multiRegionSeedHost: seed_host_IP
      datacenter: data_center_name
      rack: rack_name

    לדוגמה:

    cassandra:
      multiRegionSeedHost: 10.0.0.11
      datacenter: "dc-2"
      rack: "ra-1"

    רק ב-GKE on-prem: במרכז הנתונים 2, מגדירים את cassandra.multiRegionSeedHost בקובץ ההחלפות, כאשר multiRegionSeedHost הוא אחת מכתובות ה-IP שמוחזרות מהפקודה הקודמת:

    cassandra:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      multiRegionSeedHost: seed_host_IP
    

    לדוגמה:

    cassandra:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      multiRegionSeedHost: 10.0.0.11
    

  4. במרכז הנתונים או באזור החדש, לפני שמתקינים את הגרסה ההיברידית, צריך להגדיר את אותם אישורי TLS ואת אותם פרטי כניסה ב-overrides.yaml כמו שהגדרתם באזור הראשון.

הגדרת האזור החדש

אחרי שמגדירים את המארח הראשי, אפשר להגדיר את האזור החדש.

כדי להגדיר את האזור החדש:

  1. מעתיקים את האישור מהאשכול הקיים לאשכול החדש. ה-CA root החדש משמש את Cassandra ורכיבים היברידיים אחרים ל-mTLS. לכן, חשוב שיהיו אישורים עקביים בכל האשכול.
    1. מגדירים את ההקשר למרחב השמות המקורי:
      kubectl config use-context original-cluster-name
    2. מייצאים את ההגדרות הנוכחיות של מרחב השמות לקובץ:
      $ kubectl get namespace  -o yaml > apigee-namespace.yaml
    3. מייצאים את הסוד apigee-ca לקובץ:
      kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
    4. מגדירים את ההקשר לשם האשכול של האזור החדש:
      kubectl config use-context new-cluster-name
    5. מייבאים את הגדרת מרחב השמות לאשכול החדש. אם אתם משתמשים במרחב שמות אחר באזור החדש, הקפידו לעדכן את הערך של namespace בקובץ:
      kubectl apply -f apigee-namespace.yaml
    6. מייבאים את הסוד לאשכול החדש:

      kubectl -n cert-manager apply -f apigee-ca.yaml
  2. מתקינים את הגרסה ההיברידית באזור החדש. חשוב לוודא שקובץ overrides-DC_name.yaml כולל את אותם אישורי TLS שהוגדרו באזור הראשון, כמו שמוסבר בקטע הקודם.

    מריצים את שתי הפקודות הבאות כדי להתקין את Hybrid באזור החדש:

    apigeectl init -f overrides-DC_name.yaml
    apigeectl apply -f overrides-DC_name.yaml
  3. מרחיבים את כל מרחבי המפתחות של Apigee.

    השלבים הבאים מרחיבים את נתוני Cassandra למרכז הנתונים החדש:

    1. פותחים מעטפת ב-Cassandra pod:
      kubectl run -i --tty --restart=Never --rm --image google/apigee-hybrid-cassandra-client:1.0.0 cqlsh
    2. מתחברים לשרת Cassandra:
      cqlsh apigee-cassandra-0.apigee-cassandra.apigee.svc.cluster.local -u ddl_user --ssl
      Password:
      
      Connected to apigeecluster at apigee-cassandra-0.apigee-cassandra.apigee.svc.cluster.local:9042.
      [cqlsh 5.0.1 | Cassandra 3.11.3 | CQL spec 3.4.4 | Native protocol v4]
      Use HELP for help.
    3. כדי לקבל את מרחבי המפתחות הזמינים:
      SELECT * from system_schema.keyspaces ;
       keyspace_name              | durable_writes | replication
      ----------------------------+----------------+--------------------------------------------------------------------------------------------------------
                      system_auth |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '1', 'dc-2': '1'}
                    system_schema |           True |                                                {'class': 'org.apache.cassandra.locator.LocalStrategy'}
       cache_hybrid_test_7_hybrid |           True |                  {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
         kms_hybrid_test_7_hybrid |           True |                  {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
         kvm_hybrid_test_7_hybrid |           True |                  {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
               system_distributed |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '1', 'dc-2': '1'}
                           system |           True |                                                {'class': 'org.apache.cassandra.locator.LocalStrategy'}
                           perses |           True |                  {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
       quota_hybrid_test_7_hybrid |           True |                  {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
                    system_traces |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '1', 'dc-2': '1'}
      
      (10 rows)
    4. עדכון או הרחבה של מרחבי המפתחות של apigee:
      ALTER KEYSPACE cache_hybrid_test_7_hybrid WITH replication = {'class': 'NetworkTopologyStrategy', 'dc-1':3, 'dc-2':3};
      ALTER KEYSPACE kms_hybrid_test_7_hybrid WITH replication = {'class': 'NetworkTopologyStrategy', 'dc-1':3, 'dc-2':3};
      ALTER KEYSPACE kvm_hybrid_test_7_hybrid WITH replication = {'class': 'NetworkTopologyStrategy', 'dc-1':3, 'dc-2':3};
      ALTER KEYSPACE perses WITH replication = {'class': 'NetworkTopologyStrategy', 'dc-1':3, 'dc-2':3};
      ALTER KEYSPACE quota_hybrid_test_7_hybrid  WITH replication = {'class': 'NetworkTopologyStrategy', 'dc-1':3, 'dc-2':3};
    5. מאמתים את הרחבת מרחב המפתחות:
      SELECT * from system_schema.keyspaces ;
       keyspace_name              | durable_writes | replication
      ----------------------------+----------------+--------------------------------------------------------------------------------------------------------
                      system_auth |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '1', 'dc-2': '1'}
                    system_schema |           True |                                                {'class': 'org.apache.cassandra.locator.LocalStrategy'}
       cache_hybrid_test_7_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3', 'dc-2': '3'}
         kms_hybrid_test_7_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3', 'dc-2': '3'}
         kvm_hybrid_test_7_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3', 'dc-2': '3'}
               system_distributed |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '1', 'dc-2': '1'}
                           system |           True |                                                {'class': 'org.apache.cassandra.locator.LocalStrategy'}
                           perses |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3', 'dc-2': '3'}
       quota_hybrid_test_7_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3', 'dc-2': '3'}
                    system_traces |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '1', 'dc-2': '1'}
      
      (10 rows)
      ddl@cqlsh>
  4. מריצים את הפקודה nodetool rebuild ברצף בכל הצמתים במרכז הנתונים החדש. התהליך עשוי להימשך כמה דקות עד כמה שעות, בהתאם לגודל הנתונים.
    kubectl exec apigee-cassandra-0 -n apigee  -- nodetool rebuild -- dc-1
  5. בודקים את תהליכי הבנייה מחדש ביומנים. כמו כן, מוודאים את גודל הנתונים באמצעות הפקודה nodetool status:
    kubectl logs apigee-cassandra-0 -f -n apigee

    בדוגמה הבאה מוצגות רשומות לדוגמה ביומן:

    INFO  01:42:24 rebuild from dc: dc-1, (All keyspaces), (All tokens)
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Executing streaming plan for Rebuild
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.432KiB), sending 0 files(0.000KiB)
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.1.45 is complete
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.693KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.4.36 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 3 files(0.720KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.5.22 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] All sessions completed
  6. מעדכנים את המארחים הראשוניים. צריך להסיר את multiRegionSeedHost: 10.0.0.11 מהחשבון overrides-DC_name.yaml ולהחיל אותו מחדש.
    apigeectl apply -f overrides-DC_name.yaml

בדיקת הסטטוס של אשכול Cassandra

הפקודה הבאה שימושית כדי לבדוק אם הגדרת האשכול הצליחה בשני מרכזי נתונים. הפקודה בודקת את הסטטוס של nodetool בשני האזורים.

kubectl exec apigee-cassandra-0  -- nodetool status


Datacenter: us-central1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.12.1.45  112.09 KiB  256          100.0%            3c98c816-3f4d-48f0-9717-03d0c998637f  ra-1
UN  10.12.4.36  95.27 KiB  256          100.0%            0a36383d-1d9e-41e2-924c-7b62be12d6cc  ra-1
UN  10.12.5.22  88.7 KiB   256          100.0%            3561f4fa-af3d-4ea4-93b2-79ac7e938201  ra-1
Datacenter: us-west1
====================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.0.4.33   78.69 KiB  256          0.0%              a200217d-260b-45cd-b83c-182b27ff4c99  ra-1
UN  10.0.0.21   78.68 KiB  256          0.0%              9f3364b9-a7a1-409c-9356-b7d1d312e52b  ra-1
UN  10.0.1.26   15.46 KiB  256          0.0%              1666df0f-702e-4c5b-8b6e-086d0f2e47fa  ra-1