-
"아니 왜! 쿠버네티스의 특정 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) 되었습니다.
그래서 배포될때 해당 노드에서 파드가 뜨면 바로 삭제하고 다른 노드에서 뜨니까 배포가 성공적으로 이루어졌습니다.
정리하자면 이렇습니다.
- 배포를 진행하는데 배포가 잘될 때도 있고 안될 때도 있음.
- 확인해보니까 특정 node에서 뜨는 Pod만 CrashLoopBackOff 오류 나면서 계속 재시작
- 배포 시 해당 node에서 뜨는 pod 삭제하고 다른 node로 뜨면 배포 잘됨
근데 그렇다고 해당 노드에서 매번 잘 안 뜨는 건 아니고 간헐적으로 파드가 뜨지 않습니다... 근데 이게 잦을 때도 있고 그냥 한 번에 될 때도 있고... 아오😡
근본적으로는 그 특정 노드에서 파드가 뜨지 않는 원인에 대해서 찾아야 하는데, 디버깅하기도 까다로웠고 일단 당장 배포와 서비스 운영을 해야 했기에 임시방편을 사용했습니다.
팀장님께서 추천해주신 방법으로 특정노드에서만 파드를 띄우지 않으면 될 것 같다고 하셨고, nodeAffinity 설정을 찾아보고 테스트 해보라고 하셨습니다.
nodeAffinity는 특정 노드에만 파드를 띄우거나, 반대로 띄우지 않게 하는 설정입니다.
간단하게 설명을 드리자면 특정 노드에 라벨(Label)을 추가하면 그 라벨이 있는 노드에 파드를 배포할지 말지를 결정할 수 있습니다.
위의 경우에는 disktype=ssd라는 라벨이 붙은 노드에 파드를 띄운다(In)라는 의미입니다. 파드를 띄우지 않을 거면 NotIn을 사용하면 됩니다.
개발 클러스터에서 테스트를 진행하고 프로덕션에 적용하여 배포를 진행하였습니다.
다행히 배포는 잘 되었고 임시지만 이렇게 CrashLoopBackOff 이슈를 해결했습니다 ㅋㅋㅋ
근데 nodeAffinity가 저희처럼 노드에 파드가 뜨지 않는 경우때문에 사용하는 게 아닌 뭔가 용도(?) 별로 특정 노드들에 파드를 나눌 때 사용한다고 하네요. 뭐 용도가 어찌 됐건 저희 상황에서는 임시방편이라도 잘 해결된 것 같습니다.
(근본적인 원인은 디버깅을 하거나 운영하면서 다시 찾아봐야 할 것 같은데 디버깅이 쉽지않네요 ㅎㅎ)
쿠버네티스에 대해 잘 몰랐는데 그래도 이번 이슈를 통해 Kubectl도 많이 써보고, 새로운 정보들도 많이 알게 되었습니다.
그럼 오늘도 즐거운 코딩 하시길 바랍니다!
'💻 프로그래밍 > K8s & Docker' 카테고리의 다른 글
[쿠버네티스] docker 이미지 빌드 부터 helm 배포까지 [2부] (0) 2022.05.17 [쿠버네티스] docker 이미지 빌드 부터 helm 배포까지 [1부] (0) 2022.05.16 local 개발환경 세팅부터 배포까지 - 3부(Fabric) (2) 2019.09.01 local 개발환경 세팅부터 배포까지 - 2부(docker-compose, ssh) (1) 2019.08.14 local 개발환경 세팅부터 배포까지 - 1부(Docker 란?) (0) 2019.08.11