일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 그라파나 대시보드
- 딥레이서 보상함수
- EFS CSI Driver
- blue-green
- jenkins
- AWS 딥레이서
- grafana on kubernetes
- 깃허브 액션
- Solution Architecture
- SAA 합격 후기
- 쿠버네티스
- livenessPorbe
- 솔데스크
- 로드밸런서 컨트롤러
- headless service
- github action 사용법
- 딥레이서
- Kubernets on Jenkins
- LoadBalancer Controller
- Firelens
- Aurora cluster
- helm
- EKS 클러스터
- Kubernetes
- 메탈LB
- kubernetes 동작 원리
- terraform
- Prometheus install
- 쿠버네티스 컴포넌트
- 그라파나 시각화
mingming
Kubernetes - Autoscaling 본문
파드의 리소스 관리
파드 및 컨테이너에 최소 필요한 리스스의 양을 요청할 수 있는 Requests와 최대 사용량을 제한할 수 있는 Limits를 구성할 수 있습니다. 이 기능은 쿠버네티스의 기능이라기 보다 컨테이너 런타임의 기능입니다.
1. Requests
requests는 특정 파드 전용으로 사용할 수 있는 리소스를 보장합니다. 다른 리소스가 사용하지 못하도록 예약된 리소스입니다.
현재 리소스 샤용량 확인
kubectl top nodes | pods
kubectl top 명령어를 통해 현재 리소스 사용량을 확인할 수 있습니다. 해당 명령을 사용하기 위해선 metirc-server 가 설치되어 있어야합니다.
Requests Template
apiVersion: v1
kind: Pod
metadata:
name: request-pod
spec:
containers:
- name:
image:
resources:
reqeusts:
cpu: 200m
memory: 10Mi
pod.spec.containers.resources.requests : 리소스 요청 선언
pod.spec.containers.resources.requests.cpu : CPU 리소스 요청
pod.spec.containers.resources.requests.memory : Memory 리소스 요청
CPU
CPU는 두가지 방식으로 리소스 요청을 할 수 있습니다. 숫자만 표기하는 경우 코어의 개수를 의미하며, 200m의 m은 밀리코어를 의미합니다. 1코어는 1000m으로 표기할 수있습니다.
Memory
Memory는 SI 표준 단위와 IEC 표준 단위로 표기할 수 있습니다.
- SI 표준 단위 : K, M, G, T, P, E
- IEC 표준 단위 : Ki, Mi, Gi, Ti, Pi, Ei
2. Limits
limits는 파드가 사용할 수 있는 한계를 지정합니다. 리소스 제한은 리소스 요청이 있는경우 요청한 리소스와 같거나 그보다 더 커야 합니다.
Limits Template
apiVersion: v1
kind: Pod
metadata:
name: limits-pod
spec:
containers:
- name: limits-app
image: ghcr.io/c1t1d0s7/go-myweb:alpine
resources:
limits:
cpu: 200m
memory: 10Mi
pod.spec.containers.resources.limits : 리소스 제한 선언
pod.spec.containers.resources.limits.cpu : CPU 리소스 제한
pod.spec.containers.resources.limits.memory : Memory 리소스 제한
리소스 제한 확인
위에서 작성한 테스트 템플릿을 배포합니다.
kubectl apply -f limits.yaml
현재 파드가 사용하는 리소스를 확인합니다.
kubectl top pods limits-pod
새로운 터미널을 열어 파드에 부하를 줍니다.
kubectl exec limits-pod -- sha256sum /dev/zero
sha256sum 해시를 계산하는 도구이며 /dev/zero 장치의 해시를 계산함으로 부하를 최대한 늘릴 수 있습니다.
부하를 준 파드의 리소스 사용량을 확인합니다. limits 에서 정의한 리소스 제한이 제대로 동작하는지 확인합니다.
kubectl top pods limits-pod
3. Autoscaling
수평적 파드 오토스케일러 ( Horizontal Pod Autoscaler )를 줄여서 HPA라고 합니다. 오토스케일이 가능한 컨트롤러는 Replication Controller , ReplicaSet, Deployment, StatefulSet 입니다.
vagrant@kube-control1:~/requests$ kubectl api-resources | grep hpa
horizontalpodautoscalers hpa autoscaling/v2 true HorizontalPodAutoscaler
HPA 동작 단계
- 관리되는 모든 파드의 메트릭을 측정해 가져옵니다.
- 지정한 목표값에 부합하도록 필요한 파드 수를 계산합니다.
- 파드를 관리하는 컨트롤러의 복제본을 조정합니다.
파드의 메트릭은 각 노드에 있는 kubelet 에서 cAdvisor의 에이전트를 실행시키고 cAdvisor 에이전트가 메트릭을 수집해 이를 메트릭 서버에 전달합니다. 메트릭 서버는 메트릭 API를 통해 HPA 리소스에 해당 메트릭을 전달합니다.
HPA Template
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myap-hpa-cpu
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hpa-deploy
minReplicas: 1
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 30
HPA 생성 및 Deployment 연동
HPA를 테스트하기 위한 Deployment 매니페스트 파일입니다.
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: hpa
name: hpa-deploy
spec:
replicas: 3
selector:
matchLabels:
app: hpa
template:
metadata:
labels:
app: hpa
spec:
containers:
- image: ghcr.io/c1t1d0s7/go-myweb:alpine
name: myapp
ports:
- containerPort: 8080
resources:
requests:
cpu: 10m
memory: 10Mi
위에서 정의한 HPA 와 Deployment를 생성합니다.
kubectl apply -f hpa.yaml -f deployment.yaml
HPA 리소스 확인
kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
myap-hpa-cpu Deployment/hpa-deploy 10%/30% 1 5 1 3m7s
Deployment의 복제본 개수를 3개로 지정했지만 HPA에 의해 개수가 조절되는 것을 확인할 수 있습니다.
특정 파드에 부하를 줍니다.
kubectl exec hpa-deploy-f5b58f644-4pfgj -- sha256sum /dev/zero
HPA에 의해 파드의 복제본이 늘어난 것을 확인할 수 있습니다.
부하 종료
부하 종료 후 파드의 개수가 다시 줄어든 것을 확인할 수 있습니다.
kubectl exec hpa-deploy-f5b58f644-t9q9b -- pkill -9 sha256sum
명령어를 통한 autoscale 생성
Usage:
kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS
[--cpu-percent=CPU] [options]
매니페스트 파일을 작성하지 않고 위와 같이 kubectl autoscale 명령어를 통해 생성할 수 있습니다.
'새싹 하이브리드 클라우드 > Kubernetes' 카테고리의 다른 글
Kubernetes - PV & PVC (1) | 2023.11.23 |
---|---|
Kubernetes - Storage (0) | 2023.11.23 |