이 페이지 개선에 도움 주기
이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 GitHub에서 이 페이지 편집 링크를 선택합니다.
Amazon EKS용 노드 클래스 생성
Amazon EKS 노드 클래스는 EKS 자동 모드 관리형 노드의 구성을 세부적으로 제어할 수 있는 템플릿입니다. 노드 클래스는 네트워크 구성, 스토리지 설정, 리소스 태그 지정을 포함하여 EKS 클러스터의 노드 그룹에 적용되는 인프라 수준 설정을 정의합니다. 이 주제에서는 특정 운영 요구 사항에 맞게 노드 클래스를 생성하고 구성하는 방법을 설명합니다.
EKS Auto Mode가 기본 설정 이상으로 EC2 인스턴스를 프로비저닝하고 구성하는 방법을 사용자 지정해야 하는 경우, 노드 클래스를 생성하면 중요한 인프라 파라미터를 정확하게 제어할 수 있습니다. 예를 들어 보안 강화를 위해 프라이빗 서브넷 배치를 지정하거나, 성능에 민감한 워크로드에 대해 인스턴스 임시 스토리지를 구성하거나, 비용 할당을 위해 사용자 지정 태그 지정을 적용할 수 있습니다.
노드 클래스 생성
NodeClass
를 생성하려면 다음 단계를 따르세요.
-
노드 클래스 구성으로 YAML 파일(예:
nodeclass.yaml
) 생성 -
kubectl
을 사용하여 클러스터에 해당 구성 적용 -
노드 풀 구성에서 노드 클래스를 참조하세요. 자세한 내용은 EKS Auto Mode용 노드 풀 생성 섹션을 참조하세요.
kubectl
을 설치하고 구성해야 합니다. 자세한 내용은 Amazon EKS를 사용하도록 설정 섹션을 참조하세요.
기본 노드 클래스 예제
다음은 노드 클래스 예제입니다.
apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: private-compute spec: ephemeralStorage: size: "160Gi"
이 NodeClass는 노드의 임시 스토리지 양을 늘립니다.
다음을 사용하여 이 구성을 적용합니다.
kubectl apply -f nodeclass.yaml
그런 다음 노드 풀 구성에서 노드 클래스를 참조합니다. 자세한 내용은 EKS Auto Mode용 노드 풀 생성 섹션을 참조하세요.
노드 클래스 액세스 항목 생성
사용자 지정 노드 클래스를 생성하는 경우 노드가 클러스터에 조인할 수 있도록 EKS 액세스 항목을 생성해야 합니다. EKS는 내장 노드 클래스와 노드 풀을 사용할 때 액세스 항목을 자동으로 생성합니다.
Access Entries 작동 방법에 대한 자세한 내용은 EKS 액세스 항목을 사용한 IAM 사용자에게 Kubernetes에 대한 액세스 권한 부여 섹션을 참조하세요.
EKS 자동 모드 노드 클래스에 대한 액세스 항목을 생성할 때 EC2
액세스 항목 유형을 사용해야 합니다.
CLI를 사용하여 액세스 항목 생성
EC2 노드에 대한 액세스 항목 생성 및 EKS 자동 모드 정책 연결
클러스터 이름과 노드 역할 ARN으로 다음 CLI 명령을 업데이트합니다. 노드 역할 ARN은 노드 클래스 YAML에 지정됩니다.
# Create the access entry for EC2 nodes aws eks create-access-entry \ --cluster-name <cluster-name> \ --principal-arn <node-role-arn> \ --type EC2 # Associate the auto node policy aws eks associate-access-policy \ --cluster-name <cluster-name> \ --principal-arn <node-role-arn> \ --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSAutoNodePolicy \ --access-scope type=cluster
CloudFormation을 사용하여 액세스 항목 생성
EC2 노드에 대한 액세스 항목 생성 및 EKS 자동 모드 정책 연결
클러스터 이름과 노드 역할 ARN으로 다음 CLI 명령을 업데이트합니다. 노드 역할 ARN은 노드 클래스 YAML에 지정됩니다.
EKSAutoNodeRoleAccessEntry: Type: AWS::EKS::AccessEntry Properties: ClusterName: <cluster-name> PrincipalArn: <node-role-arn> Type: "EC2" AccessPolicies: - AccessScope: Type: cluster PolicyArn: arn:aws:eks::aws:cluster-access-policy/AmazonEKSAutoNodePolicy DependsOn: [ <cluster-name> ] # previously defined in CloudFormation
CloudFormation 스택 배포에 대한 자세한 내용은 CloudFormation 시작하기를 참조하세요.
노드 클래스 사양
apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: my-node-class spec: # Required fields role: MyNodeRole # IAM role for EC2 instances subnetSelectorTerms: - tags: Name: "private-subnet" kubernetes.io/role/internal-elb: "1" # Alternative using direct subnet ID # - id: "subnet-0123456789abcdef0" securityGroupSelectorTerms: - tags: Name: "eks-cluster-sg" # Alternative approaches: # - id: "sg-0123456789abcdef0" # - name: "eks-cluster-security-group" # Optional: Pod subnet selector for advanced networking podSubnetSelectorTerms: - tags: Name: "pod-subnet" kubernetes.io/role/pod: "1" # Alternative using direct subnet ID # - id: "subnet-0987654321fedcba0" # Optional fields snatPolicy: Random # or Disabled networkPolicy: DefaultAllow # or DefaultDeny networkPolicyEventLogs: Disabled # or Enabled ephemeralStorage: size: "80Gi" # Range: 1-59000Gi or 1-64000G or 1-58Ti or 1-64T iops: 3000 # Range: 3000-16000 throughput: 125 # Range: 125-1000 # Optional KMS key for encryption kmsKeyID: "arn:aws:kms:region:account:key/key-id" # Accepted formats: # KMS Key ID # KMS Key ARN # Key Alias Name # Key Alias ARN # Optional: Forward proxy, commonly requires certificateBundles as well #for EC2, see https://repost.aws/knowledge-center/eks-http-proxy-containerd-automation advancedNetworking: httpsProxy: http://192.0.2.4:3128 #commonly port 3128 (Squid) or 8080 (NGINX) #Max 255 characters #httpsProxy: http://[2001:db8::4]:3128 # IPv6 address with port, use [] noProxy: #Max 50 entries - localhost #Max 255 characters each - 127.0.0.1 #- ::1 # IPv6 localhost #- 0:0:0:0:0:0:0:1 # IPv6 localhost - 169.254.169.254 # EC2 Instance Metadata Service #- [fd00:ec2::254] # IPv6 EC2 Instance Metadata Service # Domains to exclude, put all VPC endpoints here - .internal - .eks.amazonaws.com # Optional: Custom certificate bundles. certificateBundles: - name: "custom-cert" data: "base64-encoded-cert-data" # Optional: Additional EC2 tags (with restrictions) tags: Environment: "production" Team: "platform" # Note: Cannot use restricted tags like: # - kubernetes.io/cluster/* # - karpenter.sh/provisioner-name # - karpenter.sh/nodepool # - karpenter.sh/nodeclaim # - karpenter.sh/managed-by # - eks.amazonaws.com/nodeclass
고려 사항
-
노드 IAM 역할 바꾸기 -
NodeClass
와 연결된 노드 IAM 역할을 변경하는 경우 새 액세스 항목을 생성해야 합니다. EKS는 클러스터 생성 중 노드 IAM 역할에 대한 액세스 항목을 자동으로 생성합니다. 노드 IAM 역할에는AmazonEKSAutoNodePolicy
EKS 액세스 정책이 필요합니다. 자세한 내용은 EKS 액세스 항목을 사용한 IAM 사용자에게 Kubernetes에 대한 액세스 권한 부여 섹션을 참조하세요. -
최대 포드 밀도 - EKS는 노드의 최대 포드 수를 110개로 제한합니다. 이 제한은 기존의 최대 포드 계산 후에 적용됩니다. 자세한 내용은 최적의 Amazon EC2 노드 인스턴스 유형 선택 섹션을 참조하세요.
-
태그 - Kubernetes에서 EC2로 태그를 전파하려면 추가 IAM 권한을 구성해야 합니다. 자세한 내용은 EKS Auto Mode의 자격 증명 및 액세스에 대해 알아보기 섹션을 참조하세요.
-
기본 노드 클래스 - 사용자 지정 노드 클래스의 이름을
default
로 지정하지 마세요. 이는 EKS 자동 모드에 내장NodePool
을 하나 이상 활성화하면 자동으로 프로비저닝되는default
라는NodeClass
가 포함되어 있기 때문입니다. 내장NodePools
활성화에 대한 자세한 내용은 내장 NodePools 활성화 또는 비활성화 섹션을 참조하세요. -
여러 서브넷이 있는
subnetSelectorTerms
동작 -subnetSelectorTerms
조건과 일치하거나 ID로 제공하는 서브넷이 여러 개 있는 경우 EKS 자동 모드는 서브넷 전체에 분산된 노드를 생성합니다.-
서브넷이 서로 다른 가용 영역(AZ)에 있는 경우 포드 토폴로지 확산 제약 조건
및 토폴로지 인식 라우팅 과 같은 Kubernetes 기능을 사용하여 각각 영역에 걸쳐 포드와 트래픽을 확산할 수 있습니다. -
동일한 AZ에
subnetSelectorTerms
와 일치하는 서브넷이 여러 개 있는 경우 EKS 자동 모드는 해당 AZ의 서브넷에 분산된 각 노드에 Pod를 생성합니다. EKS 자동 모드는 동일한 AZ의 다른 서브넷에 있는 각 노드에 보조 네트워크 인터페이스를 생성합니다. 각 서브넷에서 사용 가능한 IP 주소 수를 기준으로 선택하여 서브넷을 보다 효율적으로 사용합니다. 하지만 EKS 자동 모드가 각 포드에 대해 어떤 서브넷을 사용할지는 지정할 수 없습니다. 포드가 특정 서브넷에서 실행되도록 하려면 대신 포드의 서브넷 선택를 사용하세요.
-
포드의 서브넷 선택
podSubnetSelectorTerms
및 podSecurityGroupSelectorTerms
필드를 사용하면 포드가 노드와 다른 서브넷에서 실행되도록 하여 고급 네트워킹 구성을 사용할 수 있습니다. 이 분리는 네트워크 트래픽 라우팅 및 보안 정책에 대한 향상된 제어를 제공합니다. podSecurityGroupSelectorTerms
는 podSubnetSelectorTerms
와 함께 필요합니다.
사용 사례
다음 작업 시 podSubnetSelectorTerms
를 사용합니다.
-
애플리케이션 트래픽(포드 간 통신)에서 인프라 트래픽(노드 간 통신)을 분리합니다.
-
포드 서브넷과 다른 네트워크 구성을 노드 서브넷에 적용합니다.
-
노드 및 포드에 대해 서로 다른 보안 정책 또는 라우팅 규칙을 구현합니다.
-
포드 트래픽에 영향을 주지 않고 노드 트래픽에 대해 특히 역방향 프록시 또는 네트워크 필터링을 구성합니다.
advancedNetworking
및certificateBundles
를 사용하여 역방향 프록시와 프록시에 대한 자체 서명 또는 프라이빗 인증서를 정의합니다.
구성의 예
apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: advanced-networking spec: role: MyNodeRole # Subnets for EC2 instances (nodes) subnetSelectorTerms: - tags: Name: "node-subnet" kubernetes.io/role/internal-elb: "1" securityGroupSelectorTerms: - tags: Name: "eks-cluster-sg" # Separate subnets for pods podSubnetSelectorTerms: - tags: Name: "pod-subnet" kubernetes.io/role/pod: "1" podSecurityGroupSelectorTerms: - tags: Name: "eks-pod-sg"
포드의 서브넷 선택기에 대한 고려 사항
-
포드 밀도 감소: 노드의 기본 네트워크 인터페이스가 노드 서브넷에 있고 포드 서브넷의 포드에 사용할 수 없으므로
podSubnetSelectorTerms
사용 시 각 노드에서 더 적은 포드를 실행할 수 있습니다. -
서브넷 선택기 제한 사항: 포드 서브넷 선택에는 표준
subnetSelectorTerms
및securityGroupSelectorTerms
구성이 적용되지 않습니다. -
네트워크 계획: 워크로드 요구 사항을 지원하기 위해 노드와 포드 서브넷 모두에서 적절한 IP 주소 공간을 확보합니다.
-
라우팅 구성: 포드 서브넷의 라우팅 테이블과 네트워크 액세스 제어 목록(ACL)이 노드와 포드 서브넷 간의 통신을 위해 올바르게 구성되어 있는지 확인합니다.