
(수동 리소스 확장 방법)
$ kubectl top pod my-app-pod
NAME CPU(cores) MEMORY(bytes)
my-app-pod 450m 350Mi
pod를 수직 확장을 위해 아래 예시$ kubectl edit deployment my-app
resource 아래 requests와 limits 필드를 변경하고 저장pod가 죽고 새 pod가 만들어진다VPA를 사용apply -f 명령어로 적용$ kubectl apply -f https://github.com/kubernetes/autoscler/release/latest/download/vertical-pod-autoscaler.yaml
$ kubectl get pods -n kube-system | grep vpa
vpa-admission-controller-xxxx Running
vpa-recommender-xxxx Running
vpa-updater-xxxx Running
admission-controller, recommender, updaterrecommender는 K8S 메트릭 API에서 리소스 사용량을 지속적으로 모니터링하고 Pod의 과거 및 실시간 사용량 데이터를 수집하고 최적의 CPU 및 메모리 값에 대한 권장 사항 제공recommender 자체는 pod를 직접 수정하거나 변경 Xupdater는 최적이 아닌 리소스로 실행 중인 pod를 감지하고 업데이트가 필요할때 해당 pod를 제거recommender로 부터 정보를 가져와서 모니터링 함pod 생성 프로세스에 개입하고 recommender 의 권장 사항을 사용하여 시작시 권장 CPU 및 메모리 값을 적용하도록 pod 사양을 변경pod가 올바른 리소스 요청으로 시작💡VPA
recommender정보 수집 >updater가 정보를 모니터링 and 실제pod와 비교한 다음, 임계값 초과시 Pod 죽임 (정책에 따라 다르게 작동함, 이상적으로는pod를 죽이고admission-controller가 개입하는게 좋지만,pod가 죽으면 자동으로deployment가 다시 생성함 > 어쨌든pod가 죽고 `admission-controller가 리소스를 업데이트 하여 새로운 크기를 갖게 한다.
$ vi my-app-vpa.yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-app-vpa
spec:
targetRef: // 모니터링 대상 정의
apiVersion: apps/v1
kind: Deployment
name: my-app
updatePolicy:
updateMode: “Auto”
resourcePolicy:
containerPolicies:
- containerName: “my-app”
minAllowed:
cpu: “250m”
maxAllowed:
cpu: “2”
controlledResources: [“cpu”]
updateMode는 네가지 모드로 작동Offrecommender만 동작 (updater, admission-controller는 작동 X)initial : 생성 시에만 pod를 변경하는 모드 recommender가 변경을 권장하고 새 pod가 생성되면 이때 admission-controller가 개입하여 리소스 정의를 변경한다. 이 경우 updater는 pod를 죽이거나 다운시키는데 작동하지 않는다?Recreate : 리소스 소비가 지정된 범위를 초과하면 updater가 개입하여 기존 pod 종료Auto : 기존 pod를 권장 수로 업데이트하는 자동 모드가 있다. recreate와 동작이 유사함 안정적인 쿠버네티스 버전에서 리소스의 in-place 업데이트를 사용할 수 있는 경우, Auto mode가 default가 된다.# 권장 사항 확인
$ kubectl describe vpa my-app-vpa
Recommendations:
Target:
Cpu: 1.5
VPApod 성능 최적화pod를 재시작하여 새 리소스 값을 적용 👉 다운타임이 발생pod가 재시작 되어 트래픽 폭증에 대응 불가능HPApod를 계속해서 실행하고 새 pod를 간단히 스핀업 하여 가용성 보장pod를 방지하여 과도한 인스턴스를 실행하지 않고 효율적으로 사용할 수 있도록 돕는다.# CRDs (Custom Resource Definitions) 조회 명령어
$ kubectl get crds | grep verticalpodautoscaler
`
``