IL-0109 DFDS · 2023-02-14kubernetesaws
DFDS 의 EKS 클러스터는 2023-02-13 07:30 UTC 정기 노드 롤오버 때 실수로 containerd 를 기본 컨테이너 런타임으로 쓰게 됐다. 다음 날 09:33 UTC, 최종 사용자들이 CloudWatch 로그가 이상하다고 알려 왔고, 팀은 fluentd 를 따라가다 런타임이 docker-shim 이 아니라 containerd 라는 것을 찾았다.
팀은 eks-bootstrap 스크립트의 런타임을 당시 기본값이라고 생각한 docker-shim 으로 되돌리고, 10:29 UTC 에 예정에 없던 노드 롤오버를 시작했다. 런타임 설정이 잘못돼 새 노드는 클러스터에 합류하지 못했다. 10:39 UTC 에 롤오버가 타임아웃으로 실패하면서 새 노드는 좀비로 남았고, ASG 의 desired capacity 도 원래대로 돌아가지 않았다.
10:45 UTC 에 롤오버 없이 EKS 파이프라인을 돌려 dockerd 를 런타임으로 쓰는 새 시작 템플릿을 적용했다. Terraform 은 ASG 의 desired capacity 가 30인 것을 보고 15로 되돌렸다. 고장 난 좀비 노드는 아직 지워지지 않은 상태였고, ASG 의 기본 종료 정책은 가장 오래된 시작 구성이나 시작 템플릿을 쓰는 인스턴스부터 없앤다. 그래서 10:46 UTC 에 정상 노드가 전부 종료됐고, 10:48 UTC 에는 클러스터에 노드가 하나도 없었다.
10:49 UTC 에 노드 롤오버 스크립트로 새 노드를 추가하려 했지만 Docker Hub 타임아웃으로 실패했다. 10:52 UTC 에 다시 시도하자 10:57 UTC 부터 새 노드가 클러스터에 합류하기 시작했고, 11:01 UTC 에 로드밸런서가 새 노드를 정상으로 보고 트래픽을 보냈다. 11:07 UTC 에 Sev 1 티켓이 열렸고 11:59 UTC 에 해결로 닫혔다. 사후 분석은 QA 설정이 운영과 다르고 스테이징 환경이 없었다는 점, QA 시험이 fluentd 로그 수집을 다루지 않았다는 점, 롤오버가 잘못됐을 때 할 일을 적은 문서가 없었다는 점을 기여 요인으로 꼽았다.
2023-02-14 09:33 UTC, 최종 사용자들이 CloudWatch 로그가 제대로 들어오지 않는다고 알려 왔다. 팀은 fluentd 를 조사하다가 컨테이너 런타임이 docker-shim 이 아니라 containerd 로 바뀌어 있다는 것을 찾았다. 전날 07:30 UTC 의 정기 노드 롤오버 때 containerd 가 실수로 기본 런타임으로 설정돼 있었다.
10:29 UTC 에 런타임을 되돌리는 노드 롤오버를 시작했지만 10:39 UTC 에 타임아웃으로 실패했다. 런타임 설정이 잘못돼 새 노드가 클러스터에 합류하지 못했고 좀비 노드로 남았다. 팀은 되돌릴 값을 dockershim 으로 알았지만 실제 값은 dockerd 였다.
10:45 UTC 에 노드 롤오버 없이 EKS 파이프라인을 돌리자 Terraform 이 ASG 의 desired capacity 를 30에서 15로 되돌렸다. 10:46 UTC 에 정상 노드가 모두 종료됐고, 10:48 UTC 에는 클러스터에 노드가 하나도 없었다. 10:49 UTC 에 다시 돌린 노드 롤오버 스크립트는 Docker Hub 타임아웃으로 실패했다.
원인 ? 설정 변경
로그 문제는 최종 사용자들이 CloudWatch 로그가 이상하다고 알려 오면서 드러났다. 노드가 사라진 장애는 사후 분석 기준으로 2분 만에 감지됐다.
상황이 심각해져도 침착해야 한다. 서둘러 고치다 피해를 키우기보다 알려진 정상 설정으로 롤백하는 편이 낫다. 새 워커 노드를 띄우는 일은 cloudinit 스크립트의 어느 단계도 실패하지 않는다는 전제에 크게 기대고 있다.
같은 원인 · 공통 텔레메트리 에이전트, 컨테이너 런타임
같은 원인 · 공통 노드 런치 템플릿, 노드 풀
같은 원인 · 공통 노드 풀, Terraform
같은 원인 · 공통 텔레메트리 에이전트
같은 원인 · 공통 노드 풀
같은 원인 · 공통 노드 풀
같은 원인 · 공통 Terraform
같은 원인 · 공통 Terraform
같은 원인 · 공통 노드 풀