Cassandra ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€์ด๋“œ

Apigee ๋ฐ Apigee Hybrid ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.
์ด ์ฃผ์ œ์— ํ•ด๋‹นํ•˜๋Š” Apigee Edge ๋ฌธ์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์ฃผ์ œ์—์„œ๋Š” Cassandra Datastore ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ์น˜๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Cassandra๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋Ÿฐํƒ€์ž„ ์•„ํ‚คํ…์ฒ˜์˜ cassandra ๊ตฌ์„ฑ์š”์†Œ์—์„œ ์‹คํ–‰๋˜๋Š” ์˜๊ตฌ Datastore์ž…๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์„œ๋น„์Šค ๊ตฌ์„ฑ ๊ฐœ์š”๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

Cassandra ํฌ๋“œ๊ฐ€ Releasing ์ƒํƒœ๋กœ ๋ฉˆ์ถฐ ์žˆ์Œ

์ฆ์ƒ

Cassandra ํฌ๋“œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์Šคํ† ์–ด์—์„œ ํ•ด์ œ ์ค‘์ธ ์ƒํƒœ๋กœ ๋ฉˆ์ถฐ ์žˆ๋‹ค๊ณ  ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€

kubectl์„ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋“œ ์ƒํƒœ๋ฅผ ๋ณด๋ฉด ํ•˜๋‚˜ ์ด์ƒ์˜ Cassandra ํฌ๋“œ๊ฐ€ ํ•ด์ œ ์ค‘์ธ ์ƒํƒœ๋กœ ๋ฉˆ์ถฐ ์žˆ์Šต๋‹ˆ๋‹ค.

Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Ack 57s (x7 over 24h) apigee-datastore release started

๊ฐ€๋Šฅํ•œ ์›์ธ

ํฌ๋“œ๊ฐ€ ํ•ด์ œ ์ค‘์ธ ์ƒํƒœ๋กœ ๋ฉˆ์ถฐ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์›์ธ ์„ค๋ช…
์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰ ๋ณ€๊ฒฝ override.yaml ํŒŒ์ผ์˜ ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰์„ ๋ณ€๊ฒฝํ•˜๋Š” ์กฐ์น˜๊ฐ€ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ธฐํƒ€ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ override.yaml ํŒŒ์ผ์˜ cassandra ์†์„ฑ์ด ์—…๋ฐ์ดํŠธ๋˜์—ˆ์ง€๋งŒ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰ ๋ณ€๊ฒฝ

