실습 4탄 = 14/17
Pod 수를 늘리는 HPA (Horizontal Pod Autoscaler)
Pod 사양을 높이는 VPA( Vertical Pod Autoscaler)
Work Node 수를 늘리는 CA (Cluster AutoScaler) = 물리서버 증가
변경되는 부분을 쉽게 확인하도록 VIEW를 설치한다.
1
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
2
helm repo add stable https://charts.helm.sh/stable
helm install kube-ops-view stable/kube-ops-view --set service.type=LoadBalancer --set rbac.create=True
3
AWS CLB 생성 후 대상(인스턴스) 헬스체크 까지 2~3분 정도 시간 소요
kubectl get svc kube-ops-view | tail -n 1 | awk '{ print "Kube-ops-view URL = http://"$4 }'
4
http url을 웹브라우저로 접속 (3분 걸림)
1) Cluster-autoscaler 파드가 필요하다.
2) IRSA 계정 권한도 필요하다.
이미지 출처
https://aws-eks-web-application.workshop.aws/ko/100-scaling/200-cluster-scaling.html
1
CA는 리소스 부족으로 Pod가 시작 되지 않으면, Node수를 자동으로 늘리는것.
Cluster Autoscale 동작하기 위해 Cluster-autoscaler 파드(디폴로이먼트)를 배치해야 한다.
1) Cluster-autoscaler 파드가 Autoscaler에서 상태 정보를 전달해 늘린다.
2) IRSA 권한도 필요하다.
2
CA는 pending 상태인 Pod가 존재할때 , Work node를 늘린다.
3
특정 시간을 간격으로 사용률을 확인하여 스케일 인/아웃을 수행합니다.
그리고 AWS에서는 Auto Scaling Group(ASG)을 사용하여 Cluster Autoscaler를 적용
4
현재 autoscaling(ASG) 정보 확인
현재 오토 스케일링 그룹으로 묶여 있다.
콘솔 > EC2 > 오토 스케일링 가서 확인 가능 하다.
// aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='클러스터이름']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]" --output table
클러스터 이름
myeks
first-eks
aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='myeks']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]" --output table
2개 , 최대 6개,
-------------------------------------------------------------------------
| DescribeAutoScalingGroups |
+--------------------------------------------------------+----+----+----+
| eks-ng-ddcb067-b135ec0-a13f-e9b6fb6306fd | 2 | 6 | 2 |
+--------------------------------------------------------+----+----+----+
AWS 콘솔 > EC2 > Autoscaling group에서도 볼수 있다.
5
MaxSize 수정
export ASG_NAME=$(aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='myeks']].AutoScalingGroupName" --output text)
or
first-eks
MaxSize 를 4로 수정
aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${ASG_NAME} --min-size 2 --desired-capacity 2 --max-size 4
6
확인
aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='myeks']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]" --output table
eks-ng-e3a4e584-f6bdf0da-af32-8f6c-3d0d-c26aa60a7089 | 2 | 4 | 2 |
7
Policy 파일 생성
권한 필요
워커 노드 2개 있는데, SetDesiredCapacity 를 늘리는 권한이 있어야 한다.
cat <<EoF > k8s-asg-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"autoscaling:DescribeAutoScalingGroups",
"autoscaling:DescribeAutoScalingInstances",
"autoscaling:DescribeLaunchConfigurations",
"autoscaling:DescribeTags",
"autoscaling:SetDesiredCapacity",
"autoscaling:TerminateInstanceInAutoScalingGroup",
"ec2:DescribeLaunchTemplateVersions"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
EoF
// autoscaling 정보를 조회하고, DesiredCapacity 상태 세팅하는 것등 권한이 필요하다.
8
# IAM Policy 생성
aws iam create-policy --policy-name k8s-asg-policy --policy-document file://k8s-asg-policy.json
9
IRSA 생성 - iamserviceaccount 생성
echo $CLUSTER_NAME
ACCOUNT_ID=`aws sts get-caller-identity --query 'Account' --output text`
echo $ACCOUNT_ID
eksctl create iamserviceaccount --name cluster-autoscaler --namespace kube-system --cluster $CLUSTER_NAME --attach-policy-arn "arn:aws:iam::${ACCOUNT_ID}:policy/k8s-asg-policy" --approve --override-existing-serviceaccounts
10
배포
디플로이 먼트로 배포
Deploy the Cluster Autoscaler (CA)
curl -O https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
cat cluster-autoscaler-autodiscover.yaml | sed "s/<YOUR CLUSTER NAME>/$CLUSTER_NAME/g" | kubectl apply -f -
11
확인?
kubectl get pod -n kube-system | grep cluster-autoscaler
cluster-autoscaler-5549447d45-x79rl 0/1 CrashLoopBackOff 8 23m
모니터링용 pod 1개가 생겼다.
컨트롤러 역할을 한다.
부족하다고 판단이 되면, 오토 스케일러에 추가하라고 명령을 내린다.
12
kubectl describe deployments.apps -n kube-system cluster-autoscaler
13
cluster-autoscaler 파드가 동작하는 워커 노드가 퇴출(evict) 되지 않게 설정 (옵션)
kubectl -n kube-system annotate deployment.apps/cluster-autoscaler cluster-autoscaler.kubernetes.io/safe-to-evict="false"
14
cluster-autoscaler 버전 확인 ?
kubectl describe deployments.apps -n kube-system cluster-autoscaler | grep cluster-autoscaler:
cluster-autoscaler:
Image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.17.3
// cluster-autoscaler 이미지 버전이 1.17.3 이다.
cluster-autoscaler 1.21 이미지 버전으로 올리자.
15
autoscaler image 업데이트 하는 법 ?
export K8S_VERSION=$(kubectl version --short | grep 'Server Version:' | sed 's/[^0-9.]*\([0-9.]*\).*/\1/' | cut -d. -f1,2)
echo ${K8S_VERSION}
export AUTOSCALER_VERSION=$(curl -s "https://api.github.com/repos/kubernetes/autoscaler/releases" | grep '"tag_name":' | sed -s 's/.*-\([0-9][0-9\.]*\).*/\1/' | grep -m1 ${K8S_VERSION})
kubectl -n kube-system set image deployment.apps/cluster-autoscaler cluster-autoscaler=us.gcr.io/k8s-artifacts-prod/autoscaling/cluster-autoscaler:v${AUTOSCALER_VERSION}
kubectl describe deployments.apps -n kube-system cluster-autoscaler | grep cluster-autoscaler:
cluster-autoscaler:
Image: us.gcr.io/k8s-artifacts-prod/autoscaling/cluster-autoscaler:v1.21.0
// 버전 1.21 확인
지금까지는 cluster-autoscaler 파드 를 만들었다.
1
샘플 배포
# We will deploy an sample nginx application as a ReplicaSet of 1 Pod
cat <<EoF> nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-to-scaleout
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
service: nginx
app: nginx
spec:
containers:
- image: nginx
name: nginx-to-scaleout
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 500m
memory: 512Mi
EoF
watch -d kubectl get pods,deployment
kubectl apply -f nginx.yaml
kubectl get deployment/nginx-to-scaleout
2
현재 node수 2개인것 확인
k get nodes
(seo-eks@myeks:default) [root@myeks-host ~]# k get nodes
NAME STATUS ROLES AGE VERSION
ip-192-168-1-167.ap-northeast-1.compute.internal Ready <none> 23h v1.21.2-eks-55daa9d
ip-192-168-2-85.ap-northeast-1.compute.internal Ready <none> 23h v1.21.2-eks-55daa9d
3
pod 를 10개로 늘려보자~
펜딩 되는게 보인다~
# Scale our ReplicaSet
# Let’s scale out the replicaset to 10
kubectl scale --replicas=10 deployment/nginx-to-scaleout
확인
kubectl get pods -l app=nginx -o wide --watch
kubectl -n kube-system logs -f deployment/cluster-autoscaler
3
# 노드 자동 증가 확인
aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='myeks']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]" --output table
-------------------------------------------------------------------------
| DescribeAutoScalingGroups |
+--------------------------------------------------------+----+----+----+
| eks-ng-ddcb00bb-a47--a13f-e9b6fb6306fd | 2 | 6 | 4 |
+--------------------------------------------------------+----+----+----+
4
콘솔에서 확인 가능
EC2 > Auto Scaling 그룹
5
디플로이먼트 삭제
kubectl delete -f nginx.yaml
6
노드 수 축소
기본은 10분 후 scale down 됨
아래 flag 로 시간 수정 가능
디플로이먼트 삭제 후 10분 기다리고 나서 보자!
# By default, cluster autoscaler will wait 10 minutes between scale down operations,
# you can adjust this using the --scale-down-delay-after-add, --scale-down-delay-after-delete,
# and --scale-down-delay-after-failure flag.
# E.g. --scale-down-delay-after-add=5m to decrease the scale down delay to 5 minutes after a node has been added.
# 터미널1
watch -d kubectl get node
7
AWS 콘솔에서 확인
배포 참고
https://www.eksworkshop.com/beginner/080_scaling/test_ca/
1
cluster-autoscaler 삭제
cat cluster-autoscaler-autodiscover.yaml | sed "s/<YOUR CLUSTER NAME>/$CLUSTER_NAME/g" | kubectl delete -f -
2
irsa 삭제
eksctl delete iamserviceaccount --name cluster-autoscaler --namespace kube-system --cluster $CLUSTER_NAME --wait
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/horizontal-pod-autoscaler.html
https://aws-eks-web-application.workshop.aws/ko/100-scaling/100-pod-scaling.html
https://www.eksworkshop.com/beginner/080_scaling/deploy_hpa/
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/vertical-pod-autoscaler.html
https://www.eksworkshop.com/beginner/080_scaling/deploy_ca/
https://aws-eks-web-application.workshop.aws/ko/100-scaling/200-cluster-scaling.html
https://www.eksworkshop.com/beginner/080_scaling/deploy_ca/
https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler/cloudprovider/aws
https://brunch.co.kr/@topasvga/1889
감사합니다.