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 속성이 업데이트되었지만 변경사항이 적용되지 않았습니다.
|
스토리지 용량 변경
진단
-
kubectl
을 사용하여apigee
데이터 스토어 포드의 현재 상태를 확인합니다.kubectl get apigeeds -n apigee
NAME STATE AGE default releasing 122d
-
override.yaml
파일에 변경사항이 있는지 확인합니다. -
버전 제어 시스템을 사용하여
override.yaml
파일의 이전 버전을 현재 버전과 비교합니다.diff OVERRIDES_BEFORE.yaml OVERRIDES_AFTER.yaml
-
override.yaml
의 diff 출력은 스토리지 용량 크기와 관련된 가능한 문제를 보여줄 수 있습니다. 예를 들면 다음과 같습니다.# Overrides.yaml before: cassandra: storage: capacity: 500Gi # Overrides.yaml after: cassandra: storage: capacity: 100Gi
단계를 건너뛰고 스토리지 용량을 변경한 작업이 있었고, 새
override.yaml
이 직접 적용된 경우 데이터 스토어가 해제 중인 상태가 될 수 있습니다. -
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
-
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 상태를 재설정하여 실행 중인 상태로 되돌릴 수 있습니다.
apigee-controller
를 사용 중지합니다.kubectl -n apigee-system edit deployments and set --enable-controllers=true to --enable-controllers=false
-
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'
-
원본
override.yaml
파일을 다시 적용합니다../apigeectl apply --datastore -f overrides.yaml
-
apigee-controller
를 사용 설정합니다.kubectl -n apigee-system edit deployments and set --enable-controllers=false to --enable-controllers=true
-
데이터 스토어가 다시 시작될 때까지 기다렸다가 다음을 사용하여 검증합니다.
kubectl get apigeeds --namespace apigee
-
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
-
하이브리드 설치의 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)을 설명하여 해당 문제가 생성되지 않는 이유를 확인합니다.
- 클러스터의 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 ...
- 실패한 포드의 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 오류 로그를 확인하여 문제의 원인을 파악합니다.
- 포드를 나열하여 실패한 Cassandra 포드의 ID를 가져옵니다.
kubectl get pods -n NAMESPACE
- 실패한 포드의 로그를 확인합니다.
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
- 하이브리드 인스턴스가 멀티 리전인 경우 영향을 받는 하이브리드 인스턴스를 사용 중단하고 영향을 받는 리전으로 다시 확장합니다.
- 하이브리드 인스턴스가 단일 리전인 경우 하이브리드 인스턴스의 각 Cassandra 포드에서 순차적 재시작을 수행합니다.
디버깅을 위한 클라이언트 컨테이너 만들기
이 섹션에서는 cqlsh
와 같이 Cassandra 디버깅 유틸리티에 액세스할 수 있는 클라이언트 컨테이너를 만드는 방법을 설명합니다. 이러한 유틸리티는 Cassandra 테이블을 쿼리할 수 있고 디버깅 목적에 유용할 수 있습니다.
클라이언트 컨테이너 만들기
클라이언트 컨테이너를 만들려면 다음 단계를 따르세요.
- 컨테이너가
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
필드에서 이를 사용합니다. - 새 파일을 열고 다음 포드 사양을 여기에 붙여넣습니다.
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
.yaml
확장으로 파일을 저장합니다. 예를 들면my-spec.yaml
입니다.- 클러스터에 사양을 적용합니다.
kubectl apply -f YOUR_SPEC_FILE.yaml -n apigee
- 컨테이너에 로그인합니다.
kubectl exec -n apigee CASSANDRA_CLIENT_NAME -it -- bash
- 다음 명령어를 사용하여 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
해결 방법
다음 단계를 수행하여 잘못 구성된 리전 확장을 복구합니다.
- 두 번째 데이터 센터의
overrides.yaml
파일에서 CassandrareplicaCount
를1
로 업데이트합니다. 예를 들면 다음과 같습니다.cassandra: . . . replicaCount: 1
apigeectl apply
로 설정을 적용합니다.$APIGEECTL_HOME/apigeectl apply -f 2ND_DATACENTER_OVERRIDES.yaml
kubectl exec
를 사용하여 다음 명령어로 나머지 Cassandra 포드에 액세스합니다.kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
- 다음 명령어를 사용하여 나머지 Cassandra 포드를 사용 중단합니다.
nodetool -u CASSANDRA_DB_USER -pw CASSANDRA_DB_PASSWORD decommission
apigeectl delete
를--datastore
인수와 함께 사용하여 두 번째 데이터 센터에서 Cassandra 포드를 삭제합니다. 예를 들면 다음과 같습니다.$APIGEECTL_HOME/apigeectl delete -f 2ND_DATACENTER_OVERRIDES.yaml --datastore
- Kubernetes 컨텍스트를 첫 번째 데이터 센터의 클러스터로 변경합니다.
kubectl config use-context FIRST_DATACENTER_CLUSTER
- 첫 번째 데이터 센터에 작동 중지 상태의 Cassandra 노드가 없는지 확인합니다.
nodetool -u CASSANDRA_DB_USER -pw CASSANDRA_DB_PASSWORD status
- 잘못 구성된 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 - 두 번째 데이터 센터의
overrides.yaml
파일에 cassandra 섹션 아래의 데이터 센터 이름 설정이 포함되어 있는지 확인합니다. 예를 들면 다음과 같습니다.cassandra: datacenter: DATA_CENTER_2 rack: "RACK_NAME" # "ra-1" is the default value. . . .
- 두 번째 데이터 센터의
overrides.yaml
파일에서cassandra:replicaCount
설정을 원하는 숫자로 업데이트합니다. 예를 들면 다음과 같습니다.cassandra: datacenter: DATA_CENTER_2 . . . replicaCount: 3
--datastore
인수를 사용하여 두 번째 데이터 센터에overrides.yaml
파일을 적용합니다. 예를 들면 다음과 같습니다.$APIGEECTL_HOME/apigeectl apply -f 2ND_DATACENTER_OVERRIDES.yaml --datastore
kubectl exec
를 사용하여 두 번째 데이터 센터의 새 Cassandra 포드 중 하나에 액세스하고 데이터 센터 2개가 있는지 확인합니다."nodetool -u CASSANDRA_DB_USER -pw CASSANDRA_DB_PASSWORD status"
추가 리소스
Apigee X 및 Apigee Hybrid 플레이북 소개를 참조하세요.