์ง„๋‹จ

  1. kubectl์„ ์‚ฌ์šฉํ•˜์—ฌ apigee ๋ฐ์ดํ„ฐ ์Šคํ† ์–ด ํฌ๋“œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    kubectl get apigeeds -n apigee
    NAME STATE AGE
    default releasing 122d
  2. override.yaml ํŒŒ์ผ์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    1. ๋ฒ„์ „ ์ œ์–ด ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ override.yaml ํŒŒ์ผ์˜ ์ด์ „ ๋ฒ„์ „์„ ํ˜„์žฌ ๋ฒ„์ „๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
      diff OVERRIDES_BEFORE.yaml OVERRIDES_AFTER.yaml
    2. override.yaml์˜ diff ์ถœ๋ ฅ์€ ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰ ํฌ๊ธฐ์™€ ๊ด€๋ จ๋œ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
      # Overrides.yaml  before:
      cassandra:
         storage:
            capacity: 500Gi
      
      # Overrides.yaml after:
      cassandra:
         storage:
            capacity: 100Gi

      ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰์„ ๋ณ€๊ฒฝํ•œ ์ž‘์—…์ด ์žˆ์—ˆ๊ณ , ์ƒˆ override.yaml์ด ์ง์ ‘ ์ ์šฉ๋œ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์Šคํ† ์–ด๊ฐ€ ํ•ด์ œ ์ค‘์ธ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. statefulset์„ ํ™•์ธํ•˜์—ฌ apigee-cassandra-default์— ์ด๋Ÿฌํ•œ ์ž‘์—…์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    kubectl describe sts -n apigee

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    Name:               apigee-cassandra-default
    Namespace:          apigee
    CreationTimestamp:  Tue, 18 Jul 2023 00:40:57 +0000
    Selector:           app=apigee-cassandra,name=default
    Labels:             apigee.cloud.google.com.revision=v1-2cc098050836c6b4
                        apigee.cloud.google.com.version=v1
                        apigee.cloud.google.com/platform=apigee
                        app=apigee-cassandra
                        name=default
    Annotations:        <none>
    Replicas:           3 desired | 3 total
    Update Strategy:    RollingUpdate
      Partition:        0
    Pods Status:        3 Running / 0 Waiting / 0 Succeeded / 0 Failed
    Pod Template:
      Labels:       apigee.cloud.google.com/apigee_servicename=production
                    apigee.cloud.google.com/billing_type=subscription
                    apigee.cloud.google.com/platform=apigee
                    app=apigee-cassandra
                    name=default
                    revision=v1
                    runtime_type=hybrid
      Annotations:  apigee.cloud.google.com/pod-template-spec-hash: 2cc098050836c6b4
                    prometheus.io/path: /metrics
                    prometheus.io/port: 7070
                    prometheus.io/scheme: https
                    prometheus.io/scrape: true
      Containers:
       apigee-cassandra:
        Image:       gcr.io/apigee-release/hybrid/apigee-hybrid-cassandra:1.10.1
        Ports:       7000/TCP, 7001/TCP, 7199/TCP, 9042/TCP, 8778/TCP
        Host Ports:  7000/TCP, 7001/TCP, 7199/TCP, 9042/TCP, 8778/TCP
        Requests:
          cpu:      500m
          memory:   1Gi
        Readiness:  exec [/bin/bash -c /opt/apigee/ready-probe.sh] delay=0s timeout=5s period=10s #success=1 #failure=2
        Environment:
          POD_NAME:                  (v1:metadata.name)
          POD_IP:                    (v1:status.podIP)
          MAX_HEAP_SIZE:            512M
          HEAP_NEWSIZE:             100M
          CASSANDRA_SEEDS:          apigee-cassandra-default-0.apigee-cassandra-default.apigee.svc.cluster.local
          CASSANDRA_CLUSTER_NAME:   apigeecluster
          CASSANDRA_DC:             dc-1
          CASSANDRA_RACK:           ra-1
          CASSANDRA_OPEN_JMX:       true
          CPS_ADMIN_USER:           <set to the key 'admin.user' in secret 'apigee-datastore-default-creds'>        Optional: false
          CPS_ADMIN_PASSWORD:       <set to the key 'admin.password' in secret 'apigee-datastore-default-creds'>    Optional: false
          APIGEE_JMX_USER:          <set to the key 'jmx.user' in secret 'apigee-datastore-default-creds'>          Optional: false
          APIGEE_JMX_PASSWORD:      <set to the key 'jmx.password' in secret 'apigee-datastore-default-creds'>      Optional: false
          CASS_PASSWORD:            <set to the key 'default.password' in secret 'apigee-datastore-default-creds'>  Optional: false
          APIGEE_JOLOKIA_USER:      <set to the key 'jolokia.user' in secret 'apigee-datastore-default-creds'>      Optional: false
          APIGEE_JOLOKIA_PASSWORD:  <set to the key 'jolokia.password' in secret 'apigee-datastore-default-creds'>  Optional: false
        Mounts:
          /opt/apigee/apigee-cassandra/conf from appsfs (rw)
          /opt/apigee/customer from cwc-volume (ro)
          /opt/apigee/data from cassandra-data (rw)
          /opt/apigee/ssl from tls-volume (ro)
          /var/secrets/google from apigee-cassandra-backup (rw)
          /var/secrets/keys from apigee-cassandra-backup-key-file (rw)
      Volumes:
       cwc-volume:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  config-cassandra-default
        Optional:    false
       tls-volume:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  apigee-cassandra-default-tls
        Optional:    false
       appsfs:
        Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
        Medium:
        SizeLimit:  <unset>
       apigee-cassandra-backup:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  apigee-cassandra-backup-svc-account
        Optional:    true
       apigee-cassandra-backup-key-file:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  apigee-cassandra-backup-key-file
        Optional:    true
    Volume Claims:
      Name:          cassandra-data
      StorageClass:
      Labels:        <none>
      Annotations:   <none>
      Capacity:      10Gi
      Access Modes:  [ReadWriteOnce]
    Events:
      Type    Reason            Age   From                    Message
      ----    ------            ----  ----                    -------
      Normal  SuccessfulCreate  47m   statefulset-controller  create Pod apigee-cassandra-default-2 in StatefulSet apigee-cassandra-default successful
  4. Apigee ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    kubectl logs -f apigee-controller-manager-59cf595c77-wtwnr -n apigee-system -c manager | grep apigeedatastore
    

    ๊ฒฐ๊ณผ:

    "error creating
    apigee-cassandra object: failed to update resource
    apigee/apigee-cassandra-default: StatefulSet.apps \"apigee-cassandra-default\"
    is invalid: spec: Forbidden: updates to statefulset spec for fields other than
    'replicas', 'template', 'updateStrategy', 'persistentVolumeClaimRetentionPolicy'
    and 'minReadySeconds' are forbiddenerror creating apigee-cassandra object:
    failed to update resource apigee/apigee-cassandra-default: StatefulSet.apps
    \"apigee-cassandra-default\" is invalid: spec: Forbidden: updates to statefulset
    spec for fields other than 'replicas', 'template', 'updateStrategy',
    'persistentVolumeClaimRetentionPolicy' and 'minReadySeconds' are forbidden"

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋‹ค์Œ ๋‹จ๊ณ„์— ๋”ฐ๋ผ Cassandra ์ƒํƒœ๋ฅผ ์žฌ์„ค์ •ํ•˜์—ฌ ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. apigee-controller๋ฅผ ์‚ฌ์šฉ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.
    kubectl -n apigee-system edit deployments and set --enable-controllers=true to --enable-controllers=false
    
  2. PATCH ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์Šคํ† ์–ด๋ฅผ ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.
    curl -XPATCH \-H "Accept: application/json" -H "Content-Type: application/json-patch+json" --data '[{"op": "replace", "path": "/status/nestedState", "value": ""},{"op": "replace", "path": "/status/state", "value": "running"}]' 'http://127.0.0.1:8001/apis/apigee.cloud.google.com/v1alpha1/namespaces/apigee/apigeedatastores/default/status'
    
  3. Helm์„ ์‚ฌ์šฉํ•˜์—ฌ ์›๋ณธ override.yaml ํŒŒ์ผ์„ ๋‹ค์‹œ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
    helm upgrade datastore apigee-datastore/ \
    --namespace APIGEE_NAMESPACE \
    --atomic \
    -f OVERRIDES_FILE \
    --dry-run=server

    ์ž‘์—…์ด ์‹คํŒจ ์‹œ ๋กค๋ฐฑ๋˜๋„๋ก --atomic์„ ํฌํ•จํ•˜์—ฌ ํ‘œ์‹œ๋œ ๋ชจ๋“  ์„ค์ •์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐจํŠธ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    helm upgrade datastore apigee-datastore/ \
    --namespace APIGEE_NAMESPACE \
    --atomic \
    -f OVERRIDES_FILE
  4. apigee-controller๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    kubectl -n apigee-system edit deployments and set --enable-controllers=false to --enable-controllers=true
    
  5. ๋ฐ์ดํ„ฐ ์Šคํ† ์–ด๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
    kubectl get apigeeds --namespace apigee
    
  6. Apigee ๋ฐฐํฌ ๋ฐ ํฌ๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.apigeeds ๋” ์ด์ƒ ํ•ด์ œ ์ค‘์ธ ์ƒํƒœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
    kubectl get ad -n apigee
    
    kubectl get pods -n apigee
    
    kubectl get apigeeds -n apigee
    
    NAME      STATE     AGE
    default   running   24d

