ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Pod Status에 Error log만 찍기
    K8S 2022. 8. 8. 00:23

    틀린 내용이 있을 수도 있습니다! 

    틀린 내용이 있다면 댓글로 달아주시면 감사하겠습니다!

     

    operator를 만들던 중, pod에서 발생한 error log 값을 추출해야 했는데 이 내용을 포스팅으로 남겨놓는다.

     

    pod status 하위에는 container가 어떻게 종료되었는지에 대한 명세가 적혀 있다.

    containerStatuses.state.terminated 하위 값에 stdout, stderr에 따른 결과가 적혀 있는데,

    특별한 설정을 하지 않는다면 다음과 같이 자세하게 나오지 않는다.  

    status:
      conditions:
      	~~
        state:
          terminated:
            containerID: docker://dd42590ac0d1d05c8675fafb3f1c32cb7256d74a6ab5bf96ec3928c4ca809c1e
            exitCode: 0
            finishedAt: "2022-08-05T08:22:18Z"
            reason: Completed
            startedAt: "2022-08-05T08:22:18Z"

     

    하지만 나의 경우에는 Pod가 fail 되었을 때, 구체적인 error message를 parsing 하고 싶었다.

    그래서 좀 알아본 결과, 아웃풋을 /dev/termination-log로 리다이렉션하면 원하는 아웃풋을 state.terminated 하위에서 확인할 수 있다! 

     

    error 로그만 출력하기 위해, 다음과 같이 stderr만 리다이렉션하였다.

    spec:
      containers:
      - image: test:v1.0.0
        name: test
        command: ["/bin/sh", "-c"]
        args:
        - ./test.sh 2> /dev/termination-log; # stderr만 리다이렉션 
        resources: {}
      restartPolicy: Never

     

    위와 같이 설정하면, 다음과 같이 pod에서 error가 발생했을 때 구체적인 error를 파싱 할 수 있다. 

    started: false
          state:
            terminated:
              containerID: docker://f43838249224c7e057ff90ed0~~
              exitCode: 1
              finishedAt: "2022-08-05T03:51:36Z" # 구체적인 error log를 확인할 수 있음 
              message: "... [id=fs-0525b368f6~~]\e[0m\n\e[0m\e[1mmodule.aws-vpc.aws_eip.cluster-nat-eip[1]:
                Refreshing state... [id=eipalloc-06f69b1c7f4~~]\e[0m\n\e[0m\e[1maws_efs_backup_policy.policy:
                Refreshing state... [id=fs-0525b368f61af~~]\e[0m\n\e[0m\e[1mmodule.aws-iam.aws_iam_instance_profile.kube_control_plane:
                Refreshing state... [id=kube_sjsj_master_profile]\e[0m\n\e[0m\e[1mmodule.aws-iam.aws_iam_role_policy.kube_control_plane:

     

    참고로 pod 실행 시, error가 발생해도 가장 마지막 command의 exitCode가 0이라면 이는 pod error가 아닌 Completed로 인정된다. 

    예를 들어, 다음과 같은 경우, Error가 아닌 completed로 인정된다. 

    spec:
      containers:
      - image: test:v1.0.0
        name: test
        command: ["/bin/sh", "-c"]
        args:
        - ech fail; # Error가 발생하는 경우 
          echo success; # exit code가 0인 경우(정상) 
        resources: {}
      restartPolicy: Never

     

    아 그리고 또 커맨드 하나가 아닌 여러 커맨드를 사용하고 싶다면 위와 같이 command(/bin/sh -c) 지정 후,

    args에 사용할 여러 커맨드를 세미콜론(;)으로 지정하여 사용하면 된다. 

    반응형

    댓글

Designed by Tistory.