AutoScaling [Part 01]
01. EKS (Elastic Kubernetes Service) ์ค์น
๐โ๏ธ EKS ์๊ฐ
Kubernetes Control plane์ ๊ตฌ์ฑํ ํ์ ์์ด AWS์์ Kubernetes๋ฅผ ์ ๊ณตํ๋ ๊ด๋ฆฌํ ์๋น์ค.
์ฅ์ ์ ์๋์ ๊ฐ์ต๋๋ค.
- ๋ฆฌํฉํ ๋ง์ด ํ์์๋ค.
EKSํ๊ฒฝ์์ ๊ตฌ๋๋๋ Application์ ํ์ค ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์ ๊ทธ๋๋ก ๊ตฌ๋ ๊ฐ๋ฅํ๋ฉฐ,
๋ฐ๋๋ก On-premise ํ๊ฒฝ์ ์๋ ๊ตฌ์ฑ์ EKS ํ๊ฒฝ์ผ๋ก ์์ฝ๊ฒ ์ ์ฉ ๊ฐ๋ฅํจ.
- opensource ์ปค๋ฎค๋ํฐ์ ์ ๊ทน์ ์ผ๋ก ๊ธฐ์ฌํ๋ค.
eksctl, autoscaler, CNI ๊ฐ๋ฐ ๋ฑ.
EKS Architecture

