Local Zones에 EKS Auto Mode 노드 배포하기
Local Zones에 EKS Auto Mode 노드 배포하기
EKS Auto Mode는 자동 노드 프로비저닝으로 간소화된 클러스터 관리를 제공합니다. AWS Local Zones는 AWS 인프라를 최종 사용자에게 더 가까운 지리적 위치로 확장해 지연 시간에 민감한 애플리케이션의 대기 시간을 줄입니다. 이 가이드는 AWS Local Zones에 EKS Auto Mode 노드를 배포하는 과정을 안내하여, 특정 지리적 영역의 사용자에게 더 낮은 지연 시간으로 컨테이너화된 애플리케이션을 실행할 수 있게 합니다.
또한 이 가이드는 Kubernetes taint와 toleration을 사용해 특정 워크로드만 Local Zone 노드에서 실행되도록 하여 비용을 통제하고 리소스 사용을 최적화하는 방법을 보여 줍니다.
출처: 문서
본문
사전 조건
Local Zones에 EKS Auto Mode 노드 배포를 시작하기 전에 다음 사전 조건이 준비되었는지 확인하세요.
- 기존 EKS Auto Mode 클러스터
- AWS 계정에서 Local Zone에 옵트인(opt-in)
1단계: Local Zone 서브넷 생성
EKS Auto Mode 노드를 Local Zone에 배포하는 첫 단계는 해당 Local Zone에 서브넷을 만드는 것입니다. 이 서브넷은 노드의 네트워크 인프라를 제공하고 VPC의 나머지 부분과 통신할 수 있게 합니다. 선택한 Local Zone에 서브넷을 만들려면 AWS Local Zones User Guide의 Create a Local Zone subnet 지침을 따르세요.
Tip: 로컬 존 서브넷의 이름을 기록해 두세요.
2단계: Local Zone 서브넷용 NodeClass 생성
Local Zone 서브넷을 만든 뒤 이 서브넷을 참조하는 NodeClass를 정의해야 합니다. NodeClass는 사용할 서브넷, 보안 그룹, 스토리지 구성을 포함해 노드의 인프라 속성을 지정하는 Kubernetes 커스텀 리소스입니다. 아래 예시에서는 이름을 기준으로 로컬 존 서브넷을 대상으로 하는 "local-zone" NodeClass를 만듭니다. 서브넷 ID를 사용할 수도 있어요. 이 구성은 자신의 Local Zone 서브넷을 대상으로 하도록 조정해야 합니다.
자세한 내용은 Create a Node Class for Amazon EKS를 참고하세요.
apiVersion: eks.amazonaws.com/v1
kind: NodeClass
metadata:
name: local-zone
spec:
subnetSelectorTerms:
- id:
3단계: NodeClass와 Taint가 있는 NodePool 생성
NodeClass가 구성되면 이 NodeClass를 사용하는 NodePool을 만들어야 합니다. NodePool은 인스턴스 유형을 포함한 노드의 컴퓨트 특성을 정의합니다. NodePool은 NodeClass를 참조로 사용해 인스턴스를 시작할 위치를 결정합니다.
아래 예시에서는 "local-zone" NodeClass를 참조하는 NodePool을 만듭니다. 또한 노드에 taint를 추가해 일치하는 toleration이 있는 Pod만 이 Local Zone 노드에 스케줄링되도록 합니다. 이것은 비용이 일반적으로 더 높고 감소된 지연 시간의 혜택을 받는 워크로드만 사용해야 하는 Local Zone 노드에서 특히 중요합니다.
자세한 내용은 Create a Node Pool for EKS Auto Mode를 참고하세요.
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: my-node-pool
spec:
template:
metadata:
labels:
node-type: local-zone
spec:
nodeClassRef:
group: eks.amazonaws.com
kind: NodeClass
name: local-zone
taints:
- key: "aws.amazon.com/local-zone"
value: "true"
effect: NoSchedule
requirements:
- key: "eks.amazonaws.com/instance-category"
operator: In
values: ["c", "m", "r"]
- key: "eks.amazonaws.com/instance-cpu"
operator: In
values: ["4", "8", "16", "32"]
키 aws.amazon.com/local-zone과 effect NoSchedule가 있는 taint는 일치하는 toleration이 없는 Pod가 이 노드에 스케줄링되지 않도록 합니다. 이는 일반 워크로드가 예기치 않은 비용을 초래할 수 있는 Local Zone에서 실수로 실행되는 것을 방지합니다.
4단계: Toleration과 Node Affinity로 워크로드 배포
Local Zone 노드에서 워크로드 배치를 최적으로 제어하려면 taints/tolerations와 node affinity를 함께 사용하세요. 이 결합된 접근 방식은 다음 이점을 제공합니다.
- 비용 제어: taint는 명시적 toleration이 있는 Pod만 잠재적으로 비용이 높은 Local Zone 리소스를 사용할 수 있게 합니다.
- 보장된 배치: node affinity는 지연 시간에 민감한 애플리케이션이 일반 클러스터 노드가 아닌 Local Zone에서만 실행되도록 보장합니다.
Local Zone 노드에서만 실행되도록 구성된 Deployment 예시:
apiVersion: apps/v1
kind: Deployment
metadata:
name: low-latency-app
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: low-latency-app
template:
metadata:
labels:
app: low-latency-app
spec:
tolerations:
- key: "aws.amazon.com/local-zone"
operator: "Equal"
value: "true"
effect: "NoSchedule"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "node-type"
operator: "In"
values: ["local-zone"]
containers:
- name: application
image: my-low-latency-app:latest
resources:
limits:
cpu: "1"
memory: "1Gi"
requests:
cpu: "500m"
memory: "512Mi"
이 Deployment에는 두 가지 핵심 스케줄링 구성이 있습니다.
- toleration은
aws.amazon.com/local-zonetaint가 있는 노드에 Pod가 스케줄링될 수 있게 합니다. - node affinity 요구사항은 이 Pod들이
node-type: local-zone라벨이 있는 노드에서만 실행되도록 보장합니다.
이 둘을 함께 사용하면 지연 시간에 민감한 애플리케이션이 Local Zone 노드에서만 실행되며, 일반 애플리케이션은 명시적으로 구성하지 않는 한 Local Zone 리소스를 소비하지 않습니다.
5단계: AWS 콘솔로 검증
NodeClass, NodePool, Deployments를 설정한 뒤 노드가 예상대로 Local Zone에서 프로비저닝되고 워크로드가 그 위에서 실행되는지 확인해야 합니다. AWS Management Console을 사용해 EC2 인스턴스가 올바른 Local Zone 서브넷에서 시작되는지 확인할 수 있어요.
또한 kubectl get nodes -o wide로 Kubernetes 노드 목록을 확인해 노드가 올바른 라벨과 taint로 클러스터에 합류하는지 확인할 수 있습니다.
kubectl get nodes -o wide
kubectl describe node | grep -A 5 Taints
워크로드 Pod가 Local Zone 노드에 스케줄링되었는지도 확인할 수 있어요.
kubectl get pods -o wide
이 접근 방식은 Local Zone taint를 명시적으로 허용하는 워크로드만 이 노드에 스케줄링되도록 하여, 비용을 통제하고 Local Zone 리소스를 가장 효율적으로 사용하게 합니다.