Cassandra 포드가 CrashLoopBackOff 상태임

증상

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 포드가 시드 노드에 연결되지 않을 수 있습니다.

진단

  1. 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
  2. 현재 실패한 노드와 시드 노드 간의 연결을 확인합니다.
  3. 새 리전의 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
  4. 디버깅용 클라이언트 컨테이너 만들기의 안내에 따라 실패한 Cassandra 포드와 시드 노드 간의 연결을 확인하는 클라이언트 컨테이너를 만듭니다.
  5. 클라이언트 컨테이너로 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 out
    telnet 10.0.0.0 7199
    Trying 10.0.0.0...
    telnet: Unable to connect to remote host: Connection timed out

해결 방법

  1. 클러스터 관리팀과 협력하여 동일한 조직에 속한 모든 클러스터의 Cassandra 노드 간에 네트워크 연결이 있는지 확인합니다.
  2. 실패한 노드에서 시드 노드로의 트래픽을 차단하는 방화벽 규칙이 없는지 확인합니다.

원인 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 포드가 있습니다. 이 상황은 하이브리드를 제거하거나 하이브리드를 재설치한 후에 발생할 수 있습니다.

진단

  1. 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.
  2. 여전히 작동 중인 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

해결 방법

  1. nodetool remove 명령어를 사용하여 이전 Cassandra 노드를 삭제합니다.
    nodetool removenode HOST_ID

    호스트 ID는 nodetool status의 출력에서 확인할 수 있습니다. 예를 들어 이전 샘플 nodetool 상태 출력의 4d96eaf5-7e75-4aeb-bc47-9e45fdb4b533입니다.

  2. 이전 Cassandra 노드가 삭제되면 Hybrid 설치를 다시 시도합니다.

진단 정보 수집 필요

위 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집한 후 Google Cloud Customer Care에 문의하세요.

  1. Google Cloud 프로젝트 ID
  2. Apigee Hybrid 조직
  3. 민감한 정보를 마스킹하는 소스 및 새 리전의 overrides.yaml 파일
  4. Apigee Hybrid 수집 필요의 명령어 출력