최근 Kubernetes를 공부하면서 들었던 CNCG 2020 세션들 중, 박인혜 님의 "Kubernetes Cluster를 실제 프로덕션 환경에 부드럽게 랜딩시키기" 세션을 듣고, 정리한 내용들을 공유합니다.
개인적으로 많은 도움이 되었고, 운영환경에서 쿠버네티스에 애플리케이션을 올릴 때의 Issue & Trouble shooting 방법이 꽤 상세히 정리되어있어, 앞으로도 두고두고 보게될 것 같아 정리하였습니다.
해당 세션 동영상은 https://www.youtube.com/watch?v=Gx0_zXFg0m4&t=155s 에서 확인하실 수 있습니다.
Production에서 발생하는 kubernetes 이슈 ( Most common customer issues) 는 대표적으로 6가지 유형으로 나타날 수 있습니다.
위 여섯가지 이슈들에 대해 발생하는 이유 및 Trouble shooting 방법에 대해 정리해 보겠습니다.
메모리 과부하 이슈의 경우에는 위에 언급된 다른 이슈들 보다는 조금 더 수월하게 해결이 가능합니다.
우선, 메모리 과부하 이슈가 생길때의 증상을 살펴보도록 하겠습니다.
Pod가 요구하는 리소스의 limit의 양이 실제 시스템이 가용할 수 있는 리소스의 양보다 많은 상황이 발생할 수 있습니다.(이를 overCommited 된 상태라 합니다.) Overcommited 상태가 계속될 경우, CPU의 경우에는 request 수준까지 할당 상태를 낮출수 있습니다.(성능 저하를 일어나지만, Pod가 제거되지 않음)
하지만, Memory의 경우 할당된 메모리의 크기를 바로 줄일 수 없기 때문에 우선순위에 따라 운영중인 Pod를 강제종료 시킵니다.
Pod 제거 우선순위
1. request와 limit이 둘다 설정되어있지 않은 pod
2. limit 설정이 되어있지만, request가 설정이 되어있지 않은 경우 / request는 설정이 되어있지만 limit 설정이 되어있지 않은 경우
3. 시스템 pod
pod의 limit이 설정되어 있지만, limit값이 너무 작을 때 Out of Memory Killed(OOMKilled) 가 발생합니다. request와 limit값을 pod 내 어플리케이션 resource 요구량에 맞게 설정하는 것이 이러한 증상을 줄일 수 있는 방법입니다.
이 경우는 쿠버네티스 클러스터 자체가 불안정적이거나, 사용할 수 없는 상태가 되어버립니다.
IO 과부하 이슈(Disk 이슈)는 Memory 과부하 이슈보다는 조금 더 발견하기 어려우며, 복합적인 증상이 나타납니다. IO와 관련한 이슈는 다른 것 보다도 모니터링 툴을 통해 조금 더 쉽게 확인 가능하며, 모니터링 툴을 활용하는 방법이 가장 이상적입니다.
Public Cloud에서 Kubernetes Production 환경을 사용하는 경우에는 IOPS에 대한 확인 및 고려가 굉장히 중요합니다.
Azure의 경우에는 VM에 해당하는 부분과 OS Disk에 해당하는 부분의 IOPS가 각각 존재하며, 선택한 VM의 IOPS와 OS Disk의 IOPS 중 더 작은 값이 Max IOPS입니다. 따라서 VM의 IOPS 뿐만 아니라 OS Disk의 IOPS에 대한 고려도 굉장히 중요합니다.
ex ) VM의 IOPS가 12800 / OS 디스크의 IOPS가 120인 경우, MAX_IOPS의 값은 120이 됨.
1.OS 디스크를 데이터디스크처럼 사용하면 안됩니다. 데이터 디스크는 PV를 붙여서 사용해야합니다.
2.OS 디스크의 사이즈를 충분히 늘려 어플리케이션이 구동할 수 있을 만큼의 max IOPS를 확보해야합니다.
3. ephemeral OS 디스크를 사용함으로써 성능을 높일 수 있습니다.
4. knode를 이용하여 성능을 높일 수 있습니다.( 도커에 대한 mountPath를 data-drive나 ephemeral disk로 변경)
5. 써드파티 로깅시스템이나 모니터링에 대하여 I/O를 많이 사용하는지에 대하여 체크를 해야합니다.
6. OS Disk에 alert를 세팅해주어 이슈가 있을 때 운영자에 알람이 갈 수 있도록 합니다.
SNAT 포트 부족 이슈는 Public cloud를 사용하는 경우 좀 더 발생하기 쉬운 이슈로, 어플리케이션 구동에 직접적인 영향을 끼치지만 바로 원인을 발견하기 어렵기 때문에 클라우드사 모니터링 툴을 활용하여 SNAT의 여유가 충분한지 체크를 계속 해주어야 합니다.
일반적으로 Public cloud에서 Kubernetes를 운영할 때에는 managed 서비스(EKS, AKS, GKE 등)을 사용하는 경우가 많은데, 이런 경우에도 Control plane에 간헐적으로 문제가 발생할 수 있습니다.
Master(Control plane)에 과부하가 생길 경우의 증상으로는 보통 API 서버와 연결 시 "TLS handshake timeout" 현상이 발생하게 됩니다.(API 서버에 문제가 발생하게 됨)
API서버에 너무 높은 QPS hitting이 발생하거나, ETCD에 너무 많은 객체가 들어가서 API 서버에서 응답을 할때의 payload가 너무 커지는 경우, 혹은 컨테이너가 너무 많거나, request나 update가 많을 때에는 Control plane의 API 서버가 OOMkilled가 될 수 있습니다.
Quota에 대한 계획은 kubernetes를 운영환경에서 활용할 때 굉장히 중요합니다. 또한, 요구사항이나 문제 상황에 따라 quota를 바로바로 늘릴 수 있는 환경을 구성해 놓는 것도 역시 중요합니다. 여기서의 리소스란, CPU/Memory 뿐만 아니라 VNET에 해당하는 서브넷 등도 포함합니다.
Quota 부족이 생길 경우의 증상으로는 auto-scaling이나 수동으로 scaling을 할 때 해당 동작이 실패 할 수 있고, pod/node의 업그레이드가 실패 할 수 있습니다. ( rolling upgrade(default)를 하는 경우에는 여유분의 자원이 필요합니다.)
Quota문제의 경우에는 에러메세지에 Quota가 부족하다고 나오기 때문에 좀 더 빠르게 문제를 해결할 수 있습니다.
네트워크 오류가 발생할 경우에는, 네트워크의 문제/변경이 있었는지를 가장 먼저 확인해 주어야하며,
NSG(Network Security Groups)룰이나 Policy가 잘못 설정했거나 변경이 생긴 경우를 확인해 주어야 합니다.
또한, Custom DNS 서버나 vnet의 firewall을 사용할 경우 잘못 설정되어 있는 부분에 대해 확인하고, pod를 생성하거나 operation을 할때 실패현상을 야기시키는 부분이 없는지 체크해 주어야합니다.
감사합니다👍