ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • "아니 왜! 쿠버네티스의 특정 Node에서만 배포가 실패 하는거야?"를 임시로 해결해본 썰 (feat. CrashLoopBackOff)
    💻 프로그래밍/K8s & Docker 2022. 4. 8. 23:48

    안녕하세요! 개발자 Jay입니다~

    저희 회사에서는 대부분의 서비스들 쿠버 네티스(kubernetes)로 운영고 있습니다.

     

    저는 쿠버네티스에 대해 잘은 모르고 서비스 배포하고 스크립트 돌리거나 할 때 파드(Pod)에 접근해서 특정 컨테이너에 배포되어있는 앱의 스크립트를 실행시키던지? 로그를 보거나, 파드가 잘 뜨고 있나~ 보는 정도의 수준으로만 알 고 있었습니다ㅋㅋ

     

    그러다 최근에 피쳐(feautre) 개발을 끝내고 서비스를 배포하고 있는데 배포가 계속 실패하는 상황에 직면하였습니다. 가뜩이나 쿠버네티스에 대해 잘 모르는 상황이라 배포가 계속 실패 될 수록 💩줄이 탔습니다.

     

    아...배포 선넘네...

     

    다시 배포를 시작하고 파드가 뜨는걸 확인해봤습니다. 보니까 특정 노드에서 파드가 restart를 하면서 CrashLoopBackOff 상태를 반복하였습니다.

     

    찾아보니까 CrashLoopBackOff는 파드가 뜨는게 실패, 재시작 반복일 경우 나타는 상태라고 하네요.  해당 상태가 되는 경우는 

    • Errors when deploying Kubernetes (배포 시 에러)
    • Missing dependencies (디펜던시 누락)
    • Changes caused by recent updates (최근 업데이트 변경으로 인한 이유?)

    등의 이유가 있다고 하네요.

     

    여튼 관련된 이슈에 대해 폭풍 구글링을 하다가 저희 팀이 다 같이 한번 보기로 했습니다. 보다 보니까 이상한 게 파드가 3개가 기본적으로 떠야 하는데, 첫 번째 파드에서 오류가 나는 경우도 있고, 두 번째 파드에서 오류가 나는 경우도 있었습니다.

     

    자~세히 보니 특정 노드에서만 파드가 뜨지 않고 CrashLoopBackOff 상태를 반복하다가 결국 롤백(RollBack) 되었습니다.

    그래서 배포될때 해당 노드에서 파드가 뜨면 바로 삭제하고 다른 노드에서 뜨니까 배포가 성공적으로 이루어졌습니다.

     

    정리하자면 이렇습니다.

     

    1. 배포를 진행하는데 배포가 잘될 때도 있고 안될 때도 있음.
    2. 확인해보니까 특정 node에서 뜨는 Pod만 CrashLoopBackOff 오류 나면서 계속 재시작
    3. 배포 시 해당 node에서 뜨는 pod 삭제하고 다른 node로 뜨면 배포 잘됨

    근데 그렇다고 해당 노드에서 매번 잘 안 뜨는 건 아니고 간헐적으로 파드가 뜨지 않습니다... 근데 이게 잦을 때도 있고 그냥 한 번에 될 때도 있고... 아오😡

     

    근본적으로는 그 특정 노드에서 파드가 뜨지 않는 원인에 대해서 찾아야 하는데, 디버깅하기도 까다로웠고 일단 당장 배포와 서비스 운영을 해야 했기에 임시방편을 사용했습니다.

     

    팀장님께서 추천해주신 방법으로 특정노드에서만 파드를 띄우지 않으면 될 것 같다고 하셨고, nodeAffinity 설정을 찾아보고 테스트 해보라고 하셨습니다.

     

    nodeAffinity는 특정 노드에만 파드를 띄우거나, 반대로 띄우지 않게 하는 설정입니다.

    nodeAffinity 설정

    간단하게 설명을 드리자면 특정 노드에 라벨(Label)을 추가하면 그 라벨이 있는 노드에 파드를 배포할지 말지를 결정할 수 있습니다.

    위의 경우에는 disktype=ssd라는 라벨이 붙은 노드에 파드를 띄운다(In)라는 의미입니다. 파드를 띄우지 않을 거면 NotIn을 사용하면 됩니다.

     

    개발 클러스터에서 테스트를 진행하고 프로덕션에 적용하여 배포를 진행하였습니다.

    다행히 배포는 잘 되었고 임시지만 이렇게 CrashLoopBackOff 이슈를 해결했습니다 ㅋㅋㅋ

     

    근데 nodeAffinity가 저희처럼 노드에 파드가 뜨지 않는 경우때문에 사용하는 게 아닌 뭔가 용도(?) 별로 특정 노드들에 파드를 나눌 때 사용한다고 하네요. 뭐 용도가 어찌 됐건 저희 상황에서는 임시방편이라도 잘 해결된 것 같습니다.

    (근본적인 원인은 디버깅을 하거나 운영하면서 다시 찾아봐야 할 것 같은데 디버깅이 쉽지않네요 ㅎㅎ)

     

    쿠버네티스에 대해 잘 몰랐는데 그래도 이번 이슈를 통해 Kubectl도 많이 써보고, 새로운 정보들도 많이 알게 되었습니다.

    그럼 오늘도 즐거운 코딩 하시길 바랍니다!

     

     

    댓글

운동하는 개발자 JAY-JI