반응형
참고
-
Horizontal Pod Autoscaling - k8s docs
-
HorizontalPodAutoscaler 연습 - k8s docs
-
k8s Pod Autoscaler 개념 - skysoo1111
AKS를 조금 사용해 보면서 AKS에서 제공하는 Node확장 기능과, HPA를 사용해본 적이 있습니다.
HPA에 대해서 다시 살펴보면서 정리를 해놔야겠다는 생각이 들어서 K8S에 사용되는 Autoscale에 어떤 것들이 있는지 찾아보고 정리 합니다.
요약
-
Node Autoscale은 Public Vendor마다 사용법이 다르다. (AWS, Azure, GCP 등)
-
overprovisioning으로 node의 확장에 걸리는 소요 시간을 눈치채지 못하게 하는 방법도 있다.
-
HPA, VPA를 쓰려면 cluster에 metrics-server가 있어야 하고, pod 매니패스트에 resouces가 정의되어야 한다.
-
VPA는 pod의 cpu, memory 최대 사용량을 바꾸어 주지만 pod restart가 필요해서 사용할 일이 있을지 모르겠다.
-
HPA가 pod 확장에 가장 적합해 보이며, 적극적으로 사용하는것이 좋을 것 같다.
K8S에서 autoscale을 적용할 수 있는 부분은 다음 세 가지가 있습니다.
-
CA (Cluster Autoscaler)
-
HPA (Horizontal Pod Autoscaler)
-
VPA (Vertical Pod Autoscaler)
각 autoscaler들이 무엇이고 어떻게 사용되는지 알아 봅니다.
CA (Cluster Autoscaler)
K8S에서 확장이 필요한 부분은 어디 일까요? 당연히 node와 pod 뿐이죠 (음..... 또 있나?....)
Cloud Native답게 K8S는 관리형(public cloud vendor에서 제공하는 PaaS형태)으로 주로 사용되다보니
vendor 마다 제공해주는 콘솔이나 포탈에서 k8s node의 확장될 node의 수량을 수동으로 설정 하거나
일정 범위만 지정하여 자동 확장이 되도록 하기만 하면 끝입니다.
CA 대한 설정 방법이나 자세한 내용은 대표 vendor의 링크로 대신합니다.
(vendor마다 CA 설정 방법에 대한 내용이 달라서...)
overprovisioning
pod의 확장은 금방 이지만 node의 확장은 시간이 오래 걸리는 편이죠
다소 긴 node의 확장 시간을 (체감상이긴 하지만) 줄여줄 수 있는 방법이 있습니다.
overprovisioning이라는 기법인데요
node 확장을 조금 더 빠른 것처럼(느린 것을 눈치채지 못하게) 처리하기 위한 기법입니다.
overprovisioning 절차
-
우선순위가 낮은 PriorityClass를 생성합니다.
-
아무런 역할도 하지 않는 pod를 앞서 생성한 낮은 PriorityClass로 배포 합니다. (중요 포인트)
-
새로운 pod 요청이 있을 때 node에 여유가 없다면
-
스케줄러에 의해 낮은 우선순위의 pod를 강제 종료되어 pending 상태로 바뀌고
-
그 자리에 새로 요청 온 pod를 배치 합니다.
-
이 때 cluster는 pending중인 pod가 있으므로 node를 확장하게 됩니다.
overprovisioning을 사용하면 좋을 것 같아 보이기도 하지만 원론적으로 따지고 보면 눈가리고 아웅 아닌가 싶기도....
프로덕션 환경에 따라 사용하면 좋을 것 같습니다.
CA 예시
apiVersion: scheduling.k8s.io/v1beta1
kind: PriorityClass
metadata:
name: overprovisioning
value: -1
globalDefault: false
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: overprovisioning
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
run: overprovisioning
template:
metadata:
labels:
run: overprovisioning
spec:
priorityClassName: overprovisioning
containers:
- name: reserve-resources
image: k8s.gcr.io/pause
resources:
requests:
cpu: 1600m
memory: 550Mi
반응형
Pod AutoScaling
트래픽이 몰리는 경우를 감지하여 pod의 replicas를 조절하거나 resouces를 조절하여 트래픽을 유연하게 유지할 수 있도록 해주는 기능입니다.
pod Autoscaler는 아래 두 가지가 있습니다.
-
HPA (Horizontal Pod Autoscaler)
-
VPA (Vertical Pod Autoscaler)
하나의 Pod를 대상으로 HPA와 VPA를 혼용으로 사용할 수는 없습니다.
Metrics Server
scale의 기준이 되는 값은 metric server가 제공하는 값으로 판단을 하게 됩니다.
-
aks cluster에 metrics-server가 설치되어 있어야 합니다.
AKS는 cluster version 1.10 이상에서 자동으로 metrics-server를 배포해 줍니다.
현재(2022-07-15)기준으로 AKS cluster version은 1.22.6 입니다.
pod resources 정의
metrics-server가 설치되어 있더라도 pod에서 필수적으로 준비해야 하는 요건도 있습니다.
바로 pod의 resources 정의 입니다.
(백만 번 강조해도 모자라지 않을 만큼 pod 매니패스트에 resources는 필수로 설정해야 합니다.)
metrics-server에서 pod의 사용량을 얻어오더라도 기준이 되는 값이 정의되어 있지 않으면 percentage를 알 수가 없으니까요
(사용량을 percentage로 하지 않고 value로 사용하는 경우는 가능할 것 같기도 하지만 resources는 무조건 정의하는 것이 좋습니다.)
Core Metrics Pipeline
metric server 에서 수집되는 데이터는 System Metrics 라고 불리는 Node, Pod의 CPU나 Memory 사용량 같은 기본적인 데이터 입니다.
이런 데이터 만으로도 Scale조절에 충분한 데이터를 수집할 수 있습니다.
Monitoring Metrics Pipeline
metrics Server가 수집하는 데이터는 메모리에 잠시 저장되기 때문에 영속적이지 않습니다.
일정기간의 데이터를 수집해야 하거나, metrics server에서 제공하지 않는 정보(애플리케이션 레벨 등)가 필요한 경우
아! 한 가지 더
HPA는 Deployment, StatefulSet처럼 Replicaset을 사용하는 확장 개념이 있는 Pod를 대상으로 scale을 하기 때문에
DadmonSet에는 적용되지 않는다고 합니다.
(확인해보지는 않았습니다. 쓸일이 있을까 싶네요... dadmonset yaml에 replicas를 추가하면 배포 시 오류가 날 것 같기도 하고)
HPA (Horizontal Pod Autoscaler)
HPA에 대한 내용을 정리하다보니 내용이 너무 길어져 별도 페이지로 분리 하였습니다.
VPA (Vertical Pod Autoscaler)
현재(2022-07-15)기준 VPA는 베타버전으로 VPA를 사용하려면 cluster에 별도 설치가 필요합니다.
VPA는 pod의 사용량이 임계치에 도달 했을 때 pod에 조치를 취한다는점은 HPA와 동일하지만
pod의 확장이 필요하다고 판단되는 경우 spec.containers.resources에 정의된 값을 조절하여 해당 pod들이 재시작 될 때 반영되는 방식입니다.
Stateful App에 사용하기 적합하다고 하지만...
그냥 제 기준으로 생각해 본 것이지만 서비스 중에 pod 가 재시작 된다는 것은 마냥 좋은 기능은 아닌 것 같이 느껴집니다.
pod가 재시작 된다는 점을 감안하였을 때 이걸 어디에 쓸 수 있을지...
VPA는 머~~~언 훗날 필요하다고 느껴지면 그 때 찾아봐야겠어요~
반응형
LIST
'IT > Kubernetes' 카테고리의 다른 글
Helm에 대해 알아보자 (1) | 2023.04.17 |
---|---|
K8S Horizontal Pod Autoscaler (HPA) (0) | 2023.04.17 |
K8S resources.requests 필요한가? (1) | 2023.04.17 |
Loki 설치 (0) | 2023.04.13 |
prometheus 설치 (with pvc) (0) | 2023.04.13 |