๊ธฐํƒ€ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ

override.yaml์˜ cassandra ์†์„ฑ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ ๋ฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ๋˜๋Š” override.yaml์˜ ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์ž˜๋ชป๋œ override.yaml์„ ์ž˜๋ชป ์ ์šฉํ•œ ๊ฒฝ์šฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง„๋‹จ

์ง„๋‹จ ๋‹จ๊ณ„๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

ํ•ด๊ฒฐ ๋‹จ๊ณ„๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ง„๋‹จ ์ •๋ณด ์ˆ˜์ง‘ ํ•„์š”

์œ„ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅธ ํ›„์—๋„ ๋ฌธ์ œ๊ฐ€ ์ง€์†๋˜๋ฉด ๋‹ค์Œ ์ง„๋‹จ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•œ ํ›„ Google Cloud Customer Care์— ๋ฌธ์˜ํ•˜์„ธ์š”.

  • ๋ฐฐํฌ๋œ ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ์˜ Overrides.yaml
  • Apigee hybrid ์„ค์น˜์˜ kubernetes cluster-info dump:

    kubernetes cluster-info dump๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    kubectl cluster-info dump -A --output-directory=/tmp/kubectl-cluster-info-dump
    

    zip kubernetes cluster-info dump๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค.

    zip -r kubectl-cluster-info-dump`date +%Y.%m.%d_%H.%M.%S`.zip /tmp/kubectl-cluster-info-dump/*
    

Cassandra ํฌ๋“œ๊ฐ€ ๋Œ€๊ธฐ์ค‘ ์ƒํƒœ๋กœ ๋ฉˆ์ถฐ ์žˆ์Œ

์ฆ์ƒ

์‹œ์ž‘ํ•˜๋ฉด Cassandra ํฌ๋“œ๊ฐ€ ๋Œ€๊ธฐ์ค‘ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€

kubectl๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋“œ ์ƒํƒœ๋ฅผ ๋ณด๋ฉด ํ•˜๋‚˜ ์ด์ƒ์˜ Cassandra ํฌ๋“œ๊ฐ€ Pending ์ƒํƒœ๋กœ ๋ฉˆ์ถฐ ์žˆ์Šต๋‹ˆ๋‹ค. Pending ์ƒํƒœ๋Š” Kubernetes๊ฐ€ ๋…ธ๋“œ์—์„œ ํฌ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํฌ๋“œ๋Š” ์ƒ์„ฑ ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

kubectl get pods -n NAMESPACE

NAME                                     READY   STATUS      RESTARTS   AGE
adah-resources-install-4762w             0/4     Completed   0          10m
apigee-cassandra-default-0               0/1     Pending     0          10m
...

๊ฐ€๋Šฅํ•œ ์›์ธ

ํฌ๋“œ๊ฐ€ ๋Œ€๊ธฐ์ค‘ ์ƒํƒœ๋กœ ๋ฉˆ์ถฐ ์žˆ๋Š” ์ด์œ ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์›์ธ ์„ค๋ช…
๋ฆฌ์†Œ์Šค ๋ถ€์กฑ ํฌ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
๋ณผ๋ฅจ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์Œ ํฌ๋“œ๋Š” ์˜๊ตฌ ๋ณผ๋ฅจ์ด ์ƒ์„ฑ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.
Amazon EBS CSI ๋“œ๋ผ์ด๋ฒ„ ๋ˆ„๋ฝ EKS ์„ค์น˜์˜ ๊ฒฝ์šฐ ํ•„์ˆ˜ Amazon EBS CSI ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ง„๋‹จ

์˜ค๋ฅ˜ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด kubectl์„ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋“œ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

kubectl -n NAMESPACE describe pods POD_NAME

์˜ˆ:

kubectl describe pods apigee-cassandra-default-0 -n apigee

์ถœ๋ ฅ์— ๋‹ค์Œ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ์ด ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒฝ์šฐ CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋Š” ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • Pod์— ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ ์ฆ‰๊ฐ์ ์ธ PersistentVolumeClaim(PVC)์ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚  ๊ฒฝ์šฐ Pod์—์„œ ์˜๊ตฌ ๋ณผ๋ฅจ์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋ฆฌ์†Œ์Šค ๋ถ€์กฑ

CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ถฉ๋ถ„ํ•˜๋„๋ก Cassandra ๋…ธ๋“œ ํ’€์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋…ธ๋“œ ํ’€ ํฌ๊ธฐ ์กฐ์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์˜๊ตฌ ๋ณผ๋ฅจ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์Œ

์˜๊ตฌ ๋ณผ๋ฅจ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด PersistentVolumeClaim(PVC)์„ ์„ค๋ช…ํ•˜์—ฌ ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  1. ํด๋Ÿฌ์Šคํ„ฐ์˜ PVC๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.
    kubectl -n NAMESPACE get pvc
    
    NAME                                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    cassandra-data-apigee-cassandra-default-0   Bound    pvc-b247faae-0a2b-11ea-867b-42010a80006e   10Gi       RWO            standard       15m
    ...
  2. ์‹คํŒจํ•œ ํฌ๋“œ์˜ PVC๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ช…๋ น์–ด๋Š” ํฌ๋“œ apigee-cassandra-default-0์— ๋ฐ”์ธ๋”ฉ๋œ PVC๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
    kubectl apigee describe pvc cassandra-data-apigee-cassandra-default-0
    
    Events:
      Type     Reason              Age                From                         Message
      ----     ------              ----               ----                         -------
      Warning  ProvisioningFailed  3m (x143 over 5h)  persistentvolume-controller  storageclass.storage.k8s.io "apigee-sc" not found

    ์ด ์˜ˆ์‹œ์—์„œ๋Š” ์ด๋ฆ„์ด apigee-sc์ธ StorageClass๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ StorageClass ๋ณ€๊ฒฝ์— ์„ค๋ช…๋œ ๋Œ€๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ˆ„๋ฝ๋œ StorageClass๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

ํฌ๋“œ ๋””๋ฒ„๊น…๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

Amazon EBS CSI ๋“œ๋ผ์ด๋ฒ„ ๋ˆ„๋ฝ

ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ธ์Šคํ„ด์Šค๊ฐ€ EKS ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ EKS ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ Amazon EBS ์ปจํ…Œ์ด๋„ˆ ์Šคํ† ๋ฆฌ์ง€ ์ธํ„ฐํŽ˜์ด์Šค(CSI) ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Amazon EBS CSI ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ(FAQ)์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Cassandra ํฌ๋“œ๊ฐ€ CrashLoopBackoff ์ƒํƒœ๋กœ ๋ฉˆ์ถฐ ์žˆ์Œ

์ฆ์ƒ

์‹œ์ž‘ํ•˜๋ฉด Cassandra ํฌ๋“œ๊ฐ€ CrashLoopBackoff ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€

kubectl๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋“œ ์ƒํƒœ๋ฅผ ๋ณด๋ฉด ํ•˜๋‚˜ ์ด์ƒ์˜ Cassandra ํฌ๋“œ๊ฐ€ CrashLoopBackoff ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด ์ƒํƒœ๋Š” Kubernetes๊ฐ€ ํฌ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

kubectl get pods -n NAMESPACE

NAME                                     READY   STATUS            RESTARTS   AGE
adah-resources-install-4762w             0/4     Completed         0          10m
apigee-cassandra-default-0               0/1     CrashLoopBackoff  0          10m
...

๊ฐ€๋Šฅํ•œ ์›์ธ

ํฌ๋“œ๊ฐ€ CrashLoopBackoff ์ƒํƒœ๋กœ ๋ฉˆ์ถฐ ์žˆ๋Š” ์ด์œ ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์›์ธ ์„ค๋ช…
๋ฐ์ดํ„ฐ ์„ผํ„ฐ๊ฐ€ ์ด์ „ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์™€ ๋‹ค๋ฆ„ ์ด ์˜ค๋ฅ˜๋Š” ์ด์ „ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์˜๊ตฌ ๋ณผ๋ฅจ์ด Cassandra ํฌ๋“œ์— ์žˆ์œผ๋ฉฐ ์ƒˆ ํฌ๋“œ๊ฐ€ ์ด์ „ ํด๋Ÿฌ์Šคํ„ฐ์— ์กฐ์ธํ•  ์ˆ˜ ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜„์ƒ์€ ๋ณดํ†ต ๋น„ํ™œ์„ฑ ์˜๊ตฌ ๋ณผ๋ฅจ์ด ๋™์ผํ•œ Kubernetes ๋…ธ๋“œ์— ์žˆ๋Š” ์ด์ „ Cassandra ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ง€์†๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Cassandra๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Kubernetes ์—…๊ทธ๋ ˆ์ด๋“œ Kubernetes ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” Cassandra ํด๋Ÿฌ์Šคํ„ฐ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Cassandra ํฌ๋“œ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” Anthos ์›Œ์ปค ๋…ธ๋“œ๊ฐ€ ์ƒˆ OS ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋˜๋ฉด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง„๋‹จ

Cassandra ์˜ค๋ฅ˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ฌธ์ œ์˜ ์›์ธ์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.

  1. ํฌ๋“œ๋ฅผ ๋‚˜์—ดํ•˜์—ฌ ์‹คํŒจํ•œ Cassandra ํฌ๋“œ์˜ ID๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    kubectl get pods -n NAMESPACE
  2. ์‹คํŒจํ•œ ํฌ๋“œ์˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    kubectl logs POD_ID -n NAMESPACE

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

ํฌ๋“œ ๋กœ๊ทธ์—์„œ ๋‹ค์Œ ๋‹จ์„œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์„ผํ„ฐ๊ฐ€ ์ด์ „ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์™€ ๋‹ค๋ฆ„

์ด ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ:

Cannot start node if snitch's data center (us-east1) differs from previous data center
  • ํด๋Ÿฌ์Šคํ„ฐ์— ๋น„ํ™œ์„ฑ ๋˜๋Š” ์ด์ „ PVC๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ ์„ค์น˜ํ•œ ๊ฒฝ์šฐ PVC๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•˜๊ณ  ์„ค์ •์„ ๋‹ค์‹œ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    kubectl -n NAMESPACE get pvc
    kubectl -n NAMESPACE delete pvc cassandra-data-apigee-cassandra-default-0

Anthos ์—…๊ทธ๋ ˆ์ด๋“œ๋กœ ๋ณด์•ˆ ์„ค์ • ๋ณ€๊ฒฝ

Cassandra ๋กœ๊ทธ์—์„œ ์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

/opt/apigee/run.sh: line 68: ulimit: max locked memory:
  cannot modify limit: Operation not permitted

๋””๋ฒ„๊น…์„ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ์ปจํ…Œ์ด๋„ˆ ๋งŒ๋“ค๊ธฐ

์ด ์„น์…˜์—์„œ๋Š” cqlsh์™€ ๊ฐ™์ด Cassandra ๋””๋ฒ„๊น… ์œ ํ‹ธ๋ฆฌํ‹ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” Cassandra ํ…Œ์ด๋ธ”์„ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ  ๋””๋ฒ„๊น… ๋ชฉ์ ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์ปจํ…Œ์ด๋„ˆ ๋งŒ๋“ค๊ธฐ

ํด๋ผ์ด์–ธํŠธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ apigee-cassandra-user-setup ํฌ๋“œ์˜ TLS ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด ์ธ์ฆ์„œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    kubectl get secrets -n apigee --field-selector type=kubernetes.io/tls | grep apigee-cassandra-user-setup | awk '{print $1}'

    ์ด ๋ช…๋ น์–ด๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด apigee-cassandra-user-setup-rg-hybrid-b7d3b9c-tls์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์˜ YAML ํŒŒ์ผ์˜ secretName ํ•„๋“œ์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  2. ์ƒˆ ํŒŒ์ผ์„ ์—ด๊ณ  ๋‹ค์Œ ํฌ๋“œ ์‚ฌ์–‘์„ ์—ฌ๊ธฐ์— ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค.
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
      name: CASSANDRA_CLIENT_NAME   # For example: my-cassandra-client
      namespace: apigee
    spec:
      containers:
      - name: CASSANDRA_CLIENT_NAME
        image: "gcr.io/apigee-release/hybrid/apigee-hybrid-cassandra-client:YOUR_APIGEE_HYBRID_VERSION" # For example, 1.10.5.
        imagePullPolicy: Always
        command:
        - sleep
        - "3600"
        env:
        - name: CASSANDRA_SEEDS
          value: apigee-cassandra-default.apigee.svc.cluster.local
        - name: APIGEE_DML_USER
          valueFrom:
            secretKeyRef:
              key: dml.user
              name: apigee-datastore-default-creds
        - name: APIGEE_DML_PASSWORD
          valueFrom:
            secretKeyRef:
              key: dml.password
              name: apigee-datastore-default-creds
        volumeMounts:
        - mountPath: /opt/apigee/ssl
          name: tls-volume
          readOnly: true
      volumes:
      - name: tls-volume
        secret:
          defaultMode: 420
          secretName: YOUR_SECRET_NAME    # For example: apigee-cassandra-user-setup-rg-hybrid-b7d3b9c-tls
      restartPolicy: Never
  3. .yaml ํ™•์žฅ์œผ๋กœ ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด my-spec.yaml์ž…๋‹ˆ๋‹ค.
  4. ํด๋Ÿฌ์Šคํ„ฐ์— ์‚ฌ์–‘์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
    kubectl apply -f YOUR_SPEC_FILE.yaml -n apigee
  5. ์ปจํ…Œ์ด๋„ˆ์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
    kubectl exec -n apigee CASSANDRA_CLIENT_NAME -it -- bash
  6. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cassandra cqlsh ์ธํ„ฐํŽ˜์ด์Šค์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์–ด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •ํ™•ํ•˜๊ฒŒ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    cqlsh ${CASSANDRA_SEEDS} -u ${APIGEE_DML_USER} -p ${APIGEE_DML_PASSWORD} --ssl

ํด๋ผ์ด์–ธํŠธ ํฌ๋“œ ์‚ญ์ œ

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cassandra ํด๋ผ์ด์–ธํŠธ ํฌ๋“œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

kubectl delete pods -n apigee cassandra-client

์ž˜๋ชป ๊ตฌ์„ฑ๋œ ๋ฆฌ์ „ ํ™•์žฅ: ๋ฐ์ดํ„ฐ ์„ผํ„ฐ ํ•˜๋‚˜์— ์žˆ๋Š” ๋ชจ๋“  Cassandra ๋…ธ๋“œ

์ด ์ƒํ™ฉ์€ GKE ๋ฐ GKE On-Prem(Anthos) ํ”Œ๋žซํผ์˜ ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ํ™•์žฅ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์— ๋ชจ๋“  Cassandra ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ๋งˆ์„ธ์š”.

์ฆ์ƒ

๋‘ ๋ฒˆ์งธ ๋ฆฌ์ „์˜ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์—์„œ Cassandra ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€

failed to rebuild from dc-1: java.lang.RuntimeException : Error while rebuilding node: Stream failed

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ž˜๋ชป ๊ตฌ์„ฑ๋œ ๋ฆฌ์ „ ํ™•์žฅ์„ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์˜ overrides.yaml ํŒŒ์ผ์—์„œ Cassandra replicaCount๋ฅผ 1๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    cassandra:
      . . .
      replicaCount: 1

    Helm์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    helm upgrade datastore apigee-datastore \
    --namespace APIGEE_NAMESPACE \
    --atomic \
    -f 2ND_DATACENTER_OVERRIDES_FILE \
    --dry-run=server

    ์ž‘์—…์ด ์‹คํŒจ ์‹œ ๋กค๋ฐฑ๋˜๋„๋ก --atomic์„ ๋น„๋กฏํ•˜์—ฌ ํ‘œ์‹œ๋œ ๋ชจ๋“  ์„ค์ •์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐจํŠธ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    helm upgrade datastore apigee-datastore \
    --namespace APIGEE_NAMESPACE \
    --atomic \
    -f 2ND_DATACENTER_OVERRIDES_FILE
  2. kubectl exec๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ๋‚˜๋จธ์ง€ Cassandra ํฌ๋“œ์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.
    kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
  3. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜๋จธ์ง€ Cassandra ํฌ๋“œ๋ฅผ ์‚ฌ์šฉ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.
    nodetool -u CASSANDRA_DB_USER -pw CASSANDRA_DB_PASSWORD decommission
  4. Helm์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์—์„œ Cassandra ํฌ๋“œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    helm uninstall datastore -n APIGEE_NAMESPACE
  5. Kubernetes ์ปจํ…์ŠคํŠธ๋ฅผ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์˜ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
    kubectl config use-context FIRST_DATACENTER_CLUSTER
  6. ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์— ์ž‘๋™ ์ค‘์ง€ ์ƒํƒœ์˜ Cassandra ๋…ธ๋“œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    nodetool -u CASSANDRA_DB_USER -pw CASSANDRA_DB_PASSWORD status
  7. ์ž˜๋ชป ๊ตฌ์„ฑ๋œ Cassandra ๋…ธ๋“œ(๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์šฉ)๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์—์„œ ์‚ญ์ œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. nodetool ์ƒํƒœ ์ถœ๋ ฅ์— ํ‘œ์‹œ๋œ IP ์ฃผ์†Œ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์šฉ Cassandra ํฌ๋“œ์˜ IP ์ฃผ์†Œ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ถœ๋ ฅ์—์„œ IP ์ฃผ์†Œ 10.100.0.39๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์˜ ํฌ๋“œ์— ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
    nodetool -u CASSANDRA_DB_USER -pw CASSANDRA_DB_PASSWORD status
    
      Datacenter: dc-1
      ================
      Status=U/D (Up/Down) | State=N/L/J/M (Normal/Leaving/Joining/Moving)
      --  Address      Load      Tokens  Owns (effective)  Host ID                               Rack
      UN  10.100.0.39  4.21 MiB  256     100.0%            a0b1c2d3-e4f5-6a7b-8c9d-0e1f2a3b4c5d  ra-1
  8. ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์˜ overrides.yaml ํŒŒ์ผ์— cassandra ์„น์…˜ ์•„๋ž˜์˜ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ ์ด๋ฆ„ ์„ค์ •์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    cassandra:
      datacenter: DATA_CENTER_2
      rack: "RACK_NAME" # "ra-1" is the default value.
      . . .
  9. ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์˜ overrides.yaml ํŒŒ์ผ์—์„œ cassandra:replicaCount ์„ค์ •์„ ์›ํ•˜๋Š” ์ˆซ์ž๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    cassandra:
      datacenter: DATA_CENTER_2
      . . .
      replicaCount: 3
  10. datastore ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์— overrides.yaml ํŒŒ์ผ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    helm upgrade datastore apigee-datastore \
    --namespace APIGEE_NAMESPACE \
    --atomic \
    -f 2ND_DATACENTER_OVERRIDES_FILE \
    --dry-run=server

    ์ž‘์—…์ด ์‹คํŒจ ์‹œ ๋กค๋ฐฑ๋˜๋„๋ก --atomic์„ ๋น„๋กฏํ•˜์—ฌ ํ‘œ์‹œ๋œ ๋ชจ๋“  ์„ค์ •์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐจํŠธ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    helm upgrade datastore apigee-datastore \
    --namespace APIGEE_NAMESPACE \
    --atomic \
    -f 2ND_DATACENTER_OVERRIDES_FILE
  11. kubectl exec๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์˜ ์ƒˆ Cassandra ํฌ๋“œ ์ค‘ ํ•˜๋‚˜์— ์•ก์„ธ์Šคํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์„ผํ„ฐ 2๊ฐœ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
     "nodetool -u CASSANDRA_DB_USER -pw CASSANDRA_DB_PASSWORD status"

์•Œ๋ ค์ง„ ๋ฌธ์ œ 388608440์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์ด ์„น์…˜์—์„œ๋Š” ์„ค์น˜๊ฐ€ ์•Œ๋ ค์ง„ ๋ฌธ์ œ์ธ 388608440์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ง„๋‹จ

์ด ์•Œ๋ ค์ง„ ๋ฌธ์ œ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl -n APIGEE_NAMESPACE get pods -l app=apigee-cassandra -o name | \
  xargs -i -P0 kubectl -n APIGEE_NAMESPACE -c apigee-cassandra exec {} -- \
  bash -c 'echo "{}: Found $(nodetool -u cassandra -pw $CASS_PASSWORD listsnapshots | grep -c compaction_history) leftover snapshots"'

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

kubectl -n apigee get pods -l app=apigee-cassandra -o name | xargs -i -P0 kubectl -n apigee -c apigee-cassandra exec {} -- bash -c 'echo "{}: Found $(nodetool -u cassandra -pw $CASS_PASSWORD listsnapshots | grep -c compaction_history) leftover snapshots"'
pod/apigee-cassandra-default-0: Found 0 leftover snapshots
pod/apigee-cassandra-default-1: Found 0 leftover snapshots
pod/apigee-cassandra-default-2: Found 0 leftover snapshots
    

Cassandra ํฌ๋“œ์—์„œ ๋‚จ์€ ์Šค๋ƒ…์ƒท ์ˆ˜๊ฐ€ 0๋ณด๋‹ค ํฌ๋ฉด ์„ค์น˜๊ฐ€ ์ด ๋ฌธ์ œ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์•„๋ž˜ ๋‹จ๊ณ„์— ๋”ฐ๋ผ ์‚ฌ์šฉ ์ค‘์ธ ๋ฐฑ์—… ์œ ํ˜•๊ณผ Apigee Hybrid ๋งˆ์ด๋„ˆ ๋ฒ„์ „์„ ์„ ํƒํ•˜์„ธ์š”.

Cloud Storage ๋ฐฑ์—…

  1. Cloud Storage ๋ฐฑ์—…์— ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋˜์ง€๋งŒ ์ด์— ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์ž˜๋ชป๋œ Google ์„œ๋น„์Šค ๊ณ„์ •์ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • cassandra.backup.dbStorageBucket์— ์ž˜๋ชป๋œ Cloud Storage ๋ฒ„ํ‚ท ์ด๋ฆ„์ด ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด Google API์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(cassandra.backup.httpproxy๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ).

    ์„ค์ •์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณ„์† ์ง„ํ–‰ํ•˜๊ธฐ ์ „์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์„ธ์š”.

  2. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚จ์€ ์Šค๋ƒ…์ƒท์„ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    Apigee Hybrid 1.12

    kubectl -n APIGEE_NAMESPACE get pods -l app=apigee-cassandra -o name | xargs -i -P0 kubectl -n APIGEE_NAMESPACE -c apigee-cassandra exec {} -- bash -c 'echo "{}: $(nodetool -u cassandra -pw $CASS_PASSWORD clearsnapshot --all)"'

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    kubectl -n apigee get pods -l app=apigee-cassandra -o name | xargs -i -P0 kubectl -n apigee -c apigee-cassandra exec {} -- bash -c 'echo "{}: $(nodetool -u cassandra -pw $CASS_PASSWORD clearsnapshot --all)"'

    Apigee Hybrid 1.11

    kubectl -n APIGEE_NAMESPACE get pods -l app=apigee-cassandra -o name | xargs -i -P0 kubectl -n APIGEE_NAMESPACE -c apigee-cassandra exec {} -- bash -c 'echo "{}: $(nodetool -u cassandra -pw $CASS_PASSWORD clearsnapshot)"'

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    kubectl -n apigee get pods -l app=apigee-cassandra -o name | xargs -i -P0 kubectl -n apigee -c apigee-cassandra exec {} -- bash -c 'echo "{}: $(nodetool -u cassandra -pw $CASS_PASSWORD clearsnapshot)"'
    pod/apigee-cassandra-default-1: Requested clearing snapshot(s) for [all keyspaces] with [all snapshots]
    pod/apigee-cassandra-default-2: Requested clearing snapshot(s) for [all keyspaces] with [all snapshots]
    pod/apigee-cassandra-default-0: Requested clearing snapshot(s) for [all keyspaces] with [all snapshots]
                
  3. ์ˆ˜๋™ ๋ฐฑ์—… ์ž‘์—…์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ณ  ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  4. ์ˆ˜๋™ ๋ฐฑ์—… ์ž‘์—…์œผ๋กœ ๋งŒ๋“  ๋ฐฑ์—… ๋ณด๊ด€ ํŒŒ์ผ์ด overrides.yaml ํŒŒ์ผ์— ์ง€์ •ํ•œ cassandra.backup.dbStorageBucket Cloud Storage ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  5. ์•ž์˜ ์ง„๋‹จ ์„น์…˜์— ๋‚˜์˜จ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  Cassandra ํฌ๋“œ์˜ ๋‚จ์€ ์Šค๋ƒ…์ƒท ์ˆ˜๊ฐ€ 0์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์›๊ฒฉ ์„œ๋ฒ„ ๋ฐฑ์—…

  1. ์›๊ฒฉ ๋ฐฑ์—… ์„œ๋ฒ„๊ฐ€ ์ •์ƒ ์ƒํƒœ์ด๊ณ  Cassandra ํฌ๋“œ์—์„œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. SSH ์—ฐ๊ฒฐ์„ ํ™•์ธํ•˜๋Š” ๋‹จ๊ณ„๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”. ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋˜์ง€๋งŒ ์ด์— ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๋„คํŠธ์›Œํฌ ๋ฐฉํ™”๋ฒฝ์ด ์—ฐ๊ฒฐ์„ ์ฐจ๋‹จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • SSH ํ‚ค๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
    • ์›๊ฒฉ ๋ฐฑ์—… ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ์›๊ฒฉ ๋ฐฑ์—… ์„œ๋ฒ„์˜ ์—ฌ์œ  ์ €์žฅ์šฉ๋Ÿ‰์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

    ์›๊ฒฉ ๋ฐฑ์—… ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณ„์† ์ง„ํ–‰ํ•˜๊ธฐ ์ „์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์„ธ์š”.

  2. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚จ์€ ์Šค๋ƒ…์ƒท์„ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    Apigee Hybrid 1.12

    kubectl -n APIGEE_NAMESPACE get pods -l app=apigee-cassandra -o name | xargs -i -P0 kubectl -n APIGEE_NAMESPACE -c apigee-cassandra exec {} -- bash -c 'echo "{}: $(nodetool -u cassandra -pw $CASS_PASSWORD clearsnapshot --all)"'

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    kubectl -n apigee get pods -l app=apigee-cassandra -o name | xargs -i -P0 kubectl -n apigee -c apigee-cassandra exec {} -- bash -c 'echo "{}: $(nodetool -u cassandra -pw $CASS_PASSWORD clearsnapshot --all)"'

    Apigee Hybrid 1.11

    kubectl -n APIGEE_NAMESPACE get pods -l app=apigee-cassandra -o name | xargs -i -P0 kubectl -n APIGEE_NAMESPACE -c apigee-cassandra exec {} -- bash -c 'echo "{}: $(nodetool -u cassandra -pw $CASS_PASSWORD clearsnapshot)"'

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    kubectl -n apigee get pods -l app=apigee-cassandra -o name | xargs -i -P0 kubectl -n apigee -c apigee-cassandra exec {} -- bash -c 'echo "{}: $(nodetool -u cassandra -pw $CASS_PASSWORD clearsnapshot)"'
    pod/apigee-cassandra-default-1: Requested clearing snapshot(s) for [all keyspaces] with [all snapshots]
    pod/apigee-cassandra-default-2: Requested clearing snapshot(s) for [all keyspaces] with [all snapshots]
    pod/apigee-cassandra-default-0: Requested clearing snapshot(s) for [all keyspaces] with [all snapshots]
                
  3. ์ˆ˜๋™ ๋ฐฑ์—… ์ž‘์—…์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ณ  ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  4. ์ˆ˜๋™ ๋ฐฑ์—… ์ž‘์—…์œผ๋กœ ์ƒ์„ฑ๋œ ๋ฐฑ์—… ๋ณด๊ด€ ํŒŒ์ผ์ด ์›๊ฒฉ ๋ฐฑ์—… ์„œ๋ฒ„์— ์—…๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  5. ์•ž์˜ ์ง„๋‹จ ์„น์…˜์— ๋‚˜์˜จ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  Cassandra ํฌ๋“œ์˜ ๋‚จ์€ ์Šค๋ƒ…์ƒท ์ˆ˜๊ฐ€ 0์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

Apigee X ๋ฐ Apigee Hybrid ํ”Œ๋ ˆ์ด๋ถ ์†Œ๊ฐœ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.