Kubernetes Pod 의 CPU 요청 및 제한값 변경하기 (Vertical Pod Autoscaler)
Autoscaler 종류는 총 세가지 입니다.
1) HPA (Horizontal Pod Autoscaler) : 애플리케이션의 복제본 수를 조정합니다. HPA 는 CPU 활용도를 기반으로 복제 컨트롤러, 배포, 복제본 집합 또는 상태 저장 집합의 포드 수를 조정합니다. HPA 는 또한 사용자 지정 또는 외부 메트릭을 기반으로 스케일링 결정을 내리도록 구성될 수 있습니다.
2) CA (Cluster Autoscaler) : 클러스터의 노드 수를 조정합니다. 클러스터 오토스케일러는 노드가 포드를 실행할 수 있는 자원이 부족하거나 (노드를 추가), 노드의 활용도가 낮은 상태로 있을 때 (노드를 제거), 포드가 다른 노드에 할당될 수 있을 때 (노드를 제거), 클러스터에서 노드를 자동으로 추가하거나 제거합니다.
3) VPA (Vertical Pod Autoscaler) : 클러스터 내 컨테이너의 리소스 요청 및 제한을 조정합니다. 본 매뉴얼에서 다룰 내용입니다.
- 공식 Document : https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler
1. VPA (Vertical Pod Autoscaler) 배포
VPA 사용을 위해 필요한 파일을 다운로드 받고 클러스터에 배포합니다.
# git clone https://github.com/kubernetes/autoscaler.git
# cd autoscaler/vertical-pod-autoscaler
# ./hack/vpa-up.sh
배포가 잘 되었는지 확인합니다.
# kubectl get pods -n kube-system |grep vpa
NAME READY STATUS RESTARTS AGE
vpa-admission-controller-754ccfdf99-pkxnl 1/1 Running 0 45s
vpa-recommender-667f9769fb-84rl5 1/1 Running 0 46s
vpa-updater-696b8787f9-6665j 1/1 Running 0 46s
- VPA Admission-Controller : VPA 업데이터가 Pod 를 제거하고 다시 시작할 때마다 새 Pod 가 시작되기 전에 Webhook 를 사용하여 CPU 및 메모리 설정을 변경합니다.
- VPA Recommender : Metric Server 의 정보를 참조하여 적합한 리소스 크기를 추천합니다.
- VPA Updater : 1분에 1회씩 변경 사항을 확인하고 업데이트 합니다.
VPA 사용자 지정 리소스 정의가 생성되었는지 확인합니다.
# kubectl get customresourcedefinition | grep verticalpodautoscalers
verticalpodautoscalers.autoscaling.k8s.io 2023-12-29T07:32:30Z
2. Pod 생성
Deployment 로 생성한 Pod 에 적용이 잘 되는지 확인해보겠습니다.
아래와 같이 Deployment 구성 파일을 작성합니다.
# vi deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: selector: matchLabels: app: nginx replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginxinc/nginx-unprivileged:latest resources: limits: cpu: 100m memory: 256Mi requests: cpu: 50m memory: 128Mi securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] runAsNonRoot: true seccompProfile: type: RuntimeDefault |
작성한 yaml 파일을 적용합니다.
# kubectl apply -f deployment.yaml
deployment.apps/nginx created
생성된 Pod 이름을 확인합니다.
# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-7f856c878-gbk77 1/1 Running 0 7m43s
Pod 에 적용된 자원 요청 및 제한값을 확인합니다.
# kubectl describe pod nginx-7f856c878-gbk77 |grep -E 'cpu|memory'
cpu: 100m
memory: 256Mi
cpu: 50m
memory: 128Mi
변경을 위해 Vertical Pod Autoscaler 구성 파일을 작성합니다.
# vi vpa.yaml
apiVersion: "autoscaling.k8s.io/v1" kind: VerticalPodAutoscaler metadata: name: nginx-vpa spec: targetRef: apiVersion: "v1" kind: Deployment name: nginx updatePolicy: updateMode: "Auto" resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 256Mi maxAllowed: cpu: 200m memory: 512Mi controlledResources: ["cpu", "memory"] |
작성한 yaml 파일을 적용합니다.
# kubectl apply -f vpa.yaml
verticalpodautoscaler.autoscaling.k8s.io/nginx-vpa created
생성한 VPA 를 확인합니다.
VPA Updater 가 1분 간격으로 변경 사항을 확인하고 업데이트 하기 때문에 조금 기다려야 정확한 내용 확인이 가능합니다.
# kubectl get vpa
NAME MODE CPU MEM PROVIDED AGE
nginx-vpa Auto 100m 256Mi True 8m28s
자세한 VPA 정보를 확인합니다.
# kubectl describe vpa nginx-vpa
...
Status:
Conditions:
Last Transition Time: 2024-01-02T05:17:45Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: nginx
Lower Bound:
Cpu: 100m
Memory: 256Mi
Target:
Cpu: 100m
Memory: 256Mi
Uncapped Target:
Cpu: 25m
Memory: 262144k
Upper Bound:
Cpu: 100m
Memory: 256Mi
...
이미 생성되어 있는 Pod 에는 적용되지 않으므로 Pod 를 삭제하여 재생성 되도록 합니다.
# kubectl delete pod nginx-7f856c878-gbk77
pod "nginx-7f856c878-gbk77" deleted
재생성된 Pod 이름을 확인합니다.
# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-75954b4f8d-6g54j 1/1 Running 0 62s
새로 적용된 자원 요청 및 제한값을 확인합니다.
Deployment 의 설정값보다 VPA 설정값이 우선시 되는것을 확인하였습니다.
# kubectl describe pod nginx-75954b4f8d-6g54j |grep -E 'cpu|memory'
vpaUpdates: Pod resources updated by nginx-vpa: container 0: cpu request, memory request, cpu limit, memory limit
cpu: 200m
memory: 512Mi
cpu: 100m
memory: 256Mi
참고로, VPA 에서 Deployment 가 인식되는 시간 (최대 1분) 이 필요한데, VPA 를 먼저 정의한 다음에 Deployment (Pod 자동 생성) 를 생성한다 하더라도 VPA 가 Deployment 를 인식하기 전에 Pod 가 먼저 생성되는 경우가 많으므로 Pod 삭제 작업은 꼭 필요합니다.
삭제 작업 없이 Pod 를 생성하는대로 적용하고 싶으면, Deployment 생성시 replicas: 0 으로 먼저 적용하고, VPA 에서 인식이 되면 replicas: 1 등으로 수정, 적용하세요. Deployment 인식 이후에 생성된 Pod 이므로 VPA 요청 및 제한값에 맞추어 생성됩니다.
'리눅스 > Containers & Kubernetes' 카테고리의 다른 글
[Kubernetes] metrics-server 설치하기 (error: Metrics API not available 조치) (0) | 2024.01.11 |
---|---|
[Kubernetes] 네임스페이스의 메모리 및 CPU 할당량 구성 (0) | 2024.01.11 |
[Kubernetes] 지워지지않는 Terminating 네임스페이스 삭제하기 (0) | 2023.10.31 |
개인 도커 레지스트리 (Docker Registry) 구축하기 (0) | 2023.09.05 |
Kubernetes 1.28 에서 MetalLB 설치하기 (0) | 2023.09.04 |