일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- seldon core
- 오퍼레이터
- tekton
- operator
- opentelemetry
- serving
- kubernetes operator
- Continuous Deployment
- keda
- CANARY
- argocd
- MLflow
- Pulumi
- argo rollout
- opensearch
- nginx ingress
- Kubernetes
- Kubeflow
- Argo
- CI/CD
- blue/green
- Model Serving
- Kubernetes 인증
- 카오스 엔지니어링
- gitea
- Kopf
- gitops
- Litmus
- knative
- mlops
- Today
- Total
Kubernetes 이야기
Vertical Pod Autoscaler (VPA) 본문
Kubernetes에서는 3가지의 오토스케일을 사용하여 확장 처리를 할 수 있다.
- HPA ( Horizontal Pod Autoscaler ) : Pod를 수평적으로 확장한다. 즉, pod의 cpu나 mem 이 임계치 이상 사용하면 pod 개수를 늘리는 것이 HPA이다.
- CA ( Cluster Autoscaler ) : 클러스터의 노드 수를 조정한다. Cluster Autoscaler는 노드에 Pod를 실행할 리소스가 부족한 경우 노드를 자동으로 추가하거나 제거한다.
- VPA ( Verical Pod Autoscaler ) : Pod에 있는 컨테이너 리소스 요청 및 제한을 조정한다.
이중 Kubernetes는 VPA (Vertical Pod Autoscaler)에 대해 알아보자.
Pod를 생성할 때 Pod가 사용할 CPU, Mem을 제한하는 것은 중요하다. 참고로 다음의 내용도 검토해야 한다.
https://kubernetes.io/ko/docs/tasks/configure-pod-container/quality-service-pod/
보통 다름과 같이 설정한다.
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: log-aggregator
image: images.my-company.example/log-aggregator:v6
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- 리소스가 너무 적게 설정되어 있으면 성능이 느려지거나 OOM오류 (메모리 부족)으로 Pod가 Down될 수 있다.
- 리소스가 너무 크면 다른 Pod를 실행할 때 배포에 문제가 발생할 수 있습니다.
하지만, pod에서 사용해야 하는 cpu와 mem을 처음부터 올바르게 설정하는 것은 매우 어려운일이다.
VPA는 이를 위해 사용할 수 있는 resource이다. VPA를 사용하면 아래의 장점이 있다.
- CPU 및 메모리 할당에 사용해야 하는 올바른 값에 대해 알 수 있다.
- 권장 값으로 배포를 업데이트 할 수 있다.
VPA의 구성요소
- Recommender : 현재 및 과거 리소스 사용량을 모니터링하고 이를 기반으로 컨테이너의 CPU 및 메모리 요청 권장값을 제공한다.
- Updater : 관리되는 포드 중 올바른 리소스가 설정되어 있는지 확인하고 그렇지 않은 경우 업데이트된 요청으로 컨트롤러에서 다시 생성할 수 있도록 종료한다.
- Admission Plugin : 새 포드에 올바른 리소스 요청을 설정한다. (업데이터 활동으로 인해 컨트롤러에서 방금 생성하거나 다시 생성).
설치
전제조건
- 메트릭 서버가 Kubernetes Cluster에 배포되어 있어야 한다. ( https://github.com/kubernetes-incubator/metrics-server )
설치
# git clone https://github.com/kubernetes/autoscaler.git
# cd autoscaler/
# cd vertical-pod-autoscaler/
# ./hack/vpa-up.sh
...
unknown option -addext
req [options] <infile >outfile
...
위와 같이 오류가 발생하는 경우 버전을 0.8 branch를 이용하거나 openssl을 1.1.1 이상으로 update해야 한다.
openssl 을 update해보자
# wget https://www.openssl.org/source/openssl-1.1.1n.tar.gz
# tar xvfz openssl-1.1.1n.tar.gz
# cd openssl-1.1.1n
# ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared
# make
# make install
# ln -s /usr/local/ssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
# ln -s /usr/local/ssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
# mv /usr/bin/openssl /usr/bin/openssl1.0.2k
# openssl version
OpenSSL 1.1.1n 15 Mar 2022
이제 다시 vpa 를 설치해 보자.
# ./hack/vpa-up.sh
설치가 완료되면 아래와 같은 Pod가 실행된다.
# kubectl --namespace=kube-system get pods|grep vpa
vpa-admission-controller-58cf99779c-jx9dz 1/1 Running 0 5h41m
vpa-recommender-678f4f6d4b-w9xvd 1/1 Running 0 5h41m
vpa-updater-64ddd67787-bkxbb 1/1 Running 0 5h41m
VPA 오류 여부는 아래와 같은 명령어로 확인가능하다.
# kubectl --namespace=kube-system logs [pod name]| grep -e '^E[0-9]\{4\}'
VPA 구성 예
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"
VPA의 작동모드는 아래와 같이 3가지가 있다.
- "Auto": VPA는 포드 생성 시 리소스 요청을 할당하고 기본 업데이트 메커니즘을 사용하여 기존 포드에서 업데이트한다. 참고: VPA의 이 기능은 실험적이며 애플리케이션에 다운타임이 발생할 수 있다.
- "Recreate": VPA는 포드 생성 시 리소스 요청을 할당할 뿐만 아니라 요청된 리소스가 새 권장 사항과 크게 다를 때 이를 제거하여 기존 포드에서 업데이트한다. (정의된 경우 포드 중단 예산 준수). 이 모드는 리소스 요청이 변경될 때마다 포드를 다시 시작해야 하는 경우에만 드물게 사용해야 한다. 참고: VPA의 이 기능은 실험적이며 애플리케이션에 다운타임이 발생할 수 있다.
- "Initial": VPA는 포드 생성 시에만 리소스 요청을 할당하고 나중에 변경하지 않는다.
- "Off": VPA는 포드의 리소스 요구 사항을 자동으로 변경하지 않는다. 권장 사항이 계산되고 VPA 개체에서 검사할 수 있다.
예제
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: hamster-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: hamster
resourcePolicy:
containerPolicies:
- containerName: '*'
minAllowed:
cpu: 100m
memory: 50Mi
maxAllowed:
cpu: 1
memory: 500Mi
controlledResources: ["cpu", "memory"]
updatePolicy:
updateMode: "Off"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hamster
spec:
selector:
matchLabels:
app: hamster
replicas: 2
template:
metadata:
labels:
app: hamster
spec:
securityContext:
runAsNonRoot: true
runAsUser: 65534 # nobody
containers:
- name: hamster
image: k8s.gcr.io/ubuntu-slim:0.1
resources:
requests:
cpu: 100m
memory: 50Mi
command: ["/bin/sh"]
args:
- "-c"
- "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"
생성 후 VPA 상세정보를 조회해 보자.
# kubectl create -f test.yaml
verticalpodautoscaler.autoscaling.k8s.io/hamster-vpa created
deployment.apps/hamster created
# kubectl get vpa
NAME MODE CPU MEM PROVIDED AGE
hamster-vpa Off 587m 262144k True 93s
# kubectl describe vpa hamster-vpa
Name: hamster-vpa
Namespace: default
...
Recommendation:
Container Recommendations:
Container Name: hamster
Lower Bound:
Cpu: 100m
Memory: 262144k
Target:
Cpu: 587m
Memory: 262144k
Uncapped Target:
Cpu: 587m
Memory: 262144k
Upper Bound:
Cpu: 1
Memory: 500Mi
Events: <none>
위에서 target 값이 추천되는 resource 양이다.
제한사항
- VPA가 포드 리소스를 업데이트할 때마다 포드가 다시 생성되어 실행 중인 모든 컨테이너가 다시 시작된다.. 포드는 다른 노드에서 다시 생성될 수 있다.
- 현재 CPU 또는 메모리 의 Horizontal Pod Autoscaler (HPA) 와 함께 Vertical Pod Autoscaler 를 사용 하면 안된다. 그러나 사용자 지정 및 외부 측정항목에서는 HPA 와 함께 VPA를 사용할 수 있다.
- VPA 성능은 대규모 클러스터에서 테스트되지 않았다.
- VPA 권장 사항은 사용 가능한 리소스(예: 노드 크기, 사용 가능한 크기, 사용 가능한 할당량)를 초과하여 포드가 보류 상태가 될 수 있다. 이 문제는 Cluster Autoscaler 와 함께 VPA를 사용하여 부분적으로 해결할 수 있다.
참고
https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler
https://www.kubecost.com/kubernetes-autoscaling/kubernetes-vpa/
'Kubernetes > 일반' 카테고리의 다른 글
Kubernetes Cluster 설계 (0) | 2022.04.10 |
---|---|
Bare metal VS VM Kubernetes (0) | 2022.04.09 |
Service Account 권한 설정 및 kube config (0) | 2022.04.04 |
PodNodeSelector (0) | 2022.04.02 |
Pod 스케줄링 (0) | 2022.04.02 |