Spring

SCDF : 포드 시작 실패시 오류 처리

기록만이살길 2021. 3. 4. 09:05
반응형

SCDF : 포드 시작 실패시 오류 처리

1. 질문(문제점):

Spring Batch 작업을위한 새로운 k8s 포드를 스핀 오프하기 위해 SCDF (Spring Cloud Dataflow)를 호출하는 서비스를 개발 중입니다.
Map<String, String> properties = Map.of("testApp.cpu", cpu, "testApp.memory", memory);
LOGGER.info("Create task '{}' with definition '{}'", taskName, taskDefinition);
taskOperations.create(taskName, taskDefinition);

LOGGER.info("Launching task '{}' with properties {} and arguments '{}'", taskName, properties, args);
return taskOperations.launch(taskName, properties, args);
모든 것이 잘 작동합니다. 문제는 존재하지 않는 이미지를 가져올 때마다 (예 : 연결 문제로 인해) 포드가 시작되지 않고 보류중인 작업으로 끝납니다 (아무것도 생성 된 배치 작업 없음).예를 들어,

task_execution

종료 시간이 비어 있는 테이블 (SCDF 테이블)에 작업이 있습니다.

 

그러나

batch_job_execution

테이블에 관련 직업이 없습니다 .

 

포드가 생성되지 않았기 때문에 처음에는 괜찮아 보이며 리소스를 소비하지 않습니다. 그러나 "보류중인 작업"수가 20 개가되면서 다음과 같은 유명한 오류가 있습니다.
Cannot launch task testApp. The maximum concurrent task executions is at its limit [20]
포드 스핀 오프가 실패했음을 감지하는 방법을 찾고 있지만 (따라서 작업을 오류로 표시해야 함) 아무 소용이 없습니다.작업이 새 k8s 포드를 시작할 때 작업 시작이 실패했는지 감지하는 방법이 있습니까?

최신 정보

관련성이 있는지 확실하지 않은 경우 SCDF 1.7.3을 사용하고 있습니다 .RELEASE실패한 포드 설명 :
Name:                 podname-lp2nyowgmm
Namespace:            my-namespace
Priority:             1000
Priority Class Name:  test-cluster-default
Node:                 some-ip.compute.internal/XX.XXX.XXX.XX
Start Time:           Thu, 14 Jan 2021 18:47:52 +0700
Labels:               role=spring-app
                      spring-app-id=podname-lp2nyowgmm
                      spring-deployment-id=podname-lp2nyowgmm
                      task-name=podname
Annotations:          iam.amazonaws.com/role: arn:aws:iam::XXXXXXXXXXXX:role/svc-XXXX-XXX-XX-XXXX-X-XXX-XXX-XXXXXXXXXXXXXXXXXXXX
                      kubernetes.io/psp: eks.privileged
Status:               Pending
IP:                   XX.XXX.XXX.XXX
IPs:
  IP:  XX.XXX.XXX.XXX
Containers:
  podname-lp2nyowgmm:
    Container ID:
    Image:         image_host:XXX/mysystem/myapp:notExist
    Image ID:
    Port:          <none>
    Host Port:     <none>
    Args:
      --spring.datasource.username=postgres
      --spring.cloud.task.name=podname
      --spring.datasource.url=jdbc:postgresql://...
      --spring.datasource.driverClassName=org.postgresql.Driver
      --spring.datasource.password=XXXX
      --fileId=XXXXXXXXXXX
      --spring.application.name=app-name
      --fileName=file_name.csv
      ...
      --spring.cloud.task.executionid=3
    State:          Waiting
      Reason:       ErrImagePull
    Ready:          False
    Restart Count:  0
    Limits:
      cpu:     2
      memory:  8Gi
    Requests:
      cpu:     2
      memory:  8Gi
    Environment:
      ELASTIC_SEARCH_PORT:               80
      ELASTIC_SEARCH_PROTOCOL:           http
      SPRING_RABBITMQ_PORT:              ${RABBITMQ_SERVICE_PORT}
      ELASTIC_SEARCH_URL:                elasticsearch
      SPRING_PROFILES_ACTIVE:            kubernetes
      CLIENT_SECRET:                     ${CLIENT_SECRET}
      SPRING_RABBITMQ_HOST:              ${RABBITMQ_SERVICE_HOST}
      RELEASE_ENV_NAME:                  QA_TEST
      SPRING_CLOUD_APPLICATION_GUID:     ${HOSTNAME}
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-xxxxx(ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  default-token-xxxxx:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-xxxxx
    Optional:    false
QoS Class:       Guaranteed
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason     Age                   From               Message
  ----     ------     ----                  ----               -------
  Normal   Scheduled  3m22s                 default-scheduler  Successfully assigned my-namespace/podname-lp2nyowgmm to some-ip.compute.internal
  Normal   Pulling    103s (x4 over 3m21s)  kubelet            Pulling image "image_host:XXX/mysystem/myapp:notExist"
  Warning  Failed     102s (x4 over 3m19s)  kubelet            Failed to pull image "image_host:XXX/mysystem/myapp:notExist": rpc error: code = Unknown desc = Error response from daemon: manifest for image_host:XXX/mysystem/myapp:notExist not found: manifest unknown: manifest unknown
  Warning  Failed     102s (x4 over 3m19s)  kubelet            Error: ErrImagePull
  Normal   BackOff    88s (x6 over 3m19s)   kubelet            Back-off pulling image "image_host:XXX/mysystem/myapp:notExist"
  Warning  Failed     73s (x7 over 3m19s)   kubelet            Error: ImagePullBackOff

2. 해결방안:

1.7.3은 매우 오래된 릴리스입니다. 2.7을 출시했습니다. 원래 논리는 포드 상태 대신 작업 실행 테이블을 사용했습니다. 사용중인 버전이 해당되는 경우 현재보고있는 내용을 설명합니다. 업그레이드를 강력히 권장합니다.
65628418
반응형