증상
Apigee Hybrid를 설치하거나 업그레이드하는 동안 Cassandra 포드가 CrashLoopBackOff
상태가 될 수 있습니다.
오류 메시지
apigee
네임스페이스에서 실행할 때 kubectl get pods
출력에 하나 이상의 Cassandra 포드가 CrashLoopBackOff
상태로 표시됩니다.
kubectl get pods -n apigee
NAME READY STATUS RESTARTS AGE
apigee-cassandra-default-0 0/1 CrashLoopBackoff 0 9m
가능한 원인
Cassandra 포드는 다양한 이유로 CrashLoopBackOff
상태가 될 수 있습니다.
원인 | 설명 |
---|---|
호스트 이름 확인 실패 | DNS 변환을 위해 발생한 UnknownHostException |
잘못된 이미지 | overrides.yaml 에서 사용된 잘못된 이미지 URL |
확장 문제 | Cassandra 시드 호스트 연결 문제 |
포트 충돌 | 포트 7000 또는 7001이 이미 사용 중임 |
동일한 IP 주소 | 주소가 /10.10.x.x인 노드가 이미 있습니다. |
원인 1: 호스트 이름 확인 실패
클러스터의 DNS 구성 문제로 인해 Cassandra 노드의 호스트 이름 확인이 실패합니다. Cassandra의 포드 로그에 다음과 유사한 로그 항목이 표시될 수 있습니다.
ERROR [main] 2025-01-12 13:23:34,569 CassandraDaemon.java:803 - Local host name unknown: java.net.UnknownHostException: ip-xx-xx-xx-xx.example.com: ip-xx-xx-xx-xx.example.com: Name or service not known
해결 방법
Cassandra 포드가 시작될 예정인 작업자 노드는 클러스터 DNS 서비스를 통해 호스트 이름을 유효한 IP 주소로 확인할 수 있어야 합니다. 이 문제를 해결하려면 모든 작업자 노드에서 다음 명령어를 실행하면 됩니다.
echo -e "\\n127.0.1.1 ${HOSTNAME}" >> "/etc/hosts"
원인 2: 잘못된 이미지
잘못된 Cassandra 이미지가 사용되었습니다.
진단
overrides.yaml
파일을 확인하여 Cassandra에 올바른 이미지가 구성되어 있는지 확인합니다. 다음은 올바른 Cassandra 이미지가 포함된 overrides.yaml
의 샘플 스탠자입니다.
cassandra: image: url: "gcr.io/apigee-release/hybrid/apigee-hybrid-cassandra" tag: "1.15.0" pullPolicy: IfNotPresent
해결 방법
overrides.yaml
파일에서 Cassandra 이미지의 버전과 이름이 정확한지 확인하고 설치 또는 업그레이드 명령어를 다시 시도합니다. apigee-pull-push
스크립트의 목록 옵션을 사용하여 저장소의 모든 이미지를 나열할 수 있습니다. 그런 다음 해당 이미지를 검토하여 의도한 하이브리드 버전의 모든 이미지인지 확인할 수 있습니다.
원인 3: 확장 문제
새 리전으로 확장하는 동안 Cassandra 포드가 시드 노드에 연결되지 않을 수 있습니다.
진단
- Cassandra 포드 로그에 다음 예와 유사한 로그 항목이 표시될 수 있습니다.
INFO [main] 2024-07-28 05:25:15,662 GossipingPropertyFileSnitch.java:68 - Unable to load cassandra-topology.properties; compatibility mode disabled The seed provider lists no seeds. WARN [main] 2024-07-28 05:25:15,703 SimpleSeedProvider.java:60 - Seed provider couldn't lookup host apigee-cassandra-default-0.apigee-cassandra-default.apigee.svc.cluster.local Exception (org.apache.cassandra.exceptions.ConfigurationException) encountered during startup: The seed provider lists no seeds. ERROR [main] 2024-07-28 05:25:15,703 CassandraDaemon.java:803 - Exception encountered during startup: The seed provider lists no seeds. INFO [ScheduledTasks:1] 2024-07-28 05:25:15,833 StorageService.java:136 - Overriding RING_DELAY to 30000ms
- 현재 실패한 노드와 시드 노드 간의 연결을 확인합니다.
- 새 리전의
overrides.yaml
에 구성된 시드 노드를 식별합니다. 시드 노드는overrides.yaml
에서 리전 확장 시 필드 이름multiRegionSeedHost
아래에 구성됩니다.multiRegionSeedHost
을 보여주는overrides.yaml
의 샘플 Cassandra 스탠자cassandra: multiRegionSeedHost: "1.2.X.X" datacenter: "dc-1" rack: "rc-1" hostNetwork: false clusterName: QA
- 디버깅용 클라이언트 컨테이너 만들기의 안내에 따라 실패한 Cassandra 포드와 시드 노드 간의 연결을 확인하는 클라이언트 컨테이너를 만듭니다.
- 클라이언트 컨테이너로
ssh
하고 bash 셸이 있으면 telnet을 사용하여 현재 노드에서 시드 노드로의 연결을 포트 7001과 7199를 통해 확인합니다.연결 실패를 보여주는 샘플 텔넷 명령어 및 출력
telnet 10.0.0.0 7001
Trying 10.0.0.0... telnet: Unable to connect to remote host: Connection timed outtelnet 10.0.0.0 7199
Trying 10.0.0.0... telnet: Unable to connect to remote host: Connection timed out
해결 방법
- 클러스터 관리팀과 협력하여 동일한 조직에 속한 모든 클러스터의 Cassandra 노드 간에 네트워크 연결이 있는지 확인합니다.
- 실패한 노드에서 시드 노드로의 트래픽을 차단하는 방화벽 규칙이 없는지 확인합니다.
원인 4: 포트 충돌
포트 충돌
Cassandra가 포트 7000과 7001에서 수신 대기하려고 했지만 ssh와 같은 다른 서비스가 이미 해당 포트에서 수신 대기하고 있었습니다.
진단
Cassandra의 포드 로그에 다음 예와 유사한 항목이 표시될 수 있습니다.
Unable to create ssl socket Fatal configuration error; unable to start server. See log for stacktrace. ERROR [main] 2023-02-27 13:01:54,239 CassandraDaemon.java:803 - Fatal configuration error org.apache.cassandra.exceptions.ConfigurationException: Unable to create ssl socket at org.apache.cassandra.net.MessagingService.getServerSockets(MessagingService.java:701) ~[apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.net.MessagingService.listen(MessagingService.java:681) ~[apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.net.MessagingService.listen(MessagingService.java:665) ~[apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:831) ~[apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.service.StorageService.initServer(StorageService.java:717) ~[apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.service.StorageService.initServer(StorageService.java:666) ~[apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:395) [apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:633) [apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:786) [apache-cassandra-3.11.9.jar:3.11.9] Caused by: java.net.BindException: Address already in use (Bind failed) Caused by: java.net.BindException: Address already in use (Bind failed)
이는 포트가 이미 사용 중임을 나타냅니다.
해결 방법
포트 7000과 7001에서 리슨하는 Cassandra 이외의 서비스를 중지하고 삭제합니다. 이렇게 하면 Cassandra 애플리케이션이 실행될 수 있습니다.
원인 5: 동일한 IP 주소
클러스터에 동일한 IP를 사용하는 이전 Cassandra 포드가 있습니다. 이 상황은 하이브리드를 제거하거나 하이브리드를 재설치한 후에 발생할 수 있습니다.
진단
- Cassandra의
system.log
파일에서 다음 오류를 검토합니다.INFO [HANDSHAKE-/10.106.32.131] 2020-11-30 04:28:51,432 OutboundTcpConnection.java:561 - Handshaking version with /10.10.1.1 Exception (java.lang.RuntimeException) encountered during startup: A node with address /10.10.1.1 already exists, cancelling join. Use cassandra.replace_address if you want to replace this node. java.lang.RuntimeException: A node with address /10.10.1.1 already exists, cancelling join. Use cassandra.replace_address if you want to replace this node. at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:558) at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:804) at org.apache.cassandra.service.StorageService.initServer(StorageService.java:664) at org.apache.cassandra.service.StorageService.initServer(StorageService.java:613) at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:379) at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:602) at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:691) ERROR [main] 2020-11-30 04:28:52,287 CassandraDaemon.java:708 - Exception encountered during startup java.lang.RuntimeException: A node with address /10.10.1.1 already exists, cancelling join. Use cassandra.replace_address if you want to replace this node.
- 여전히 작동 중인 DC에서
nodetool status
명령어의 출력을 검토하여 오류 메시지에 표시된 IP(10.10.1.1)와 동일한 IP가 Cassandra 노드에 표시되는지 확인합니다.샘플 nodetool status 명령어 출력
kubectl exec apigee-cassandra-default-0 -n -- nodetool status Datacenter dc-1 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.10.1.1 649.6 KiB 256 100.0% 4d96eaf5-7e75-4aeb-bc47-9e45fdb4b533 ra-1 UN 10.10.1.2 885.2 KiB 256 100.0% 261a15dd-1b51-4918-a63b-551a64e74a5e ra-1 UN 10.10.1.3 693.74 KiB 256 100.0% 91e22ba4-fa53-4340-adaf-db32430bdda9 ra-1
해결 방법
nodetool remove
명령어를 사용하여 이전 Cassandra 노드를 삭제합니다.nodetool removenode HOST_ID
호스트 ID는 nodetool status의 출력에서 확인할 수 있습니다. 예를 들어 이전 샘플 nodetool 상태 출력의
4d96eaf5-7e75-4aeb-bc47-9e45fdb4b533
입니다.- 이전 Cassandra 노드가 삭제되면 Hybrid 설치를 다시 시도합니다.
진단 정보 수집 필요
위 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집한 후 Google Cloud Customer Care에 문의하세요.
- Google Cloud 프로젝트 ID
- Apigee Hybrid 조직
- 민감한 정보를 마스킹하는 소스 및 새 리전의
overrides.yaml
파일 - Apigee Hybrid 수집 필요의 명령어 출력