새로 생성한 파드의 컨테이너가 CPU와 메모리 요청을 명시적으로 정의하고 있지 않은 경우에 이를 설정한다. 이는 IntialResoruces라는 어드미션컨트롤러 플러그인에 의해 제공된다.
새로운 파드가 리소스 요청 없이 생성되면 플러그인은 파드의 컨테이너의 과거 리소스 사용량 데이터를 살펴보고 요청값을 적절하게 설정한다.
리소스 요청 값을 지정하지 않고 파드를 배포한 뒤 쿠버네티스에 의존해 컨테이너 리소스 요구사항을 파악할 수도 있다.
이를 통해 쿠버네티스는 효과적으로 파드의 수직적 확장을 수행한다.
이 내용은 공식문서나 레퍼런스가 없음(?)
15.2.2 파드가 실행되는 동안 리소스 요청 수정
실행중인 파드를 수직적으로 확장하는 기능
구글 문서 기준으로 "updateMode"을 조정해서 할수 있는 것으로 보인다.
updateMode 필드 값은 Auto이면 VerticalPodAutoscaler가 Pod 수명 동안 CPU 및 메모리 요청을 업데이트할 수 있다는 의미입니다. 즉, VerticalPodAutoscaler는 Pod를 삭제하고 CPU 및 메모리 요청을 조정한 후에 새 Pod를 시작할 수 있습니다.
15.3 수평적 클러스터 노드 확장
모든 노드가 한계에 도달해 더 이상 파드를 추가할 수 없는 상황에서는 노드가 추가되어야 하는데 이를 쿠버네티스가 제공해준다.
쿠버네티스는 추가적인 노드가 필요한 것을 탐지하면 가능한 빠르게 추가 노드를 클라우드 제공자(provider)에게 요청하는 기능을 가지고 있다.
15.3.1 클러스터 오토스케일러
노드에 리소스가 부족해서 스케줄링할 수 없는 파드를 발견하면 추가 노드를 자동으로 공급한다.
또한 오랜 시간 동안 사용률이 낮으면 노드를 줄인다.
클라우드 인프라스트럭처에 추가 노드 요청
노드를 추가를 수행하기 전에 새로운 노드가 파드를 수용할 수 있는지 확인하는 절차를 거쳐야 한다.
그리고 동일한 크기의 노드들은 그룹으로 묶여야 하고, 클러스터 오토스케일러는 단순히 추가 노드를 달라고 말할 수 없으며, 어떤 그룹의 노드 유형인지 지정해야 한다.
클러스터 오토스케일러는 사용 가능한 노드 그룹을 검사해 노드 유형에서 스케줄링되지 않은 파드를 수용할수 있는지 확인하고, 그 노드 유형 중 하나를 선택해서 노드 그룹을 스케일아웃한다.
새 노드가 시작되면 해당 노드의 kubelet이 API서버에 접속해 노드 리소스를 만들어 노드를 등록한다.
노드 종료
클러스터 오토스케일러는 노드 리소스가 충충분히 활용되고 있지 않을 때 노드 수를 줄여야 한다.
기본 원칙은 특정 노드에서 실행중인 모든 파드의 CPU와 메모리 요청이 50% 미만이면 해당 노드는 필요하지 않은 것으로 간주한다.
클러스터 오토스케일러가 노드에서 실행중인 파드가 다른 노드로 다시 스케줄링될 수 있다는 것을 아는 경우에만 해당 노드를 반환할 수 있다.
해당 노드에서만 실행중인 시스템 파드가 있ㄴ는 경우에는 해당 노드를 종료할 수 없다.
또 관리되지 않는 파드, 로컬 저장소를 가진 파드가 실행되는 경우에도 종료될 수 없다.
노드를 종료할때는 먼저 해당 노드에 스케줄링할 수 없다는 표시를 하고나서 파드를 제거한 뒤 진행된다.(이 과정에서 종료할 노드에 다른 파드가 스케줄링 되면 안되기 떄문에 이런 마킹을 처리한다.
수동으로 노드 금지(cordoning), 배출(draining) 하기
kubectl cordon <node> 명령을 통해 스케줄링할 수 없음을 표시할 수 있다.
kubectl drain <node> 명령을 통해 스케줄링할 수 없음을 표시하고, 노드에서 실행중인 모든 파드를 종료할 수 있다.
kubectl uncordon <node>을 통해 금지 해제를 할수 있다.
15.3.3 클러스터 스케일 다운 동안에 서비스 중단 제한
특정 서비스에서는 최소 개수의 파드가 항상 실행되어야 한다. 이는 쿼럼(quorum) 기반 클러스터 애플리케이션인 경우 특히 그렇다.(합의 알고리즘 등)
쿠버네티스는 이런 문제해결을 위해 스케일 다운 등의 작업을 수행할 경우에도 유지되어야 하는 최소 파드 개수를 지정하는 PodDisruptionBudget 리소스를 제공한다.
# PodDisruptionBudget 생성
kubectl create pdb kubia-pdb --selector=app=kubia --min-available=3
minAvailable 필드에 절대값이 아닌 백분율을 사용할 수도 있다.
maxUnavailable 필드를 이용하면 minAvailable 대신 일정 개수 이상의 파드가 종료되지 않도록 지정할 수도 있다.
15. 파드와 클러스터 노드의 오토스케일링
15.1 수평적 파드 오토스케일링
15.1.1 오토스케일링 프로세스 이해
1) 파드 메트릭 얻기
메트릭 얻는 부분에 대한 추가내용
--horizontal-pod-autoscaler-use-rest-clients=true
인자 옵션을 주고 실행할 수 있으며, 1.9부터 기본으로 동작한다고 한다.2) 필요한 파드수 계산
3) 스케일링된 리소스의 레플리카 수 갱신
전체 오토스케일링 과정 이해
15.1.2 CPU 사용률 기반 스케일링
CPU사용률을 판단하는 기준
CPU 사용량을 기반으로 HorizontalPodAutoscaler 생성
오토스케일링을 위한 deployment 준비
minikube metrics-server 설정
HorizontalPodAutoscaler 생성
최초 오토 리스케일 이벤트 보기
스케일 아웃 일으키기
오토스케일러가 디플로이먼트를 스케일 아웃하는지 확인
watch 내역
hpa event 확인
최대 스케일링 비율 이해
기존 HPA 오브젝트에서 목표 메트릭 값 변경
15.1.3 메모리 소비량에 기반을 둔 스케일링
쿠버네티스 1.8 메모리 기반 오토스케일링
공식 문서
메모리 및 사용자 정의 메트릭에 대한 스케일링 지원을 포함하는 베타 버전은 autoscaling/v2beta2에서 확인할 수 있다.
라고만 공식 document에 나와 있다.블로그(hpa를 사용하지 않고 직접 스크립트를 만들어 처리하는 방법)
google cloud 가이드
autoscaler github
15.1.4 기타 그리고 사용자 정의 메트릭 기반 스케일링
메트릭 유형으로 들어갈 수 있는 항목
리소스 : 리소스 메트릭 기반(CPU 등)
파드
오브젝트
15.1.5 오토스케일링에 적합한 메트릭 결정
15.1.6 레플리카를 0으로 감소
15.2 수직적 파드 오토스케일링
15.2.1 리소스 요청 자동 설정
15.2.2 파드가 실행되는 동안 리소스 요청 수정
15.3 수평적 클러스터 노드 확장
15.3.1 클러스터 오토스케일러
클라우드 인프라스트럭처에 추가 노드 요청
노드 종료
수동으로 노드 금지(cordoning), 배출(draining) 하기
kubectl cordon <node>
명령을 통해 스케줄링할 수 없음을 표시할 수 있다.kubectl drain <node>
명령을 통해 스케줄링할 수 없음을 표시하고, 노드에서 실행중인 모든 파드를 종료할 수 있다.kubectl uncordon <node>
을 통해 금지 해제를 할수 있다.15.3.3 클러스터 스케일 다운 동안에 서비스 중단 제한
Reference