활성 런타임 포드 없음 경고가 표시되면서 API 프록시 배포 실패

ApigeeApigee Hybrid 문서입니다.
Apigee Edge 문서 보기

증상

Apigee Hybrid UI에서 활성 런타임 포드 없음 경고가 표시되면서 API 프록시 배포가 실패합니다.

오류 메시지

API 프록시 페이지의 ENVIRONMENT: REVISION_NUMBER에서 배포 문제 오류 메시지 옆에 있는 세부정보 대화상자에 활성 런타임 포드 없음 경고가 표시됩니다.

이 문제는 UI의 다른 리소스 페이지에서 다른 오류로 나타날 수 있습니다. 다음은 오류 메시지의 예시입니다.

Hybrid UI 오류 메시지 #1: Datastore 오류

다음과 같이 Hybrid UI의 API 제품 페이지에서 Datastore 오류가 발생할 수 있습니다.

Hybrid UI 오류 메시지 #2: 내부 서버 오류

다음과 같이 UI의 개발자 페이지에서 내부 서버 오류가 발생할 수 있습니다.

kubectl 명령어 결과

kubectl get pods 명령어 결과에서 apiege-mart, apigee-runtime, apigee- synchronizer 포드 상태가 CrashLoopBackOff 로 변경될 수 있습니다.

구성요소 로그 오류 메시지

Apigee Hybrid 출시 버전 1.4.0 이상의 apigee-runtime 포드 로그에서 다음과 같은 활성 프로브 실패 오류가 발생합니다.

