IL-0061 Spotify · 2019-05-22 (게시일)kubernetesgcp
Spotify 는 상태 없는 백엔드 서비스를 GKE 로 옮기는 중이었다. 미국, 유럽, 아시아에 운영 클러스터를 하나씩 두고 매시간 백업했다. 2018년 11월 한 엔지니어가 브라우저 탭을 잘못 골라 50노드 운영 클러스터를 지운 일이 있었다. 팀은 같은 실수를 막으려고 Terraform 으로 클러스터를 코드로 관리하기 시작했다. 이 사례는 그 도입 과정에서 일어났다.
클러스터 설정은 클러스터 사용자와 운영 팀이 함께 쓰는 git 저장소에 있었다. 팀은 Terraform 이 상태 파일을 보고 할 일을 정한다는 점을 잘 알지 못했다. 아시아 클러스터를 상태 파일로 가져오는 PR 의 리뷰 빌드가 운영에 영향을 주는 전역 상태 파일을 바꿨다. 이 PR 은 아직 머지되지 않은 상태였다. 몇 분 뒤 Terraform 을 모르는 클러스터 사용자가 기존 롤 바인딩 파일에 사용자 세 명을 추가하는 PR 을 올렸다. 변경은 무해해 보였지만 그 PR 에는 아시아 클러스터 정의가 없었다. 두 PR 은 순서가 뒤바뀌어 머지됐고, Terraform 은 정의에 없는 아시아 클러스터를 지웠다.
팀은 아시아 클러스터를 정의한 PR 을 머지해 클러스터를 다시 만들려 했다. 전에는 각자 노트북에서 프로젝트 소유자 권한이 있는 개인 GCP 계정으로 Terraform 명령을 돌렸지만, 이제는 서비스 계정으로 돌렸다. 이 계정에 권한이 모자라 생성 스크립트가 중간에 실패했다. 팀이 서비스 계정에 권한을 더 주자 Terraform 이 받는 클러스터 속성이 처음 가져올 때와 달라졌고, Terraform 은 다른 운영 클러스터 하나를 더 지웠다. 이 두 번째 장애는 밤 8시부터 새벽 5시까지 이어졌다.
최종 사용자 영향은 보고되지 않았다. 팀은 쿠버네티스 사용을 베타로 두고 각 서비스가 용량 일부만 쿠버네티스로 옮기도록 권했다. 사내 서비스 디스커버리는 쿠버네티스 서비스가 아니라 파드 IP 를 등록했다. 클러스터가 사라지자 트래픽은 계획대로 쿠버네티스 밖 인스턴스로 넘어갔다. 내부에서는 한 팀이 VM 을 더 만들었다. 운영 팀은 옛 마스터 IP 를 하드코딩한 곳을 모두 고쳤다. kubectl 사용자는 자격 증명을 새로 받아야 했다.
Terraform 이 아시아 운영 GKE 클러스터를 지웠다. 사내 서비스 디스커버리가 사라진 클러스터에 닿지 못하자 클러스터 운영 팀이 호출을 받았다.
아시아 클러스터를 정의한 PR 은 아직 머지되지 않은 상태였다. 팀은 그 PR 을 머지하면 클러스터가 다시 생길 것이라고 봤다. 그런데 클러스터 생성 스크립트가 권한이 모자라 중간에 실패했다.
팀이 서비스 계정에 필요한 권한을 주고 다시 돌리자 Terraform 은 클러스터를 처음 가져올 때와 다른 권한으로 GCP API 를 호출했다. 권한에 따라 API 가 보여 주는 클러스터 속성이 달라서 Terraform 에는 클러스터가 바뀐 것으로 보였다. Terraform 은 운영 클러스터 하나를 더 지웠고, 운영 클러스터 세 개 중 두 개가 사라졌다.
사용자 지원 슬랙 채널은 조용했고 사용자 쪽에서 들어온 호출도 없었다. 한 팀은 부하를 받기 위해 쿠버네티스 밖 VM 을 더 만들어야 했다. kubectl 사용자는 다시 만든 클러스터의 새 인증서 때문에 자격 증명을 새로 받아야 했다.
증상 ? 리소스 삭제
원인 ? 설정 변경
사내 서비스 디스커버리가 사라진 클러스터에 닿지 못하자 클러스터 운영 팀이 호출을 받았다.
Terraform 은 상태 파일을 보고 할 일을 정한다. 리뷰 빌드가 운영 상태 파일을 바꾸게 두면 머지 순서 하나로 운영 리소스가 지워질 수 있다. 같은 리소스도 API 를 호출하는 권한에 따라 다른 속성으로 보이므로, 가져올 때와 관리할 때 권한이 다르면 Terraform 이 그 차이를 변경으로 읽는다. 처음부터 실패에 대비하고, 큰 인프라를 서서히 옮기고, 되돌릴 방법을 남겨 둔 덕분에 운영 클러스터 두 개가 사라져도 최종 사용자 영향이 없었다. 복원을 시험해 보지 않은 백업은 백업이 아니다. 실수를 누가 했는지보다 무엇을 배웠고 같은 종류의 실수를 어떻게 막을지가 중요하다.
같은 원인 · 공통 Terraform
같은 원인 · 공통 Terraform
같은 원인 · 공통 Terraform
같은 원인 · 공통 GKE 컨트롤 플레인