IL-0012 Omio · 2020-02-17 (게시일)kubernetesgcp
CPU 한도는 스케줄링 주기마다 쓸 수 있는 시간 쿼터로 적용돼요. 스레드가 많은 컨테이너는 주기의 일부 만에 쿼터를 다 쓰고 나머지 시간 동안 멈춰 있어요. 알려진 커널 버그가 그 스로틀링을 설정값보다 최대 절반까지 더 심하게 만들었어요. 쿠버네티스는 사용량만 보여 주고 스로틀링은 보여 주지 않아서, 파드 안에서 cgroup 통계를 읽기 전까지 멈춤이 보이지 않았어요. 패치된 커널을 배포할 때까지 전 클러스터에서 CPU 한도를 뺐고, 베이스 이미지의 런타임 기본값으로 컨테이너가 노드를 독차지하지 않게 했어요. 오류율과 지연이 바로 떨어졌어요.
여섯 달쯤 애플리케이션이 이유 없이 가끔 멈추거나 헬스 체크에 답하지 않았어요. 서비스 사이 연결이 끊기거나 타임아웃됐고, 중요한 서비스의 오류율과 지연이 있어야 할 수준보다 높았어요.
원인 ? 소프트웨어 결함
멈춤과 헬스 체크 실패를 보고 파드 안에서 cgroup 스로틀링 카운터를 읽었어요. 오류율과 지연 그래프로 확인했어요.
requests 와 limits 는 비슷해 보이지만 구현이 달라요. limit 은 시간 쿼터라서 설정한 코어 수를 다 쓰기 훨씬 전에 멀티스레드 컨테이너를 멈출 수 있어요. 한도를 빼면 시끄러운 컨테이너를 막는 보호를 잃으니 런타임을 조정한 뒤에만 안전해요.
–