{"timestamp":"1621575431454","level":"ERROR","thread":"qtp365724939-205","mdc":{"targetpath":"/v1/pr
obes/live"},"logger":"REST","message":"Error occurred : probe failed Probe cps-datastore-
connectivity-liveliness-probe failed due to com.apigee.probe.model.ProbeFailedException{ code =
cps.common.datastoreConnectionNotHealthy, message = Datastore connection not healthy, associated
contexts =
[]}\n\n\tcom.apigee.probe.ProbeAPI.getResponse(ProbeAPI.java:66)\n\tcom.apigee.probe.ProbeAPI.getLiv
eStatus(ProbeAPI.java:55)\n\tsun.reflect.GeneratedMethodAccessor52.invoke(Unknown
Source)\n\tsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\t
","context":"apigee-service-
logs","severity":"ERROR","class":"com.apigee.rest.framework.container.ExceptionMapper","method":"toR
esponse"}

{"timestamp":"1621575431454","level":"ERROR","thread":"qtp365724939-205","mdc":{"targetpath":"/v1/pr
obes/live"},"logger":"REST","message":"Returning error response : ErrorResponse{errorCode =
probe.ProbeRunError, errorMessage = probe failed Probe cps-datastore-connectivity-liveliness-probe
failed due to com.apigee.probe.model.ProbeFailedException{ code =
cps.common.datastoreConnectionNotHealthy, message = Datastore connection not healthy, associated
contexts = []}}","context":"apigee-service-
logs","severity":"ERROR","class":"com.apigee.rest.framework.container.ExceptionMapper","method":"toR
esponse"}

Apigee Hybrid 출시 버전 1.4.0 이상의 apigee-synchronizer 포드 로그에서 다음과 같은 Cannot build a cluster without contact points 오류가 발생합니다.

{"timestamp":"1621575636434","level":"ERROR","thread":"main","logger":"KERNEL.DEPLOYMENT","message":
"ServiceDeployer.deploy() : Got a life cycle exception while starting service [SyncService, Cannot
build a cluster without contact points] : {}","context":"apigee-service-
logs","exception":"java.lang.IllegalArgumentException: Cannot build a cluster without contact
points\n\tat com.datastax.driver.core.Cluster.checkNotEmpty(Cluster.java:134)\n\tat
com.datastax.driver.core.Cluster.<init>(Cluster.java:127)\n\tat
com.datastax.driver.core.Cluster.buildFrom(Cluster.java:193)\n\tat
com.datastax.driver.core.Cluster$Builder.build(Cluster.java:1350)\n\tat
io.apigee.persistence.PersistenceContext.newCluster(PersistenceContext.java:214)\n\tat
io.apigee.persistence.PersistenceContext.<init>(PersistenceContext.java:48)\n\tat
io.apigee.persistence.ApplicationContext.<init>(ApplicationContext.java:19)\n\tat
io.apigee.runtimeconfig.service.RuntimeConfigServiceImpl.<init>(RuntimeConfigServiceImpl.java:75)
\n\tat
io.apigee.runtimeconfig.service.RuntimeConfigServiceFactory.newInstance(RuntimeConfigServiceFactory.
java:99)\n\tat
io.apigee.common.service.AbstractServiceFactory.initializeService(AbstractServiceFactory.java:301)\n
\tat
...","severity":"ERROR","class":"com.apigee.kernel.service.deployment.ServiceDeployer","method":"sta
rtService"}

Apigee Hybrid 출시 버전 1.4.0 이상의 apigee-mart 포드 로그에서 다음과 같은 활성 프로브 실패 오류가 발생합니다.

{"timestamp":"1621576757592","level":"ERROR","thread":"qtp991916558-144","mdc":{"targetpath":"/v1/pr
obes/live"},"logger":"REST","message":"Error occurred : probe failed Probe cps-datastore-
connectivity-liveliness-probe failed due to com.apigee.probe.model.ProbeFailedException{ code =
cps.common.datastoreConnectionNotHealthy, message = Datastore connection not healthy, associated
contexts =
[]}\n\n\tcom.apigee.probe.ProbeAPI.getResponse(ProbeAPI.java:66)\n\tcom.apigee.probe.ProbeAPI.getLiv
eStatus(ProbeAPI.java:55)\n\tsun.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)\n\tsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\t","conte
xt":"apigee-service-
logs","severity":"ERROR","class":"com.apigee.rest.framework.container.ExceptionMapper","method":"toR
esponse"}

{"timestamp":"1621576757593","level":"ERROR","thread":"qtp991916558-144","mdc":{"targetpath":"/v1/pr
obes/live"},"logger":"REST","message":"Returning error response : ErrorResponse{errorCode =
probe.ProbeRunError, errorMessage = probe failed Probe cps-datastore-connectivity-liveliness-probe
failed due to com.apigee.probe.model.ProbeFailedException{ code =
cps.common.datastoreConnectionNotHealthy, message = Datastore connection not healthy, associated
contexts = []}}","context":"apigee-service-
logs","severity":"ERROR","class":"com.apigee.rest.framework.container.ExceptionMapper","method":"toR
esponse"}

활성 런타임 포드 없음 오류 정보

Apigee Hybrid 1.4.0 출시 버전에서 Cassandra 포드 상태를 확인하도록 apigee-runtimeapigee-mart 포드에 활성 프로브 기능이 추가되었습니다. 모든 Cassandra 포드를 사용할 수 없게 되면 apigee-runtimeapigee-mart 포드의 활성 프로브가 실패합니다. 따라서 apigee-runtime apigee-mart 포드가 CrashLoopBackOff 상태가 되어 No active runtime pods 경고가 표시되면서 API 프록시 배포가 실패합니다. Cassandra 포드를 사용할 수 없으므로 apigee-synchronizer 포드도 CrashLoopBackOff 상태로 전환됩니다.

가능한 원인

이 오류의 가능한 원인은 다음과 같습니다.

원인 설명
Cassandra 포드가 다운됨 Cassandra 포드가 다운되었습니다. 따라서 apigee-runtime 포드는 Cassandra 데이터베이스와 통신할 수 없습니다.
포드 하나만으로 구성된 Cassandra 복제본 Cassandra 포드가 하나만 있으면 단일 장애점이 될 수 있습니다.

원인: Cassandra 포드가 다운됨

API 프록시 배포 프로세스 중에 apigee-runtime 포드는 Cassandra 데이터베이스에 연결하여 API 프록시에 정의된 키-값 맵(KVM) 및 캐시와 같은 리소스를 가져옵니다. 실행 중인 Cassandra 포드가 없으면 apigee-runtime 포드는 Cassandra 데이터베이스에 연결할 수 없습니다. 이로 인해 API 프록시 배포가 실패합니다.

진단

  1. Cassandra 포드를 나열합니다.
    kubectl -n apigee get pods -l app=apigee-cassandra

    샘플 출력 1:

    NAME                         READY   STATUS    RESTARTS   AGE
    apigee-cassandra-default-0   0/1     Pending   0          9m23s

    샘플 출력 2:

    NAME                 READY   STATUS            RESTARTS   AGE
    apigee-cassandra-0   0/1     CrashLoopBackoff  0          10m
  2. 각 Cassandra 포드 상태를 확인합니다. 모든 Cassandra 포드 상태는 Running 상태여야 합니다. Cassandra 포드 상태가 서로 다르면 이 문제가 발생할 수 있습니다. 문제를 해결하려면 다음 단계를 수행합니다.

해결 방법

  1. Cassandra 포드 중 하나라도 Pending 상태이면 Cassandra 포드가 대기 중 상태로 멈춰 있음을 참조하여 문제를 해결합니다.
  2. Cassandra 포드 중 하나라도 CrashLoopBackoff 상태이면 Cassandra 포드가 CrashLoopBackoff 상태로 멈춰 있음을 참조하여 문제를 해결합니다.

    샘플 결과:

    kubectl -n apigee get pods -l app=apigee-runtime
    NAME                                                           READY   STATUS    RESTARTS   AGE
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-2gnch   1/1     Running   13         43m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-42jdv   1/1     Running   13         45m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-l7wq7   1/1     Running   13         43m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-q2thb   1/1     Running   8          38m
    kubectl -n apigee get pods -l app=apigee-mart
    NAME                                                  READY   STATUS    RESTARTS   AGE
    apigee-mart-apigee-hybrid-s-2664b3e-143-u0a5c-rtg69   2/2     Running   8          28m
    kubectl -n apigee get pods -l app=apigee-synchronizer
    NAME                                                              READY   STATUS    RESTARTS   AGE
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zp269nb   2/2     Running   10         29m
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zp2w2jp   2/2     Running   0          4m40s
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zpkfkvq   2/2     Running   0          4m40s
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zpxmzhn   2/2     Running   0          4m40s

원인: 포드 하나만으로 구성된 Cassandra 복제본

Cassandra 복제본 수가 1로 구성된 경우 런타임에 Cassandra 포드 하나만 사용할 수 있습니다. 따라서 특정 기간 동안 Cassandra 포드를 사용할 수 없게 되면 apigee-runtime 포드에서 연결 문제가 발생할 수 있습니다.

진단

  1. Cassandra 스테이트풀(Stateful) 세트를 가져오고 현재 복제본 수를 확인합니다.
    kubectl -n apigee get statefulsets -l app=apigee-cassandra

    샘플 결과:

    NAME                               READY           AGE
    apigee-cassandra-default           1/1             21m
  2. 복제본 수가 1로 구성된 경우 다음 단계를 수행하여 더 큰 숫자로 높입니다.

해결 방법

Apigee Hybrid 비프로덕션 배포에서 Cassandra 복제본 수를 1로 설정할 수 있습니다. Cassandra의 고가용성이 비프로덕션 배포에서 중요한 경우 이 문제를 해결하려면 복제본 수를 3으로 높입니다.

이 문제를 해결하려면 다음 단계를 수행합니다.

  1. overrides.yaml 파일을 업데이트하고 Cassandra 복제본 수를 3으로 설정합니다.
    cassandra:
      replicaCount: 3

    Cassandra 구성 정보는 구성 속성 참조를 확인하세요.

  2. apigeectl CLI를 사용하여 위 구성을 적용합니다.
    cd path/to/hybrid-files
    apigeectl apply -f overrides/overrides.yaml
  3. Cassandra 스테이트풀(Stateful) 세트를 가져오고 현재 복제본 수를 확인합니다.
    kubectl -n get statefulsets -l app=apigee-cassandra

    샘플 결과:

    NAME                              READY         AGE
    apigee-cassandra-default          3/3           27m
  4. Cassandra 포드를 가져오고 현재 인스턴스 수를 확인합니다. 모든 포드가 준비되지 않았으며 Running 상태인 경우 새 Cassandra 포드가 생성되고 활성화될 때까지 기다립니다.
    kubectl -n get pods -l app=apigee-cassandra

    샘플 결과:

    NAME                         READY   STATUS    RESTARTS   AGE
    apigee-cassandra-default-0   1/1     Running   0          29m
    apigee-cassandra-default-1   1/1     Running   0          21m
    apigee-cassandra-default-2   1/1     Running   0          19m

    샘플 결과:

    kubectl -n apigee get pods -l app=apigee-runtime
    NAME                                                           READY   STATUS    RESTARTS   AGE
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-2gnch   1/1     Running   13         43m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-42jdv   1/1     Running   13         45m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-l7wq7   1/1     Running   13         43m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-q2thb   1/1     Running   8          38m
    kubectl -n apigee get pods -l app=apigee-mart
    NAME                                                  READY   STATUS    RESTARTS   AGE
    apigee-mart-apigee-hybrid-s-2664b3e-143-u0a5c-rtg69   2/2     Running   8          28m
    kubectl -n apigee get pods -l app=apigee-synchronizer
    NAME                                                              READY   STATUS    RESTARTS   AGE
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zp269nb   2/2     Running   10         29m
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zp2w2jp   2/2     Running   0          4m40s
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zpkfkvq   2/2     Running   0          4m40s
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zpxmzhn   2/2     Running   0          4m40s

진단 정보 수집 필요

위 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집한 후 Apigee 지원팀에 연락합니다.

  1. Google 클라우드 프로젝트 ID
  2. Apigee Hybrid/Apigee 조직
  3. Apigee Hybrid: overrides.yaml, 민감한 정보 마스킹
  4. 모든 네임스페이스의 Kubernetes 포드 상태:
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
  5. Kubernetes 클러스터 정보 덤프:
    # generate 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/*

참조