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

Apigee 및 Apigee 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-runtime 및 apigee-mart 포드에 활성 프로브 기능이 추가되었습니다. 모든 Cassandra 포드를 사용할 수 없게 되면 apigee-runtime 및 apigee-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. Helm을 사용하여 위의 구성을 적용합니다.

    테스트 실행을 수행합니다.

      helm upgrade datastore apigee-datastore/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      -f OVERRIDES_FILE \
      --dry-run
    

    Helm 차트 설치

      helm upgrade datastore apigee-datastore/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      -f OVERRIDES_FILE
    
  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
    

진단 정보 수집 필요

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

  1. Google Cloud 프로젝트 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/*
    

참조