노드그룹이란?
AWS 노드 그룹(Node Group)은 Amazon EKS(Elastic Kubernetes Service)와 관련된 개념으로, Kubernetes 클러스터에서 워커 노드(worker node)를 관리하는 논리적인 그룹입니다. 각 노드 그룹은 동일한 EC2 인스턴스 유형과 구성을 갖는 여러 워커 노드로 구성됩니다.
EKS 클러스터에서 워커 노드를 관리하고 확장하는 강력한 도구이며 EKS 클러스터에서 워커 노드의 관리를 보다 효율적으로 수행할 수 있도록 도와줍니다.
Graviton (ARM) Instance 노드그룹
AWS Graviton은 ARM 기반의 프로세서 아키텍처를 사용하는 EC2 인스턴스입니다. Graviton 인스턴스는 기존의 인텔 x86 아키텍처와는 다른 프로세서 아키텍처를 기반(ARM)으로 하며, 저전력 및 고성능을 제공합니다. 이러한 Graviton 인스턴스는 특정 워크로드 및 애플리케이션에 대해 향상된 성능을 제공하며, 비용 효율적인 설루션으로 인기를 얻고 있습니다.
노드그룹 생성
- eksctl 명령어로 노드 그룹을 생성합니다.
- taints를 설정하여 tolleration을 적용한 워크로드만 graviton 노드에 배포될 수 있도록 합니다.(아키텍처가 달라 taint 권장)
# 신규 노드 그룹 생성
eksctl create nodegroup --help
eksctl create nodegroup -c $CLUSTER_NAME -r $AWS_DEFAULT_REGION --subnet-ids "$PubSubnet1","$PubSubnet2","$PubSubnet3" --ssh-access \
-n ng3 -t t4g.medium -N 1 -m 1 -M 1 --node-volume-size=30 --node-labels family=graviton --dry-run > myng3.yaml
eksctl create nodegroup -f myng3.yaml
# 확인
kubectl get nodes --label-columns eks.amazonaws.com/nodegroup,kubernetes.io/arch
kubectl describe nodes --selector family=graviton
aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name ng3 | jq .nodegroup.taints
kubectl get nodes -L kubernetes.io/arch
NAME STATUS ROLES AGE VERSION ARCH
ip-192-168-1-59.ap-northeast-2.compute.internal Ready <none> 3h16m v1.28.5-eks-5e0fdde amd64
ip-192-168-2-104.ap-northeast-2.compute.internal Ready <none> 4m12s v1.28.5-eks-5e0fdde arm64
ip-192-168-2-120.ap-northeast-2.compute.internal Ready <none> 3h16m v1.28.5-eks-5e0fdde amd64
ip-192-168-3-44.ap-northeast-2.compute.internal Ready <none> 3h16m v1.28.5-eks-5e0fdde amd64
# taints 셋팅 -> 적용에 2~3분 정도 시간 소요
aws eks update-nodegroup-config --cluster-name $CLUSTER_NAME --nodegroup-name ng3 --taints "addOrUpdateTaints=[{key=frontend, value=true, effect=NO_EXECUTE}]"
# 확인
kubectl describe nodes --selector family=graviton | grep Taints
Taints: frontend=true:NoExecute
aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name ng3 | jq .nodegroup.taints
# NO_SCHEDULE - This corresponds to the Kubernetes NoSchedule taint effect. This configures the managed node group with a taint that repels all pods that don't have a matching toleration. All running pods are not evicted from the manage node group's nodes.
# NO_EXECUTE - This corresponds to the Kubernetes NoExecute taint effect. Allows nodes configured with this taint to not only repel newly scheduled pods but also evicts any running pods without a matching toleration.
# PREFER_NO_SCHEDULE - This corresponds to the Kubernetes PreferNoSchedule taint effect. If possible, EKS avoids scheduling Pods that do not tolerate this taint onto the node.
graviton 노드에 파드 배포하기
tolleration을 설정하여 graviton 노드에 busybox 파드를 배포합니다.
#
cat << EOT > busybox.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
terminationGracePeriodSeconds: 3
containers:
- name: busybox
image: busybox
command:
- "/bin/sh"
- "-c"
- "while true; do date >> /home/pod-out.txt; cd /home; sync; sync; sleep 10; done"
tolerations:
- effect: NoExecute
key: frontend
operator: Exists
EOT
kubectl apply -f busybox.yaml
# 파드가 배포된 노드 정보 확인
kubectl get pod -owide | grep busy
busybox 1/1 Running 0 17s 192.168.2.130 ip-192-168-2-104.ap-northeast-2.compute.internal <none> <none>
실습자원 삭제
# 삭제
kubectl delete pod busybox
eksctl delete nodegroup -c $CLUSTER_NAME -n ng3
Spot instances 노드그룹
Spot Instance는 AWS에서 제공하는 저렴한 비용의 EC2 인스턴스로, 유휴 리소스를 활용하여 가격이 변동되는 인스턴스입니다. 스폿 인스턴스는 온디맨드 인스턴스보다 저렴하게 이용할 수 있으며, 가격이 변동하기 때문에 장기적인 워크로드나 실시간 요구에 적합합니다. 그러나 인스턴스가 중지될 수 있으므로 데이터의 영구 저장이 필요한 경우에는 적합하지 않을 수 있습니다.
ec2-instance-selector
ec2-instance-selector는 CLI를 통해 AWS 인스턴스 유형을 선택하고 필요에 맞게 필터링해 주는 도구입니다. 이 도구를 사용하면 AWS의 다양한 인스턴스 유형 중에서 적합한 유형을 신속하게 확인할 수 있습니다.
# ec2-instance-selector 설치
curl -Lo ec2-instance-selector https://github.com/aws/amazon-ec2-instance-selector/releases/download/v2.4.1/ec2-instance-selector-`uname | tr '[:upper:]' '[:lower:]'`-amd64 && chmod +x ec2-instance-selector
mv ec2-instance-selector /usr/local/bin/
ec2-instance-selector --version
Spot instances 노드그룹 생성
- spot instance 유형의 노드그룹을 2개를 구성합니다.
- node-role에는 자신의 노드롤 ARN을 입력합니다.
#
kubectl get nodes -l eks.amazonaws.com/capacityType=ON_DEMAND
kubectl get nodes -L eks.amazonaws.com/capacityType
ip-192-168-1-59.ap-northeast-2.compute.internal Ready <none> 3h28m v1.28.5-eks-5e0fdde ON_DEMAND
ip-192-168-2-120.ap-northeast-2.compute.internal Ready <none> 3h28m v1.28.5-eks-5e0fdde ON_DEMAND
ip-192-168-3-44.ap-northeast-2.compute.internal Ready <none> 3h28m v1.28.5-eks-5e0fdde ON_DEMAND
# 생성 : 아래 node-role 은 각자 자신의 노드롤 ARN을 입력하자
# role AWSServiceRoleForAmazonEKSNodegroup 테스트해보자
aws eks create-nodegroup \
--cluster-name $CLUSTER_NAME \
--nodegroup-name managed-spot \
--subnets $PubSubnet1 $PubSubnet2 $PubSubnet3 \
--node-role arn:aws:iam::089224560468:role/eksctl-myeks-nodegroup-ng1-NodeInstanceRole-MeD2tOrLiwwg \
--instance-types c5.large c5d.large c5a.large \
--capacity-type SPOT \
--scaling-config minSize=2,maxSize=3,desiredSize=2 \
--disk-size 20
aws eks create-nodegroup \
--cluster-name $CLUSTER_NAME \
--nodegroup-name managed-spot \
--subnets $PubSubnet1 $PubSubnet2 $PubSubnet3 \
--node-role arn:aws:iam::089224560468:role/eksctl-myeks-nodegroup-ng1-NodeInstanceRole-MeD2tOrLiwwg \
--instance-types c5.large c5d.large c5a.large \
--capacity-type SPOT \
--scaling-config minSize=2,maxSize=3,desiredSize=2 \
--disk-size 20
AWS 콘솔에서 스팟 요청 카테고리를 통해 spot instance를 확인할 수 있습니다.
Spot Instance의 노드그룹 생성 시, 노드의 STATUS는 아직 NotReady인 것을 볼 수 있습니다.
아래 명령어를 통해 노드 상태를 READY로 활성화 해줍니다.
aws eks wait nodegroup-active --cluster-name $CLUSTER_NAME --nodegroup-name managed-spot
Spot instances 노드에 파드 생성하기
nodeSelector를 통해 spot instance 노드에 busybox를 생성합니다. label은 eks.amazonaws.com/capacityType=SPOT입니다.
cat << EOT > busybox.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
terminationGracePeriodSeconds: 3
containers:
- name: busybox
image: busybox
command:
- "/bin/sh"
- "-c"
- "while true; do date >> /home/pod-out.txt; cd /home; sync; sync; sleep 10; done"
nodeSelector:
eks.amazonaws.com/capacityType: SPOT
EOT
kubectl apply -f busybox.yaml
# 파드가 배포된 노드 정보 확인
kubectl get pod -owide | grep
busybox 1/1 Running 0 77s 192.168.2.214 ip-192-168-2-215.ap-northeast-2.compute.internal <none> <none>
실습자원 삭제
kubectl delete pod busybox
eksctl delete nodegroup -c $CLUSTER_NAME -n managed-spot
'AWS > EKS' 카테고리의 다른 글
EKS 오토스케일링(Autoscaling) - AEWS 5주차 (0) | 2024.04.07 |
---|---|
EKS 옵저버빌리티(Obsivability) - AEWS 4주차 (0) | 2024.03.31 |
EKS 스토리지(Storage) - AEWS 3주차 1 (0) | 2024.03.23 |
EKS 네트워킹(Networking) - AEWS 2주차 (4) | 2024.03.16 |
EKS 설치 및 기본사용 + 클러스터 엔드포인트 액세스 - AEWS 1주차 (0) | 2024.03.08 |