일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ACM 도메인
- velog
- Session Manager
- 테라폼 private GKE
- aws
- AWS client VPN 인증서
- 비공개 GKE autorized
- 티스토리
- Encapsulation
- AWS session manager
- client vpn
- Terraform GKE
- AWS private EC2
- 비공개 GKE
- Terraform GCP GKE
- TCP/IP
- client vpn 인증서
- Decapsulation
- ACM
- S3
- 벨로그
- 문과남자의 과학공부
- 엔지니어블로그
- s3 upload 400
- 프라이빗 EC2 접속
- 독서노트
- Terrafrom GCP
- java s3 400
- Today
- Total
망지로그
Kubernetes pod 오토스케일링- HPA( Horizontal Pod Autoscaler) 본문
Docker 기반 컨테이너 오케스트레이션 도구인 쿠버네티스!
쿠버네티스 환경에서도 할당된 자원의 부하상태에 따라
자동으로 pod의 scale in-out이 가능한데, HPA를 통해서 오토스케일링을 설정해주면 된다.
교육동안 진행했던 포스트를 재정리하고자 한다.
yaml 파일 apply 시 오류가 뜬다면 아래 코드에 있는 주석을 잘 삭제하였는지 확인하기 바랍니당.
📌k8s HPA
📙 deployment를 통한 pod생성 및 Cluster IP 서비스 생성
*deploy로 pod를 생성하면 가용성 확보와 롤링 업데이트, 롤백이 가능하다.
✔️1. vi 편집기를 이용하여 yaml파일로 deployment와 service apply.
[root@master ~]# mkdir hpa && cd $_
[root@master hpa]#
[root@master hpa]# vi php-apache.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 2 ## desired capacity 시작 갯수
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: k8s.gcr.io/hpa-example ##부하 올리기 좋은 이미지. 검토할때는 이미지만 바꿔주면 됨.
ports:
- containerPort: 80 ## 정보성
resources:
limits:
cpu: 500m ## 단일 pod cpu한도
requests:
cpu: 200m ## 단일 pod cpu최소
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80 ##실제 포트 설정
selector:
run: php-apache ##deployment meta data
[root@master hpa]# kubectl apply -f php-apache.yaml
✔️2. 상태 확인 ( pod2개와Cluster IP가 정상적으로 생성되었다.)
replicaset은 deployment 하윗단에 존재하는 워크로드 리소스이다.
[root@master hpa]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/php-apache-d4cf67d68-ppkbl 1/1 Running 0 54s
pod/php-apache-d4cf67d68-rdjj5 1/1 Running 0 54s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
service/php-apache ClusterIP 10.98.204.31 <none> 80/TCP 54s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/php-apache 2/2 2 2 54s
NAME DESIRED CURRENT READY AGE
replicaset.apps/php-apache-d4cf67d68 2 2 2 54s
📙 HPA apply
✔️1.yaml 파일 apply로 hpa 워크로드 리소스 생성
[root@master hpa]# vi hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
maxReplicas: 4 ##최대 pod 갯수
minReplicas: 1 ##최소 pod 갯수
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache ##위에서 생성한 deployment name
targetCPUUtilizationPercentage: 50 ##스케일링 인-아웃 기준 CPU사용률
status:
currentCPUUtilizationPercentage: 0
currentReplicas: 2
desiredReplicas: 2
[root@master hpa]# kubectl apply -f hpa.yaml
✔️2. 상태 확인
[root@master hpa]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/php-apache-d4cf67d68-ppkbl 1/1 Running 0 25m
pod/php-apache-d4cf67d68-rdjj5 1/1 Running 0 25m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
service/php-apache ClusterIP 10.98.204.31 <none> 80/TCP 25m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/php-apache 2/2 2 2 25m
NAME DESIRED CURRENT READY AGE
replicaset.apps/php-apache-d4cf67d68 2 2 2 25m
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
horizontalpodautoscaler.autoscaling/php-apache Deployment/php-apache <unknown>/50% 1 4 0 14s
[root@master hpa]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 4 2 64s
✔️3. 부하 발생시키기
[root@master ~]# kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
->부하 발생시키기 ; http://php-apache 쿠버네티스의 자체 dns ; coredns .
✔️4. 부하 발생시켜 놓고, 원격접근 툴(필자의 경우, mobaxterm)의 탭 하나 더 생성하여 마스터노드로 접근해서 hpa 상태 확인
=> 부하가 50%넘자 REPLICAS가 4개로 늘어난 것 확인가능.
✔️5. 부하 발생시켰던 탭으로 돌아가 control + c (부하중단) 후 hpa 상태 확인
[root@master ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 4 1 23m
=> 부하가 줄어들고 REPLICAS가 1(최소 파드 갯수)로 돌아온 모습
📌 왜 deployment의 replicaset이 아닌 HPA의 최소 용량으로 줄어드는가?
✔️ 가장 기본적인 관점에서, HorizontalPodAutoscaler 컨트롤러는 원하는(desired) 메트릭 값과 현재(current) 메트릭 값 사이의 비율로 작동한다.
원하는 레플리카 수 = ceil[현재 레플리카 수 * ( 현재 메트릭 값 / 원하는 메트릭 값 )]
우리 예시의 경우, 현재 메트릭(CPU) 값이 0%이므로, HPA의 원하는 레플리카 수 = 최소 레플리카 수로 정해진다.
HorizontalPodAutoscaler는 디플로이먼트 및 디플로이먼트의 레플리카셋의 크기를 조정하기 때문에 HPA의 알고리즘대로 replicaset의 갯수가 정해진다.
가용성을 생각해 보았을 때 HPA 의 최소 레플리카스는 2개 이상은 되어야 할 것이다.
'Kubernetes' 카테고리의 다른 글
CKA- RBAC ; role, rolebinding (0) | 2024.06.26 |
---|---|
CKA- Kubeconfig (0) | 2024.06.25 |
CKA - Certificates API (0) | 2024.06.25 |
CKA - View Certificate Details (0) | 2024.06.24 |
CKA- backup and restore (0) | 2024.06.24 |