๋ฐ๋๋ก, Kubernetes์ EKS์ ์ฐจ์ด์ ์?
- Kubernetes ์ฌ์ฉ์ Control plane ๊ด๋ฆฌ ๋ถ๋ด์ด ํฌ๋ค (CNI ๊ตฌ์ฑ, HA๊ตฌ์ฑ ๋ฑ..)
- Managed node Group์ด ์๋ค (EKS์์ ์ ๊ณตํ๋ ์๋น์ค)
- version update ๋ถ๋ด ๋ฑ.
ํ์ง๋ง, ๊ด๋ฆฌํ ์๋น์ค๊ฐ ๊ผญ ์ ๋ต๋ง์ ์๋๋ค.
- ์ปค์คํฐ๋ง์ด์ง ์ฌ์ง๊ฐ ์ฌ๋ผ์ง๋ฏ๋ก Platform์ ํ์ํ ์๊ตฌ์ฌํญ์ด ์์ ๊ฒฝ์ฐ ์คํ๋ ค ๋ถํธํ๋ค.
- ex: ETCD์ ๋ค์ด๊ฐ๋ ์ ๋ณด๋ฅผ ๋ณ๋๋ก ๊ตฌ์ถํด์ ์ํธํ๋ฅผ ํด์ผํ๋ ๊ฒฝ์ฐ ๋ฑ..
- ๋ณด์, ์ํฌ๋ก๋ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ์ ๊ตฌ์ถ์ด ํ์ํ๋ฏ๋ก Managed Service๊ฐ ์ ๋ต์ ์๋๋ค.
๊ฐ๋จํ ์ค์ต์ ํ์ํ ์ ๋๋ก๋ง EKS๋ฅผ ์์๋ณด๊ธฐ๋ก ํ๊ณ , ์์ธํ๊ฑด ๋์ค์ Deep ํ๊ฒ ๋ค๋ค๋ณด๋๋ก ํ์.
1-1. EKS ์ค์น ์ ์ฌ์ ์ค๋น๋ฌผ
โ awscli ์ค์น
apt-get update
apt-get install -y unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
aws configure
$aws configure
AWS Access Key ID [None]: ๋ณด์์ ์ค์ํ์ฌ ์์ฑํ์ง ์๋๋ก ํ๊ฒ ์ต๋๋ค.
AWS Secret Access Key [None]: ์ ๋ด์ฉ๊ณผ ๊ฐ์ต๋๋ค.
Default region name [None]: ap-northeast-2
Default output format [None]: json
--- ์ ์ฉ ํ์ธ ---
aws configure list
aws sts get-caller-identity
{
"UserId": "339712771495",
"Account": "339712771495",
"Arn": "arn:aws:iam::339712771495:root"
}
โ eksctl ์ค์น
์ฐธ๊ณ ๋ฌธ์ : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/eksctl.html
Amazon EKS๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ - Amazon EKS
์ด ํ์ด์ง์ ์์ ์ด ํ์ํ๋ค๋ ์ ์ ์๋ ค ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ค๋ง์์ผ ๋๋ ค ์ฃ์กํฉ๋๋ค. ์ ๊น ์๊ฐ์ ๋ด์ด ์ค๋ช ์๋ฅผ ํฅ์์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ง์ํด ์ฃผ์ญ์์ค.
docs.aws.amazon.com
# ubuntu Linux EC2 ์ eksctl ์ค์น
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
eksctl version
0.171.0
โ kubectl ์ค์น
์ฐธ๊ณ ๋ฌธ์ : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html
# ubuntu Linux EC2 ์ k8s ๊ด๋ฆฌํด์ธ kubectl ์ค์น
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.21.2/2021-07-05/bin/linux/amd64/kubectl
chmod +x ./kubectl
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
-- ๋ฒ์ ํ์ธ --
kubectl version --short --client
-- ์๋ ๋ช
๋ น ์คํฌ๋ฆฝํธ --
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >>~/.bashrc
1-2. EKS install
console์์ ์๋์ผ๋ก ์ค์น๊ฐ ๊ฐ๋ฅํ์ง๋ง, ๊ด๋ฆฌ๋ฅผ ์ฉ์ดํ๊ฒ yaml ํ์ผ๋ก ์์ฑํ์ฌ ์ค์น
vi cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: prd-eks-cluster
region: ap-northeast-2
vpc:
id: 'vpc-02172b18928eebff8'
subnets:
private:
ap-northeast-2a:
id: 'subnet-09fd28d637e11b029'
ap-northeast-2c:
id: 'subnet-0ee462c61cd9b9395'
managedNodeGroups:
- name: prd-eks-dataplane1
labels: { role: workers }
instanceType: t2.medium
desiredCapacity: 1
privateNetworking: true
subnets:
- subnet-09fd28d637e11b029
- name: prd-eks-dataplane2
labels: { role: workers }
instanceType: t2.medium
desiredCapacity: 1
privateNetworking: true
subnets:
- subnet-0ee462c61cd9b9395
iam:
withAddonPolicies:
imageBuilder: true
iam:
withOIDC: true
๋ณธ์ธ VPC ํ๊ฒฝ์ ๋ง์ถ์ด vpc-id, subnet-id ํญ๋ชฉ์ ์์ ์ด ํ์ํฉ๋๋ค.
- ์ค์น์๋ฃ ํ node ์์ฑ ํ์ธ
kubectl get nodes
์ค์ต์ด ๋๋์ ํ EKS ์ญ์ ๋ช ๋ น์ ์๋์ ๊ฐ์ต๋๋ค.
eksctl delete cluster -f cluster.yaml --disable-nodegroup-eviction
02. HPA(Horizon Pod Autoscaler)
Pod์ ๋ํ Client Connection์ด ๋ง์์ง๊ฑฐ๋ ์ ์ด์ง๋ฉด ๋ฆฌ์์ค ์ ๋ณด๋ฅผ ํ์ธํ์ฌ Pod๋ฅผ ์ฆ๊ฐ์ํค๊ฑฐ๋ ์ถ์์ํค๋ ๊ธฐ์
- Scal in/out ์ ํตํด ํ๋ ์๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ด๋ ๋ฐฉ๋ฒ
- Metric์ ๋ฐ๋ผ (CPU ์ฌ์ฉ๋ฅ ) ํ๋ ์๋ฅผ ์๋์ผ๋ก ์กฐ์ ํ๋ค.
- ํ๋ ์๋ฅผ ๋๋ฆผ์ผ๋ก์จ ์ฒ๋ฆฌ๋์ ๋์ผ ์ ์์ง๋ง ๋ฆฌ์์ค ์ฌ์ฉ๋์ด ์ฆ๊ฐํ์ฌ ๋น์ฉ ํจ์จ์ฑ์ด ๋จ์ด์ง ์ ์๋ค.
์ค์ผ์ค๋ง ์๊ฐ
kube-controller-manager์์ ์ค์ ํ ์ ์๋ค. ์ฆ, master node์ ์ ๊ทผํ์ฌ ๋ณ๊ฒฝํ ์ ์๋๋ฐ
์ฐ๋ฆฌ๋ AWS์์ EKS๋ฅผ ๋์์ํค๊ธฐ ๋๋ฌธ์ master node๋ AWS์์ ๊ด๋ฆฌํ๋ฏ๋ก, ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅ ํ๋ ์ฐธ๊ณ !
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
apiServer:
extraArgs:
horizontal-pod-autoscaler-sync-period: "15s"
horizontal-pod-autoscaler-downscale-stabilization: "5m"
sync-period : HPA๊ฐ Pod์ CPU์ฌ์ฉ๋ฅ ์ Check ํ๋ ์ฃผ๊ธฐ(์๊ฐ)์ ๋ํ๋ด๋ฉฐ, Default๊ฐ์ผ๋ก 15์ด.
downscale-stabilization : Pod๋ฅผ ์ค์ผ ๋ ํน์ ๋๊ธฐ ์๊ฐ์ ๋ํ๋ด๋ฉฐ, Default ๊ฐ์ผ๋ก 5๋ถ์ด๋ค.
๐โ๏ธ ์์์ ๊ตฌ์ฑ์์
- eksctl, kubectl
- worker node 2๊ฐ ์ด์์ธ cluster
- Metrics Server๊ฐ ๋ฐฐํฌ๋ cluster
- kubernetes version : 1.23 ์ด์.
โ Metrics Server install
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
์ config๋ก install ํ ์๋์ ๊ฐ์ด ํ์ธ
kubectl get deployment metrics-server -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
metrics-server 1/1 1 1 31s
2-1. ํ ์คํธ์ฉ Pod & Service ๋ฐฐํฌ
โ apache ๋ฐฐํฌ
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: registry.k8s.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
ํด๋น yaml ํ์ผ์ ๋ฐฐํฌํ๊ธฐ ์ํด ์๋ ๋ช ๋ น์ค์ ์ ๋ ฅํ์.
kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
HPA ๋์ ๋ฐฉ์
ํ๊ท ์ ์ผ๋ก ์ ์ด ์ฅ์น์ ๋ชจ๋ Pod์ ํ๊ท CPU ์ฌ์ฉ๋ฅ ์ 50%๋ก ์ ์งํ๊ธฐ ์ํด ๋ฐฐํฌ๋ฅผ ์ ๋ฐ์ดํธ ํ์ฌ
๋ณต์ ๋ณธ ์๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ด๊ฒ ๋๋ค. ๊ทธ ํ, ReplicaSet๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค.
- ์ example yaml์ resources๋ฅผ ์ฐธ๊ณ ํด๋ณด๋ฉด ๊ฐ Pods๋ ์ต์ 200๋ฐ๋ฆฌ ์ฝ์ด๋ฅผ ์์ฒญํ๋ฏ๋ก, ํ๊ท CPU ์ฌ์ฉ๋์ด 100๋ฐ๋ฆฌ ์ฝ์์ ์๋ฏธํ๋ค.
โ HPA ์์ฑ
์์ฑ ํ๊ธฐ์ ์์, apache pod, service ํ์ธ
kubectl get deployments.apps php-apache
NAME READY UP-TO-DATE AVAILABLE AGE
php-apache 1/1 1 1 8m17s
kubectl get svc php-apache
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
php-apache ClusterIP 172.20.120.152 <none> 80/TCP 8m30s
โ ๋ณต์ ๋ณธ์ 1 - 5๊ฐ๋ฅผ ์ ์งํ๋ HPA ์์ฑ ๋ฐ ํ์ธ
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=5
kubectl get hpa php-apache
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 5 1 35s
2-2. HPA์ ๋ถํ ์ฆ๊ฐ ํ ์คํธ
๋ถํ๋ฅผ ์ค์ผ๋ก์จ ์ด๋ป๊ฒ AutoScaling์ด ๋์ํ๋์ง ํ์ธํด๋ณด์.
1. Client ์ญํ ์ ํ Pod ์์ฑ
- Pod๋ด์ Container๋ ๋ฌดํ ๋ฃจํ๋ก ๋์ํ๋ฉฐ php-apache ์๋น์ค์ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋.
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"
- Client Connection์ด ์ฆ๊ฐํ๋ฉด์ ๋ถํ๋ฅผ ์ผ๋ง๋ ์ฃผ๋์ง ๋ชจ๋ํฐ๋งํด๋ณด์.
kubectl get hpa php-apache --watch

2. Pod ๋ณต์ ์ ํ์ธ
- CPU ์ฌ์ฉ๋ฅ ์ ์ฐธ๊ณ ํ์ฌ Pod ๋ณต์ ๋ณธ ์๋ฅผ ๋๋ ค ReplicaSet์ ์ ๋ฐ์ดํธ

์๋ฒ ํฌ์คํ ์์๋ Pod์ ๋ํ AutoScaling ๋์์ ๋ํ์ฌ ์์๋ณด์๊ณ ,
๋ค์ ํฌ์คํ ์์๋ Node์ ๋ํ AutoScaling ๋์์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค!