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 스크립트의 목록 옵션을 사용하여 저장소의 모든 이미지를 나열할 수 있습니다. 그런 다음 해당 이미지를 검토하여 이미지가 의도한 Hybrid 버전의 모든 이미지인지 확인할 수 있습니다.

원인 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에 구성된 시드 노드를 식별합니다. 시드 노드는 리전 확장 시 multiRegionSeedHost 필드 이름 아래의 overrides.yaml에 구성됩니다.

    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 포드가 있습니다. 이 상황은 Hybrid를 제거 또는 재설치한 후에 발생할 수 있습니다.

진단

  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 상태 명령어 출력 샘플

    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

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

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

진단 정보 수집 필요

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

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