

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# 노드를 사용하여 컴퓨팅 리소스 관리
<a name="eks-compute"></a>

Kubernetes 노드는 컨테이너화된 애플리케이션을 실행하는 시스템입니다. 각 노드에는 다음과 같은 구성 요소가 있습니다.
+  ** [컨테이너 런타임](https://kubernetes.io/docs/setup/production-environment/container-runtimes/) ** – 컨테이너 실행을 담당하는 소프트웨어입니다.
+  ** [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) ** – 컨테이너가 정상 상태이고 연결된 포드 내에서 실행되고 있는지 확인합니다.
+  ** [kube-proxy](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/) ** – 포드에 대한 통신을 허용하는 네트워크 규칙을 유지 관리합니다.

자세한 내용은 Kubernetes 문서의 [노드](https://kubernetes.io/docs/concepts/architecture/nodes/)를 참조하세요.

Amazon EKS 클러스터는 [EKS 자동 모드 관리형 노드](automode.md), [자체 관리형 노드](worker.md), [Amazon EKS 관리형 노드 그룹](managed-node-groups.md), [AWS Fargate](fargate.md), [Amazon EKS Hybrid Nodes](hybrid-nodes-overview.md)의 모든 조합에서 포드를 예약할 수 있습니다. 클러스터에 배포된 노드에 대한 자세한 내용은 [AWS Management Console에서 Kubernetes 리소스 보기](view-kubernetes-resources.md) 부분을 참조하세요.

**참고**  
하이브리드 노드를 제외한 노드는 클러스터를 생성할 때 선택한 서브넷과 동일한 VPC에 있어야 합니다. 하지만 노드가 동일한 서브넷에 있을 필요는 없습니다.

## 컴퓨팅 옵션 비교
<a name="_compare_compute_options"></a>

다음 표에는 요구 사항에 가장 적합한 옵션을 결정할 때 평가할 몇 가지 기준이 나와 있습니다. 자체 관리형 노드는 나열된 모든 기준을 지원하는 또 다른 옵션이지만 필요한 수동 유지 관리 작업이 훨씬 더 많습니다. 자세한 내용은 [자체 관리형 노드로 노드 직접 유지](worker.md) 단원을 참조하십시오.

**참고**  
Bottlerocket은 이 표의 일반 정보와 몇 가지 구체적인 차이점이 있습니다. 자세한 내용은 GitHub의 Bottlerocket [설명서](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md)를 참조하세요.


| 기준 | EKS 관리형 노드 그룹 | EKS Auto Mode | Amazon EKS Hybrid Nodes | 
| --- | --- | --- | --- | 
|  [AWS Outposts](https://docs.aws.amazon.com/outposts/latest/userguide/what-is-outposts.html)에 배포 가능   |  아니요  |  아니요  |  아니요  | 
|  [AWS Local Zones](local-zones.md)에 배포할 수 있습니다.  |  예  |  아니요  |  아니요  | 
|  Windows가 필요한 컨테이너를 실행할 수 있습니다.  |  예  |  아니요  |  아니요  | 
|  Linux가 필요한 컨테이너를 실행할 수 있습니다.  |  예  |  예  |  예  | 
|  Inferentia 칩이 필요한 워크로드를 실행할 수 있습니다.  |   [예](inferentia-support.md) — Amazon Linux 노드만 해당  |  예  |  아니요  | 
|  GPU가 필요한 워크로드를 실행할 수 있습니다.  |   [예](eks-optimized-ami.md#gpu-ami) — Amazon Linux 노드만 해당  |  예  |  예  | 
|  Arm 프로세서가 필요한 워크로드를 실행할 수 있습니다.  |   [예](eks-optimized-ami.md#arm-ami)   |  예  |  예  | 
|  AWS [Bottlerocket](https://aws.amazon.com/bottlerocket/)을 실행할 수 있습니다.  |  예  |  예  |  아니요  | 
|  포드가 CPU, 메모리, 스토리지 및 네트워크 리소스를 다른 포드와 공유합니다.  |  예  |  예  |  예  | 
|  Amazon EC2 인스턴스를 배포하고 관리해야 합니다.  |  예  |  아니요-[EC2 관리형 인스턴스](automode-learn-instances.md) 알아보기   |  예-온프레미스의 물리적 또는 가상 머신은 사용자가 선택한 도구로 관리합니다.  | 
|  Amazon EC2 인스턴스의 운영 체제를 보호, 유지 관리 및 패치해야 합니다.  |  예  |  아니요  |  예-물리적 머신 또는 가상 머신에서 실행되는 운영 체제는 사용자가 선택한 도구로 관리합니다.  | 
|  노드 배포 시 추가 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 인수와 같은 부트스트랩 인수를 제공할 수 있습니다.  |  예-사용자 지정 AMI와 함께 `eksctl` 또는 [시작 템플릿](launch-templates.md)을 사용합니다.  |  아니요-[`NodeClass`를 사용하여 노드 구성](create-node-class.md)   |  예-nodeadm을 사용하여 부트스트랩 인수를 사용자 지정할 수 있습니다. [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md) 섹션을 참조하세요.  | 
|  노드에 할당된 IP 주소와 다른 CIDR 블록의 포드에 IP 주소를 할당할 수 있습니다.  |  예 - 사용자 지정 AMI와 함께 시작 템플릿 사용. 자세한 내용은 [시작 템플릿을 사용한 관리형 노드 사용자 지정](launch-templates.md) 단원을 참조하십시오.  |  아니요  |  예-[하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md) 섹션을 참조하세요.  | 
|  노드에 SSH를 연결할 수 있습니다.  |  예  |  아니요-[노드 문제 해결 방법 알아보기](auto-troubleshoot.md)   |  예  | 
|  사용자 지정 AMI 노드에 배포할 수 있습니다.  |  예 - [시작 템플릿](launch-templates.md) 사용   |  아니요  |  예  | 
|  사용자 지정 CNI 노드에 배포할 수 있습니다.  |  예 — 사용자 지정 AMI와 함께 [시작 템플릿](launch-templates.md) 사용  |  아니요  |  예  | 
|  노드 AMI를 직접 업데이트해야 합니다.  |   [예](update-managed-node-group.md) - Amazon EKS 최적화 AMI를 배포한 경우 업데이트가 제공되면 Amazon EKS 콘솔에 알림이 표시됩니다. 콘솔에서 클릭 한 번으로 업데이트를 수행할 수 있습니다. 사용자 정의 AMI를 배포한 경우 업데이트가 제공되면 Amazon EKS 콘솔에 알림이 표시되지 않습니다. 업데이트는 직접 수행해야 합니다.  |  아니요  |  예-물리적 머신 또는 가상 머신에서 실행되는 운영 체제는 사용자가 선택한 도구로 관리합니다. [하이브리드 노드용 운영 체제 준비](hybrid-nodes-os.md) 섹션을 참조하세요.  | 
|  노드 Kubernetes 버전을 직접 업데이트해야 합니다.  |   [예](update-managed-node-group.md) - Amazon EKS 최적화 AMI를 배포한 경우 업데이트가 제공되면 Amazon EKS 콘솔에 알림이 표시됩니다. 콘솔에서 클릭 한 번으로 업데이트를 수행할 수 있습니다. 사용자 정의 AMI를 배포한 경우 업데이트가 제공되면 Amazon EKS 콘솔에 알림이 표시되지 않습니다. 업데이트는 직접 수행해야 합니다.  |  아니요  |  예-자체 선택 도구 또는 `nodeadm`을 사용하여 하이브리드 노드 업그레이드를 관리합니다. [클러스터의 하이브리드 노드 업그레이드](hybrid-nodes-upgrade.md) 섹션을 참조하세요.  | 
|  포트에 Amazon EBS 스토리지를 사용할 수 있습니다.  |   [예](ebs-csi.md)   |  예-통합 기능으로 사용할 수 있습니다. [스토리지 클래스 생성](create-storage-class.md) 방법을 알아봅니다.  |  아니요  | 
|  포드에 Amazon EFS 스토리지를 사용할 수 있습니다.  |   [예](efs-csi.md)   |  예  |  아니요  | 
|  포트에 Amazon FSx for Lustre 스토리지를 사용할 수 있습니다.  |   [예](fsx-csi.md)   |  예  |  아니요  | 
|  서비스에 Network Load Balancer를 사용할 수 있습니다.  |   [예](network-load-balancing.md)   |  예  |  예-대상 유형 `ip`를 사용해야 합니다.  | 
|  포드가 퍼블릭 서브넷에서 실행될 수 있습니다.  |  예  |  예  |  아니요-포드는 온프레미스 환경에서 실행됩니다.  | 
|  개별 포드에 서로 다른 VPC 보안 그룹을 할당할 수 있습니다.  |   [예](security-groups-for-pods.md) — Linux 노드만  |  아니요  |  아니요  | 
|  Kubernetes DaemonSet를 실행할 수 있습니다.  |  예  |  예  |  예  | 
|  포드 매니페스트에서 `HostPort` 및 `HostNetwork`를 지원합니다.  |  예  |  예  |  예  | 
|   AWS 리전 가용성  |   [모든 Amazon EKS 지원 리전](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |   [모든 Amazon EKS 지원 리전](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |   AWS GovCloud(미국) 리전 및 중국 리전을 제외한 [모든 Amazon EKS 지원 리전](https://docs.aws.amazon.com/general/latest/gr/eks.html)  | 
|  Amazon EC2 전용 호스트에서 컨테이너를 실행할 수 있습니다.  |  예  |  아니요  |  아니요  | 
|  요금  |  여러 포드를 실행하는 Amazon EC2 인스턴스의 비용입니다. 자세한 설명은 [Amazon EC2 요금](https://aws.amazon.com/ec2/pricing/)을 참조하세요.  |  클러스터에서 EKS Auto Mode가 활성화된 경우 Auto Mode의 컴퓨팅 기능을 사용하여 시작된 인스턴스에 대해 표준 EC2 인스턴스 요금 외에 별도의 요금을 지불합니다. 금액은 시작된 인스턴스 유형과 클러스터가 위치한 AWS 리전에 따라 다릅니다. 자세한 내용은 [Amazon EKS 요금](https://aws.amazon.com/eks/pricing/)을 참조하세요.  |  시간당 하이브리드 노드 vCPU 비용. 자세한 내용은 [Amazon EKS 요금](https://aws.amazon.com/eks/pricing/)을 참조하세요.  | 

# 관리형 노드 그룹을 사용한 노드 수명 주기 간소화
<a name="managed-node-groups"></a>

Amazon EKS 관리형 노드 그룹은 Amazon EKS Kubernetes 클러스터의 노드(Amazon EC2 인스턴스) 프로비저닝 및 수명 주기 관리를 자동화합니다.

Amazon EKS 관리형 노드 그룹을 사용하면 Kubernetes 애플리케이션을 실행하기 위해 컴퓨팅 용량을 제공하는 Amazon EC2 인스턴스를 별도로 프로비저닝하거나 등록할 필요가 없습니다. 한 번의 조작으로 클러스터에 대한 노드를 자동으로 생성, 업데이트 또는 종료할 수 있습니다. 노드 업데이트 및 종료는 자동으로 노드를 드레이닝하여 애플리케이션을 계속 사용할 수 있도록 합니다.

모든 관리형 노드는 Amazon EKS에서 관리하는 Amazon EC2 Auto Scaling 그룹의 일부로 프로비저닝됩니다. 인스턴스 및 Auto Scaling 그룹을 포함한 모든 리소스는 AWS 계정 내에서 실행됩니다. 각 노드 그룹은 정의한 여러 가용 영역에서 실행됩니다.

관리형 노드 그룹은 노드 자동 복구를 선택적으로 활용하여 노드 상태를 지속적으로 모니터링할 수도 있습니다. 감지된 문제에 자동으로 대응하고 가능한 경우 노드를 교체합니다. 이렇게 하면 수동 개입을 최소화하면서 클러스터의 전반적인 가용성을 높일 수 있습니다. 자세한 내용은 [노드 상태 문제 감지 및 노드 자동 복구 활성화](node-health.md) 섹션을 참조하세요.

Amazon EKS 콘솔, `eksctl`, AWS CLI, AWS API 또는 AWS CloudFormation을 포함한 코드형 인프라를 사용하여 관리형 노드 그룹을 신규 또는 기존 클러스터에 추가할 수 있습니다. 관리형 노드 그룹의 일부로 시작된 노드는 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)에서 자동 검색할 수 있도록 자동으로 태그가 지정됩니다. 노드 그룹을 사용하여 Kubernetes 레이블을 노드에 적용하고 언제든지 업데이트할 수 있습니다.

Amazon EKS 관리형 노드 그룹을 사용하기 위한 추가 비용은 없으며 프로비저닝한 AWS 리소스에 대해서만 비용을 지불합니다. 여기에는 Amazon EC2 인스턴스, Amazon EBS 볼륨, Amazon EKS 클러스터 시간 및 기타 AWS 인프라가 포함됩니다. 최소 요금 및 선수금은 없습니다.

새 Amazon EKS 클러스터 및 관리형 노드 그룹을 시작하려면 [Amazon EKS 시작하기 - AWS Management Console 및 AWS CLI](getting-started-console.md) 부분을 참조하세요.

기존 클러스터에 관리형 노드 그룹을 추가하려면 [클러스터에 대한 관리형 노드 그룹 생성](create-managed-node-group.md)을 참조하세요.

## 관리형 노드 그룹 개념
<a name="managed-node-group-concepts"></a>
+ Amazon EKS 관리형 노드 그룹은 사용자를 위해 Amazon EC2 인스턴스를 생성하고 관리합니다.
+ 모든 관리형 노드는 Amazon EKS에서 관리하는 Amazon EC2 Auto Scaling 그룹의 일부로 프로비저닝됩니다. 게다가 Amazon EC2 인스턴스 및 Auto Scaling 그룹을 포함한 모든 리소스는 AWS 계정 내에서 실행됩니다.
+ 관리형 노드 그룹의 Auto Scaling 그룹은 그룹을 생성할 때 지정하는 모든 서브넷에 걸쳐 있습니다.
+ Amazon EKS는 관리형 노드 그룹 리소스에 태그를 지정하여 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)를 사용하도록 구성합니다.
**중요**  
Amazon EBS 볼륨에 의해 백업되고 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)를 사용하는 상태 기반 애플리케이션을 여러 가용 영역에서 실행하는 경우 각 단일 가용 영역으로 범위가 지정된 여러 노드 그룹을 구성해야 합니다. 또한 `--balance-similar-node-groups` 기능을 활성화해야 합니다.
+ 관리형 노드를 배포할 때 더 높은 수준의 유연성과 사용자 지정을 위해 사용자 정의 시작 템플릿을 사용할 수 있습니다. 예를 들어, 추가`kubelet` 인수를 지정하고 사용자 지정 AMI를 사용할 수 있습니다. 자세한 내용은 [시작 템플릿을 사용한 관리형 노드 사용자 지정](launch-templates.md) 섹션을 참조하세요. 관리형 노드 그룹을 처음 생성할 때 사용자 정의 시작 템플릿을 사용하지 않으면 자동 생성된 시작 템플릿이 표시됩니다. 이 자동 생성된 템플릿을 수동으로 수정하지 마세요. 수정하면 오류가 발생합니다.
+ Amazon EKS는 관리형 노드 그룹의 CVE 및 보안 패치에 대한 공동 책임 모델을 따릅니다. 관리형 노드가 Amazon EKS 최적화 AMI를 실행하는 경우 버그나 문제가 보고될 때 패치 버전의 AMI를 빌드해야 합니다. 수정 사항을 게시할 수 있습니다. 그러나 이렇게 패치된 AMI 버전은 사용자가 관리형 노드 그룹에 배포해야 합니다. 관리형 노드가 사용자 지정 AMI를 실행하는 경우 버그나 문제가 보고되고 AMI를 배포할 때 패치 버전의 AMI를 빌드해야 합니다. 자세한 내용은 [클러스터에 대한 관리형 노드 그룹 업데이트](update-managed-node-group.md) 섹션을 참조하세요.
+ Amazon EKS 관리형 노드 그룹은 퍼블릭 서브넷과 프라이빗 서브넷 모두에서 시작할 수 있습니다. 2020년 4월 22일 또는 이후에 퍼블릭 서브넷에서 관리형 노드 그룹을 시작하는 경우 인스턴스가 클러스터에 성공적으로 조인하려면 서브넷에서 `MapPublicIpOnLaunch`를 true로 설정해야 합니다. 2020년 3월 26일 이후에 `eksctl` 또는 [Amazon EKS 벤딩 AWS CloudFormation 템플릿](creating-a-vpc.md)을 사용하여 퍼블릭 서브넷을 생성한 경우 이 설정이 이미 true로 설정되어 있습니다. 2020년 3월 26일 이전에 퍼블릭 서브넷을 생성한 경우 해당 설정을 수동으로 변경해야 합니다. 자세한 내용은 [서브넷의 퍼블릭 IPv4 주소 지정 속성 수정](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip) 섹션을 참조하세요.
+ 프라이빗 서브넷에 관리형 노드 그룹을 배포할 때 컨테이너 이미지를 가져오기 위해 Amazon ECR에 액세스할 수 있는지 확인해야 합니다. NAT 게이트웨이를 서브넷의 라우팅 테이블에 연결하거나 다음 [AWS 프라이빗 링크 VPC 엔드포인트](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html#ecr-setting-up-vpc-create)를 추가하여 이 작업을 수행할 수 있습니다.
  + Amazon ECR API 엔드포인트 인터페이스 - `com.amazonaws.region-code.ecr.api` 
  + Amazon ECR Docker 레지스트리 API 엔드포인트 인터페이스 – `com.amazonaws.region-code.ecr.dkr` 
  + Amazon S3 게이트웨이 엔드포인트 - `com.amazonaws.region-code.s3` 

  일반적으로 사용되는 다른 서비스와 엔드포인트는 [인터넷 액세스가 제한된 프라이빗 클러스터 배포](private-clusters.md) 섹션을 참조하세요.
+ 관리형 노드 그룹은 [AWS Outposts](eks-outposts.md)나 [AWS Wavelength](https://docs.aws.amazon.com/wavelength/)에 배치할 수 없습니다. 관리형 노드 그룹은 [AWS 로컬 영역](https://aws.amazon.com/about-aws/global-infrastructure/localzones/)에서 생성할 수 있습니다. 자세한 내용은 [AWS 로컬 영역을 통해 지연 시간이 짧은 EKS 클러스터 시작](local-zones.md) 섹션을 참조하세요.
+ 단일 클러스터 내에서 여러 관리형 노드 그룹을 생성할 수 있습니다. 예를 들어, 일부 워크로드에는 표준 Amazon EKS 최적화 Amazon Linux AMI를 사용하는 노드 그룹을 생성하고 GPU 지원이 필요한 워크로드에는 GPU 변형을 사용하는 다른 노드 그룹을 생성할 수 있습니다.
+ 관리형 노드 그룹에 [Amazon EC2 인스턴스 상태 확인](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html) 오류가 발생하면 Amazon EKS는 문제 진단에 도움이 되는 오류 메시지를 반환합니다. 자세한 내용은 [관리형 노드 그룹 오류](troubleshooting.md#troubleshoot-managed-node-groups) 섹션을 참조하세요.
+ Amazon EKS는 관리형 노드 그룹 인스턴스에 Kubernetes 레이블을 추가합니다. 이러한 Amazon EKS 제공 레이블에는 `eks.amazonaws.com` 접두사가 붙습니다.
+ Amazon EKS는 종료 또는 업데이트 중에 Kubernetes API를 사용하여 노드를 자동으로 비웁니다.
+ `AZRebalance`로 노드를 종료하거나 원하는 노드 수를 줄이는 경우 포드 중단 예산은 반영되지 않습니다. 이러한 작업은 노드에서 포드 제거를 시도합니다. 그러나 15분 넘게 걸리면 노드의 모든 포드가 종료되었는지 여부에 관계없이 노드가 종료됩니다. 노드가 종료될 때까지 기간을 연장하려면 Auto Scaling 그룹에 수명 주기 후크를 추가하세요. 자세한 내용을 알아보려면 *Amazon EC2 Auto Scaling 사용 설명서*의 [수명 주기 후크 추가](https://docs.aws.amazon.com/autoscaling/ec2/userguide/adding-lifecycle-hooks.html)를 참조하세요.
+ 스팟 중단 알림 또는 용량 재조정 알림을 수신한 후 드레인 프로세스를 올바르게 실행하려면 `CapacityRebalance`를 `true`로 설정해야 합니다.
+ 관리형 노드 그룹을 업데이트하면 포드에 대해 설정한 포드 중단 예산을 준수합니다. 자세한 내용은 [노드 업데이트의 각 단계 이해](managed-node-update-behavior.md) 섹션을 참조하세요.
+ Amazon EKS 관리형 노드 그룹을 사용하는 데 따른 추가 비용은 없습니다. 프로비저닝하는 AWS 리소스에 대해서만 비용을 지불합니다.
+ 노드에 대해 Amazon EBS 볼륨을 암호화하려는 경우 시작 템플릿을 사용하여 노드를 배포할 수 있습니다. 시작 템플릿을 사용하지 않고 암호화된 Amazon EBS 볼륨이 있는 관리형 노드를 배포하려면 계정에 생성된 모든 새 Amazon EBS 볼륨을 암호화합니다. 자세한 내용은 *Amazon EC2 사용 설명서*에서 [기본적으로 암호화](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html#encryption-by-default)를 참조하세요.

## 관리형 노드 그룹 용량
<a name="managed-node-group-capacity-types"></a>

관리형 노드 그룹을 생성할 때 온디맨드 또는 스팟 용량 유형을 선택할 수 있습니다. Amazon EKS는 온디맨드 또는 Amazon EC2 스팟 인스턴스만 포함하는 Amazon EC2 Auto Scaling 그룹과 함께 관리형 노드 그룹을 배포합니다. 내결함성 애플리케이션이 스팟 관리형 노드 그룹에 대해 포드를 예약하고, 단일 Kubernetes 클러스터 내의 온디맨드 노드 그룹에 내결함성 애플리케이션을 예약할 수 있습니다. 기본적으로 관리형 노드 그룹은 온디맨드 Amazon EC2 인스턴스를 배포합니다.

### 온디맨드
<a name="managed-node-group-capacity-types-on-demand"></a>

온디맨드 인스턴스를 사용하면 장기 약정 없이 초 단위로 컴퓨팅 용량을 구입할 수 있습니다.

기본적으로 **용량 유형**을 지정하지 않은 경우 관리형 노드 그룹이 온디맨드 인스턴스를 사용하여 프로비저닝됩니다. 관리형 노드 그룹은 다음 설정을 적용하여 사용자를 대신하여 Amazon EC2 Auto Scaling 그룹을 구성합니다.
+ 온디맨드 용량을 프로비저닝하기 위한 할당 전략이 `prioritized`로 설정됩니다. 관리형 노드 그룹은 API에 전달된 인스턴스 유형의 순서를 사용하여 온디맨드 용량을 채울 때 먼저 사용할 인스턴스 유형을 결정합니다. 예를 들어, 세 가지 인스턴스 유형을 `c5.large`,`c4.large`, `c3.large`의 순서로 지정할 수 있습니다. 온디맨드 인스턴스가 시작되면 관리형 노드 그룹은 `c5.large`, `c4.large`, `c3.large` 순으로 시작하여 온디맨드 용량을 채웁니다. 자세한 내용은 *Amazon EC2 Auto Scaling 사용 설명서*의 [Amazon EC2 Auto Scaling 그룹](https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-purchase-options.html#asg-allocation-strategies)을 참조하세요.
+ Amazon EKS는 용량 유형을 지정하는 관리형 노드 그룹의 모든 노드에 다음 Kubernetes 레이블을 추가합니다. `eks.amazonaws.com/capacityType: ON_DEMAND`. 이 레이블을 사용하여 온디맨드 노드에서 상태 저장 또는 내결함성이 없는 애플리케이션을 예약할 수 있습니다.

### 스팟
<a name="managed-node-group-capacity-types-spot"></a>

Amazon EC2 스팟 인스턴스는 온디맨드 가격에서 큰 폭의 할인을 제공하는 여분의 Amazon EC2 용량입니다. EC2에서 용량을 복구하려면 2분 중단 알림으로 Amazon EC2 스팟 인스턴스를 중단시킬 수 있습니다. 자세한 내용은 *Amazon EC2 사용 설명서*의 [스팟 인스턴스](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html)를 참조하세요. Amazon EC2 스팟 인스턴스로 관리형 노드 그룹을 구성하여 Amazon EKS 클러스터에서 실행되는 컴퓨팅 노드의 비용을 최적화할 수 있습니다.

관리되는 노드 그룹 내에서 스팟 인스턴스를 사용하려면 용량 유형을 `spot`으로 설정하여 관리형 노드 그룹을 생성합니다. 관리형 노드 그룹은 다음 스팟 모범 사례를 적용하여 사용자를 대신하여 Amazon EC2 Auto Scaling 그룹을 구성합니다.
+ 스팟 노드가 최적의 스팟 용량 풀에서 프로비저닝되도록 다음 중 하나로 할당 전략을 설정합니다.
  +  `price-capacity-optimized`(PCO) - Kubernetes 버전`1.28` 이상의 클러스터에서 새 노드 그룹을 생성할 때 할당 전략은 `price-capacity-optimized`로 설정됩니다. 하지만 Amazon EKS 관리형 노드 그룹이 PCO 지원을 시작하기 전에 `capacity-optimized`로 이미 생성된 노드 그룹의 할당 전략은 변경되지 않습니다.
  +  `capacity-optimized`(CO) - Kubernetes 버전 `1.27` 이하의 클러스터에서 새 노드 그룹을 생성할 때 할당 전략은 `capacity-optimized`로 설정됩니다.

  용량 할당에 사용할 수 있는 스팟 용량 풀 수를 늘리려면 여러 인스턴스 유형을 사용하도록 관리형 노드 그룹을 구성합니다.
+ Amazon EC2 스팟 용량 리밸런싱이 활성화되어 있으므로 Amazon EKS가 스팟 노드를 정상적으로 비우고 리밸런싱하여 스팟 노드가 중단 위험이 높을 때 애플리케이션 중단을 최소화할 수 있습니다. 자세한 내용은 *Amazon EC2 Auto Scaling 사용 설명서*의 [Amazon EC2 Auto Scaling 용량 재분배](https://docs.aws.amazon.com/autoscaling/ec2/userguide/capacity-rebalance.html)를 참조하세요.
  + 스팟 노드가 리밸런싱 권고를 수신하면 Amazon EKS는 자동으로 새로운 대체 스팟 노드를 시작하려고 시도합니다.
  + 교체 스팟 노드가 `Ready` 상태가 되면 Amazon EKS가 재조정 권장 사항을 받은 스팟 노드를 비우기 시작합니다. Amazon EKS는 최선을 다해 노드를 드레이닝합니다. 따라서 Amazon EKS가 기존 노드를 드레이닝하기 전에 대체 노드가 클러스터에 조인할 때까지 기다린다는 보장이 없습니다.
  + 대체 스팟 노드가 부트스트랩되고 `Ready` 상태에서 Amazon EKS 코드를 실행하고 리밸런싱 권장 사항을 받은 스팟 노드를 비웁니다. 스팟 노드를 코드화하면 서비스 컨트롤러가 이 스팟 노드로 새 요청을 보내지 않습니다. 또한 정상 활성 스팟 노드 목록에서 제거합니다. 스팟 노드를 비우면 실행 중인 포드가 정상적으로 제거됩니다.
+ Amazon EKS는 용량 유형을 지정하는 관리형 노드 그룹의 모든 노드에 다음 Kubernetes 레이블을 추가합니다. `eks.amazonaws.com/capacityType: SPOT`. 이 레이블을 사용하여 스팟 노드에서 내결함성 애플리케이션을 예약할 수 있습니다.
**중요**  
EC2는 스팟 인스턴스를 종료하기 2분 전에 [스팟 중단 알림](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-instance-termination-notices.html)을 발행합니다. 그러나 스팟 노드의 포드는 정상적인 종료를 위한 전체 2분의 기간을 받지 못할 수도 있습니다. EC2가 알림을 발행하면 Amazon EKS가 포드 제거를 시작하기 전에 지연이 발생합니다. 제거는 Kubernetes API 서버를 보호하기 위해 순차적으로 수행되므로 여러 동시 스팟 회수 중에 일부 포드가 제거 지연 알림을 수신할 수 있습니다. 포드는 특히 포드 밀도가 높은 노드에서 동시 회수 중에 또는 긴 종료 유예 기간을 사용할 때 종료 신호를 수신하지 않고 강제로 종료될 수 있습니다. 스팟 워크로드의 경우 중단 방지로 애플리케이션을 설계하고 30초 이하의 종료 유예 기간을 사용하며 장시간 실행되는 preStop 후크를 피하고 포드 제거 지표를 모니터링하여 클러스터의 실제 유예 기간을 이해하는 것이 좋습니다. 정상적인 종료를 보장해야 하는 워크로드의 경우 대신 온디맨드 용량을 사용하는 것이 좋습니다.

온디맨드 또는 스팟 용량을 사용하여 노드 그룹을 배포할지 여부를 결정할 때 다음 조건을 고려해야 합니다.
+ 스팟 인스턴스는 유연한 무상태 내결함성 애플리케이션에 적합합니다. 여기에는 배치 및 기계 학습 교육 워크로드, Apache Spark와 같은 빅 데이터 ETL, 대기열 처리 애플리케이션 및 무상태 API 엔드포인트가 포함됩니다. 스팟은 시간이 지남에 따라 변경될 수 있는 예비 Amazon EC2 용량이므로 중단 방지 워크로드에 스팟 용량을 사용하는 것이 좋습니다. 보다 구체적으로 말하면 스팟 용량은 필요한 용량을 사용할 수 없는 기간을 허용할 수 있는 워크로드에 적합합니다.
+ 내결함성이 없는 애플리케이션의 경우 온디맨드를 사용하는 것이 좋습니다. 모니터링 및 운영 도구와 같은 클러스터 관리 도구, `StatefulSets`가 필요한 배포, 상태 유지 애플리케이션(예: 데이터베이스)이 여기에 포함됩니다.
+ 스팟 인스턴스를 사용하는 동안 애플리케이션의 가용성을 극대화하려면 여러 인스턴스 유형을 사용하도록 스팟 관리 노드 그룹을 구성하는 것이 좋습니다. 여러 인스턴스 유형을 사용할 때는 다음 규칙을 적용하는 것이 좋습니다.
  + 관리형 노드 그룹 내에서 [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)를 사용하는 경우 vCPU 및 메모리 리소스의 양이 같은 유연한 인스턴스 유형 집합을 사용하는 것이 좋습니다. 이는 클러스터의 노드가 예상대로 확장되도록 하기 위한 것입니다. 예를 들어, 4개의 vCPU와 8개의 GiB 메모리가 필요한 경우 `c3.xlarge`, `c4.xlarge`, `c5.xlarge`, `c5d.xlarge`, `c5a.xlarge`, `c5n.xlarge` 또는 기타 유사한 인스턴스 유형을 사용합니다.
  + 애플리케이션 가용성을 높이려면 여러 스팟 관리형 노드 그룹을 배포하는 것이 좋습니다. 이를 위해 각 그룹은 동일한 vCPU 및 메모리 리소스를 가진 유연한 인스턴스 유형 집합을 사용해야 합니다. 예를 들어, 4개의 vCPU와 8개의 GiB 메모리가 필요한 경우 `c3.xlarge`, `c4.xlarge`, `c5.xlarge`, `c5d.xlarge`, `c5a.xlarge`, `c5n.xlarge` 또는 기타 유사한 인스턴스 유형을 사용하여 관리형 노드 그룹을 하나 생성하고 `m3.xlarge`, `m4.xlarge`, `m5.xlarge`, `m5d.xlarge`, `m5a.xlarge`, `m5n.xlarge` 또는 기타 유사한 인스턴스 유형을 사용하여 두 번째 관리형 노드 그룹을 생성하는 것이 좋습니다.
  + 사용자 정의 시작 템플릿을 사용하는 스팟 용량 유형으로 노드 그룹을 배포하는 경우 API를 사용하여 여러 인스턴스 유형을 전달합니다. 시작 템플릿을 통해 단일 인스턴스 유형을 전달하지 마세요. 시작 템플릿을 사용하여 노드 그룹을 배포하는 방법에 대한 자세한 내용은 [시작 템플릿을 사용한 관리형 노드 사용자 지정](launch-templates.md) 부분을 참조하세요.

# 클러스터에 대한 관리형 노드 그룹 생성
<a name="create-managed-node-group"></a>

이 주제는 Amazon EKS 클러스터에 등록하는 노드의 Amazon EKS 관리형 노드 그룹을 시작하는 데 도움이 됩니다. 노드가 클러스터에 조인한 이후 Kubernetes 애플리케이션을 배포할 수 있습니다.

Amazon EKS 관리형 노드 그룹을 처음 시작하는 경우, [Amazon EKS 시작하기](getting-started.md)의 가이드 중 하나를 따르는 것이 좋습니다. 이 가이드에서는 노드가 있는 Amazon EKS 클러스터를 생성하기 위한 시연을 제공합니다.

**중요**  
Amazon EKS 노드는 표준 Amazon EC2 인스턴스입니다. 일반 Amazon EC2 가격을 기준으로 요금이 청구됩니다. 자세한 내용은 [Amazon EC2 요금](https://aws.amazon.com/ec2/pricing/)을 참조하세요.
AWS Outposts 또는 AWS Wavelength가 활성화된 AWS 리전에서는 관리형 노드를 만들 수 없습니다. 대신 자체 관리형 노드만 생성할 수 있습니다. 자세한 내용은 [자체 관리형 Amazon Linux 노드 생성](launch-workers.md), [자체 관리형 Microsoft Windows 노드 생성](launch-windows-workers.md), [자체 관리형 Bottlerocket 노드 생성](launch-node-bottlerocket.md) 섹션을 참조하세요. Outpost에서 자체 관리형 Amazon Linux 노드 그룹을 생성할 수도 있습니다. 자세한 내용은 [AWS Outposts에 Amazon Linux 노드 생성](eks-outposts-self-managed-nodes.md) 섹션을 참조하세요.
Amazon EKS 최적화 Linux 또는 Bottlerocket에 포함된 `bootstrap.sh` 파일에 [AMI ID를 지정](launch-templates.md#launch-template-custom-ami)하지 않는 경우 관리형 노드 그룹은 최대 값 수 `maxPods`를 적용합니다. vCPU가 30개 이하인 인스턴스의 경우 최대 수는 `110` 입니다. vCPU가 30개 이상인 인스턴스의 경우 최대 개수가 `250` 로 바뀝니다. 이 적용은 `maxPodsExpression`을 포함하여 다른 `maxPods` 구성을 재정의합니다. `maxPods`가 결정되는 방법과 이를 사용자 지정하는 방법에 대한 자세한 내용은 [maxPods 결정 방법](choosing-instance-type.md#max-pods-precedence) 섹션을 참조하세요.
+ 기존 Amazon EKS 클러스터. 배포하려면 [Amazon EKS 클러스터 생성](create-cluster.md) 섹션을 참조하세요.
+ 노드가 사용할 기존 IAM 역할. 파일을 만들려면 [Amazon EKS 노드 IAM 역할](create-node-role.md) 섹션을 참조하세요. 이 역할에 VPC CNI에 대한 정책 중 하나도 없는 경우 VPC CNI 포드에 대해 다음과 같은 별도의 역할이 필요합니다.
+ (선택 사항이지만 권장됨) 필요한 IAM 정책이 연결된 자체 IAM 역할로 구성된 Kubernetes용 Amazon VPC CNI 플러그인 추가 기능. 자세한 내용은 [IRSA를 사용하도록 Amazon VPC CNI 플러그인 구성](cni-iam-role.md) 섹션을 참조하세요.
+ [최적의 Amazon EC2 노드 인스턴스 유형 선택](choosing-instance-type.md) 에 나열된 고려 사항에 익숙합니다. 선택하는 인스턴스 유형에 따라 클러스터 및 VPC에 대한 추가 전제 조건이 있을 수 있습니다.
+ Windows 관리형 노드 그룹을 추가하려면 먼저 클러스터에 대한 Windows 지원을 활성화해야 합니다. 자세한 내용은 [EKS 클러스터에 Windows 노드 배포](windows-support.md) 섹션을 참조하세요.

다음 중 하나를 사용하여 관리형 노드 그룹을 생성할 수 있습니다.
+  [`eksctl`](#eksctl_create_managed_nodegroup) 
+  [AWS Management Console](#console_create_managed_nodegroup) 

## `eksctl`
<a name="eksctl_create_managed_nodegroup"></a>

 **eksctl로 관리형 노드 그룹 만들기** 

이 절차에는 `eksctl` 버전 `0.215.0` 이상이 필요합니다. 버전은 다음 명령을 통해 확인할 수 있습니다.

```
eksctl version
```

`eksctl` 설치 또는 업데이트에 대한 지침은 `eksctl` 설명서의 [Installation](https://eksctl.io/installation)를 참조하세요.

1. (선택 사항) **AmazonEKS\$1CNI\$1Policy** 관리형 IAM 정책이 [Amazon EKS 노드 IAM 역할](create-node-role.md)에 연결되어 있는 경우 대신 Kubernetes `aws-node` 서비스 계정에 연결한 IAM 역할에 할당하는 것이 좋습니다. 자세한 내용은 [IRSA를 사용하도록 Amazon VPC CNI 플러그인 구성](cni-iam-role.md) 섹션을 참조하세요.

1. 사용자 정의 시작 템플릿을 사용하거나 사용하지 않고 관리형 노드 그룹을 생성합니다. 시작 템플릿을 수동으로 지정하면 노드 그룹을 더욱 수월하게 사용자 지정할 수 있습니다. 예를 들어, Amazon EKS 최적화 AMI의 `boostrap.sh` 스크립트에 사용자 지정 AMI를 배포하거나 인수를 제공할 수 있습니다. 사용 가능한 모든 옵션 및 기본값의 전체 목록을 보려면 다음 명령을 입력합니다.

   ```
   eksctl create nodegroup --help
   ```

   다음 명령에서 *my-cluster*를 클러스터 이름으로 바꾸고 *my-mng*를 노드 그룹 이름으로 바꿉니다. 노드 그룹 이름은 63자를 초과할 수 없습니다. 문자나 숫자로 시작하되, 나머지 문자의 경우 하이픈과 밑줄을 포함할 수 있습니다.
**중요**  
관리형 노드 그룹을 처음 생성할 때 사용자 정의 시작 템플릿을 사용하지 않는 경우 나중에 노드 그룹에 대해 시작 템플릿을 사용하지 마세요. 사용자 정의 시작 템플릿을 지정하지 않은 경우 시스템에서 시작 템플릿을 자동으로 생성하므로 수동으로 수정하지 않는 것이 좋습니다. 이 자동 생성된 시작 템플릿을 수동으로 수정하면 오류가 발생할 수 있습니다.

 **시작 템플릿 제외** 

 `eksctl`은 계정에 기본 Amazon EC2 시작 템플릿을 생성하고 사용자가 지정한 옵션에 따라 생성되는 시작 템플릿을 사용하여 노드 그룹을 배포합니다. `--node-type`의 값을 지정하려면 [최적의 Amazon EC2 노드 인스턴스 유형 선택](choosing-instance-type.md) 부분을 참조하세요.

허용된 키워드로 *ami-family*를 바꿉니다. 자세한 내용은 `eksctl` 설명서의 [노드 AMI 패밀리 설정](https://eksctl.io/usage/custom-ami-support/#setting-the-node-ami-family)을 참조하세요. *my-key*를 Amazon EC2 키 페어 또는 퍼블릭 키 이름으로 바꿉니다. 이 키는 노드를 시작한 후 SSH로 연결하는 데 사용됩니다.

**참고**  
Windows의 경우 이 명령에서 SSH를 활성화하지 않습니다. 대신 Amazon EC2 키 페어를 인스턴스와 연결하고 인스턴스에 RDP할 수 있습니다.

Amazon EC2 키 페어가 아직 없는 경우 AWS Management Console에서 새로 생성할 수 있습니다. Linux에 대한 자세한 내용은 *Amazon EC2 사용 설명서*의 [Amazon EC2 키 페어 및 Linux 인스턴스](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)를 참조하세요. Windows에 대한 자세한 내용은 *Amazon EC2 사용 설명서*의 [Amazon EC2 키 페어 및 Windows 인스턴스](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-key-pairs.html)를 참조하세요.

다음과 같은 조건에 해당하면 IMDS에 대한 포드 액세스를 차단하는 것이 좋습니다.
+ 포드에 필요한 최소 권한만 있도록 모든 Kubernetes 서비스 계정에 IAM 역할을 할당할 계획입니다.
+ 클러스터의 어떤 포드도 현재 AWS 리전 검색 등의 다른 이유로 Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 액세스할 필요가 없습니다.

자세한 내용은 [작업자 노드에 할당된 인스턴스 프로파일에 대한 액세스 제한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 섹션을 참조하세요.

포드가 IMDS에 액세스하지 못하게 차단하고 싶다면 `--disable-pod-imds` 옵션을 다음 명령에 추가합니다.

```
eksctl create nodegroup \
  --cluster my-cluster \
  --region region-code \
  --name my-mng \
  --node-ami-family ami-family \
  --node-type m5.large \
  --nodes 3 \
  --nodes-min 2 \
  --nodes-max 4 \
  --ssh-access \
  --ssh-public-key my-key
```

인스턴스는 필요에 따라 포드에 훨씬 더 많은 수의 IP 주소를 할당하고, 인스턴스와 다른 CIDR 블록의 포드에 IP 주소를 할당하며, 인터넷 액세스 없이 클러스터에 배포할 수 있습니다. 자세한 내용은 [접두사를 사용하여 Amazon EKS 노드에 추가 IP 주소 할당](cni-increase-ip-addresses.md), [사용자 지정 네트워킹을 통해 대체 서브넷에 포드 배포](cni-custom-network.md) 및 [인터넷 액세스가 제한된 프라이빗 클러스터 배포](private-clusters.md)에서 이전 명령에 추가할 추가 옵션을 참조하세요.

관리형 노드 그룹은 인스턴스 유형에 따라 노드 그룹의 각 노드에서 실행될 수 있는 최대 포드 수에 대해 단일 값을 계산하고 적용합니다. 다른 인스턴스 유형으로 노드 그룹을 생성하는 경우 모든 인스턴스 유형에 대해 계산된 가장 작은 값이 노드 그룹의 모든 인스턴스 유형에서 실행될 수 있는 최대 포드 수로 적용됩니다. 관리형 노드 그룹은 에 참조된 스크립트를 사용하여 값을 계산합니다.

 **시작 템플릿 사용** 

시작 템플릿은 이미 존재해야 하며 [시작 템플릿 구성 기본 사항](launch-templates.md#launch-template-basics)에 지정된 요구 사항을 충족해야 합니다. 다음과 같은 조건에 해당하면 IMDS에 대한 포드 액세스를 차단하는 것이 좋습니다.
+ 포드에 필요한 최소 권한만 있도록 모든 Kubernetes 서비스 계정에 IAM 역할을 할당할 계획입니다.
+ 클러스터의 어떤 포드도 현재 AWS 리전 검색 등의 다른 이유로 Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 액세스할 필요가 없습니다.

자세한 내용은 [작업자 노드에 할당된 인스턴스 프로파일에 대한 액세스 제한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 섹션을 참조하세요.

IMDS에 대한 포드 액세스를 차단하려면 시작 템플릿에서 필요한 설정을 지정합니다.

1. 다음 콘텐츠를 디바이스에 복사합니다. 예제 값을 바꾼 다음 수정된 명령을 실행하여 `eks-nodegroup.yaml` 파일을 생성하세요. 시작 템플릿 없이 배포할 때 지정하는 몇 가지 설정이 시작 템플릿으로 이동됩니다. `version`을 지정하지 않으면 템플릿의 기본 버전이 사용됩니다.

   ```
   cat >eks-nodegroup.yaml <<EOF
   apiVersion: eksctl.io/v1alpha5
   kind: ClusterConfig
   metadata:
     name: my-cluster
     region: region-code
   managedNodeGroups:
   - name: my-mng
     launchTemplate:
       id: lt-id
       version: "1"
   EOF
   ```

   `eksctl` config 파일 설정의 전체 목록은 `eksctl` 설명서에서 [Config 파일 스키마](https://eksctl.io/usage/schema/)를 참조하세요. 인스턴스는 필요에 따라 포드에 훨씬 더 많은 수의 IP 주소를 할당하고, 인스턴스와 다른 CIDR 블록의 포드에 IP 주소를 할당하며, 아웃바운드 인터넷 액세스 없이 클러스터에 배포할 수 있습니다. 자세한 내용은 [접두사를 사용하여 Amazon EKS 노드에 추가 IP 주소 할당](cni-increase-ip-addresses.md), [사용자 지정 네트워킹을 통해 대체 서브넷에 포드 배포](cni-custom-network.md) 및 [인터넷 액세스가 제한된 프라이빗 클러스터 배포](private-clusters.md)에서 config 파일에 추가할 추가 옵션을 참조하세요.

   시작 템플릿에서 AMI ID를 지정하지 않은 경우 관리형 노드 그룹은 인스턴스 유형에 따라 노드 그룹의 각 노드에서 실행될 수 있는 최대 포드 수에 대해 단일 값을 계산하고 적용합니다. 다른 인스턴스 유형으로 노드 그룹을 생성하는 경우 모든 인스턴스 유형에 대해 계산된 가장 작은 값이 노드 그룹의 모든 인스턴스 유형에서 실행될 수 있는 최대 포드 수로 적용됩니다. 관리형 노드 그룹은 에 참조된 스크립트를 사용하여 값을 계산합니다.

   시작 템플릿에서 AMI ID를 지정한 경우 [사용자 지정 네트워킹](cni-custom-network.md)을 사용하거나 [인스턴스에 할당된 IP 주소의 수를 늘리고 싶으면](cni-increase-ip-addresses.md) 노드 그룹의 각 노드에서 실행될 수 있는 최대 포드 수를 지정합니다. 자세한 내용은  섹션을 참조하세요.

1. 다음 명령을 사용하여 노드 그룹을 배포합니다.

   ```
   eksctl create nodegroup --config-file eks-nodegroup.yaml
   ```

## AWS Management Console
<a name="console_create_managed_nodegroup"></a>

 **AWS Management Console을 사용하여 관리형 노드 그룹을 생성하려면** 

1. 클러스터 상태가 `ACTIVE`가 되기를 기다립니다. 이미 `ACTIVE` 상태가 아닌 클러스터에 대한 관리형 노드 그룹을 생성할 수 없습니다.

1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)을 엽니다.

1. 관리형 노드 그룹을 만들려는 클러스터의 이름을 선택합니다.

1. **컴퓨팅**을 선택합니다.

1. **노드 그룹 추가**를 선택합니다.

1. **노드 그룹 구성** 페이지에서 적절히 파라미터를 입력하고 **다음**을 선택합니다.
   +  **이름** - 관리형 노드 그룹의 고유한 이름을 입력합니다. 노드 그룹 이름은 63자를 초과할 수 없습니다. 문자나 숫자로 시작하되, 나머지 문자의 경우 하이픈과 밑줄을 포함할 수 있습니다.
   +  **노드 IAM 역할** - 노드 그룹에 사용할 노드 인스턴스 역할을 선택합니다. 자세한 내용은 [Amazon EKS 노드 IAM 역할](create-node-role.md) 섹션을 참조하세요.
**중요**  
클러스터를 생성하는 데 사용된 것과 동일한 역할을 사용할 수 없습니다.
자체 관리형 노드 그룹에서 현재 사용하지 않는 역할을 사용하는 것이 좋습니다. 그렇지 않으면 새로운 자체 관리형 노드 그룹과 함께 사용할 계획입니다. 자세한 내용은 [클러스터에서 관리형 노드 그룹 삭제](delete-managed-node-group.md) 섹션을 참조하세요.
   +  **시작 템플릿 사용** - (선택사항) 기존 시작 템플릿을 사용할지 여부를 선택합니다. **시작 템플릿 이름**을 선택합니다. 그런 다음 **시작 템플릿 버전**을 선택합니다. 버전을 선택하지 않으면 Amazon EKS가 템플릿의 기본 버전을 사용합니다. 시작 템플릿을 사용하면 사용자 지정 AMI 배포를 허용하고, 포드에 훨씬 더 많은 수의 IP 주소를 할당하고, 인스턴스와 다른 CIDR 블록의 포드에 IP 주소를 할당하고, 아웃바운드 인터넷 액세스 없이 클러스터에 노드를 배포하는 등 더욱 다양한 노드 그룹 사용자 지정이 허용됩니다. 자세한 내용은 [접두사를 사용하여 Amazon EKS 노드에 추가 IP 주소 할당](cni-increase-ip-addresses.md), [사용자 지정 네트워킹을 통해 대체 서브넷에 포드 배포](cni-custom-network.md), [인터넷 액세스가 제한된 프라이빗 클러스터 배포](private-clusters.md) 섹션을 참조하세요.

     시작 템플릿은 [시작 템플릿을 사용하여 관리형 노드 사용자 지정](launch-templates.md)의 요구 사항을 충족해야 합니다. 자체 시작 템플릿을 사용하지 않는 경우 Amazon EKS API는 계정에 기본 Amazon EC2 시작 템플릿을 생성하고 기본 시작 템플릿을 사용하여 노드 그룹을 배포합니다.

     [서비스 계정에 대한 IAM 역할](iam-roles-for-service-accounts.md)을 구현하고 AWS 서비스에 대한 액세스 권한이 필요한 모든 포드에 직접 필요한 권한을 할당하며 클러스터의 포드가 현재 AWS 리전 검색 등 다른 이유로 IMDS에 액세스할 필요가 없는 경우 시작 템플릿에서 호스트 네트워킹을 사용하지 않는 포드에 대해 IMDS에 대한 액세스를 사용 중지할 수도 있습니다. 자세한 내용은 [작업자 노드에 할당된 인스턴스 프로파일에 대한 액세스 제한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 섹션을 참조하세요.
   +  **Kubernetes 레이블** - (선택 사항) 관리형 노드 그룹의 노드에 Kubernetes 레이블을 적용하도록 선택할 수 있습니다.
   +  **Kubernetes 테인트** - (선택 사항) 관리형 노드 그룹의 노드에 Kubernetes 테인트를 적용하도록 선택할 수 있습니다. **효과** 메뉴에서 사용할 수 있는 옵션은 ` NoSchedule `, ` NoExecute ` 및 ` PreferNoSchedule `입니다. 자세한 내용은 [레시피: 특정 노드에서 포드가 예약되지 않도록 방지](node-taints-managed-node-groups.md) 섹션을 참조하세요.
   +  **태그** - (선택사항) Amazon EKS 관리형 노드 그룹에 태그를 지정하도록 선택할 수 있습니다. 이러한 태그는 노드 그룹의 다른 리소스(예: Auto Scaling 그룹이나 인스턴스)에는 전파되지 않습니다. 자세한 내용은 [태그를 사용하여 Amazon EKS 리소스 구성](eks-using-tags.md) 섹션을 참조하세요.

1. **컴퓨팅 및 크기 조정 구성 설정** 페이지에서 파라미터를 입력하고 **다음**을 선택합니다.
   +  **AMI 유형** – AMI 유형을 선택합니다. Arm 인스턴스를 배포하는 경우 배포하기 전에 [Amazon EKS 최적화 Arm Amazon Linux AMI](eks-optimized-ami.md#arm-ami)의 고려 사항을 검토해야 합니다.

     이전 페이지에서 시작 템플릿을 지정하고 시작 템플릿에 AMI를 지정한 경우 값을 선택할 수 없습니다. 템플릿의 값이 표시됩니다. 템플릿에 지정된 AMI에서 [AMI 지정하기](launch-templates.md#launch-template-custom-ami)의 요구 사항을 충족해야 합니다.
   +  **용량 유형** - 용량 유형을 선택합니다. 용량 유형을 선택하는 방법에 대한 자세한 내용은 [관리형 노드 그룹 용량](managed-node-groups.md#managed-node-group-capacity-types) 부분을 참조하세요. 동일한 노드 그룹 내에 서로 다른 용량 유형을 혼합할 수 없습니다. 두 용량 유형을 모두 사용하려면 각각 고유한 용량 및 인스턴스 유형을 가진 별도의 노드 그룹을 생성합니다. GPU 가속 워커 노드 프로비저닝 및 조정에 대한 자세한 내용은 [관리형 노드 그룹의 GPU 예약](https://docs.aws.amazon.com/eks/latest/userguide/capacity-blocks-mng.html) 섹션을 참조하세요.
   +  **인스턴스 유형** - 기본적으로 하나 이상의 인스턴스 유형이 지정됩니다. 기본 인스턴스 유형을 제거하려면 인스턴스 유형의 오른쪽에 있는 `X`를 선택합니다. 관리형 노드 그룹에 사용할 인스턴스 유형을 선택합니다. 자세한 내용은 [최적의 Amazon EC2 노드 인스턴스 유형 선택](choosing-instance-type.md) 섹션을 참조하세요.

     콘솔에는 일반적으로 사용되는 인스턴스 유형 세트가 표시됩니다. 표시되지 않은 인스턴스 유형을 사용하여 관리형 노드 그룹을 생성해야 하는 경우 `eksctl`, AWS CLI, AWS CloudFormation 또는 SDK를 사용하여 노드 그룹을 생성합니다. 이전 페이지에서 시작 템플릿을 지정한 경우 인스턴스 유형이 시작 템플릿에 지정되어야 하므로 값을 선택할 수 없습니다. 시작 템플릿의 값이 표시됩니다. **용량 유형**에서 **스팟**을 선택한 경우, 가용성을 높이기 위해 여러 인스턴스 유형을 지정하는 것이 좋습니다.
   +  **디스크 크기** - 노드 루트 볼륨에 사용할 디스크 크기(GiB)를 입력합니다.

     이전 페이지에서 시작 템플릿을 지정한 경우 시작 템플릿에 값을 지정해야 하므로 값을 선택할 수 없습니다.
   +  **원하는 크기** - 시작할 때 관리형 노드 그룹에서 유지해야 하는 현재 노드 수를 지정합니다.
**참고**  
Amazon EKS는 노드 그룹을 자동으로 확장 또는 축소하지 않습니다. 그러나 Kubernetes Cluster Autoscaler가 이 작업을 수행하도록 구성할 수 있습니다. 자세한 내용은 [AWS의 Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)를 참조하세요.
   +  **최소 크기**-관리형 노드 그룹이 확장될 수 있는 최소 노드 수를 지정합니다.
   +  **최대 크기** - 관리형 노드 그룹이 확장될 수 있는 최대 노드 수를 지정합니다.
   +  **노드 그룹 업데이트 구성** - (선택사항) 병렬로 업데이트할 노드의 수 또는 백분율을 선택할 수 있습니다. 이러한 노드는 업데이트 중에 사용할 수 없습니다. **최대 사용 불가**(Maximum unavailable)에서 다음 옵션 중 하나를 선택하고 **값**을 지정합니다.
     +  **숫자** - 노드 그룹에서 병렬로 업데이트할 수 있는 노드 수를 선택하고 지정합니다.
     +  **비율** - 노드 그룹에서 병렬로 업데이트할 수 있는 노드의 비율을 선택하고 지정합니다. 이 기능은 노드 그룹에 많은 수의 노드가 있는 경우에 유용합니다.
   +  **노드 자동 복구 구성**-(선택 사항) **노드 자동 복구 활성화** 확인란을 활성화하면 감지된 문제가 발생할 때 Amazon EKS가 노드를 자동으로 교체합니다. 자세한 내용은 [노드 상태 문제 감지 및 노드 자동 복구 활성화](node-health.md) 섹션을 참조하세요.

1. **네트워킹 지정** 페이지에서 파라미터를 입력하고 **다음**을 선택합니다.
   +  **서브넷** - 관리형 노드를 시작할 서브넷을 선택합니다.
**중요**  
Amazon EBS 볼륨에 의해 백업되고 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)를 사용하는 상태 기반 애플리케이션을 여러 가용 영역에서 실행하는 경우 각 단일 가용 영역으로 범위가 지정된 여러 노드 그룹을 구성해야 합니다. 또한 `--balance-similar-node-groups` 기능을 활성화해야 합니다.
**중요**  
퍼블릭 서브넷을 선택한 경우 클러스터에 퍼블릭 API 서버 엔드포인트만 활성화되어 있으면, 인스턴스의 서브넷에 `MapPublicIPOnLaunch`가 `true`로 설정되어 있어야 클러스터에 성공적으로 조인할 수 있습니다. 2020년 3월 26일 이후에 `eksctl` 또는 [Amazon EKS 벤딩 AWS CloudFormation 템플릿](creating-a-vpc.md)을 사용하여 퍼블릭 서브넷을 생성한 경우 이 설정이 이미 `true`로 설정되어 있습니다. 2020년 3월 26일 이전에 `eksctl` 또는 AWS CloudFormation 템플릿으로 서브넷을 생성한 경우 해당 설정을 수동으로 변경해야 합니다. 자세한 내용은 [서브넷의 퍼블릭 IPv4 주소 지정 속성 수정](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip) 섹션을 참조하세요.
시작 템플릿을 사용하고 여러 네트워크 인터페이스를 지정하는 경우 `MapPublicIpOnLaunch`가 `true`로 설정되어 있더라도 Amazon EC2가 퍼블릭 `IPv4` 주소를 자동으로 할당하지 않습니다. 이 시나리오에서 노드가 클러스터에 조인하려면 클러스터의 프라이빗 API 서버 엔드포인트를 활성화하거나 NAT 게이트웨이와 같은 대체 방법을 통해 제공되는 아웃바운드 인터넷 액세스를 사용하여 프라이빗 서브넷에서 노드를 시작해야 합니다. 자세한 내용은 *Amazon EC2 사용 설명서*의 [인스턴스 IP 주소 지정](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html)을 참조하세요.
   +  **노드에 대한 SSH 액세스 구성**(선택사항). SSH를 활성화하면 문제가 있는 경우 인스턴스에 연결하여 진단 정보를 수집할 수 있습니다. 노드 그룹을 생성할 때 원격 액세스를 사용 설정하는 것이 좋습니다. 노드 그룹을 생성한 후에는 원격 액세스를 사용 설정할 수 없습니다.

     시작 템플릿을 사용하도록 선택한 경우 이 옵션은 표시되지 않습니다. 노드에 대한 원격 액세스를 활성화하려면 시작 템플릿에 키 페어를 지정하고 시작 템플릿에서 지정한 보안 그룹의 노드에 적절한 포트가 열려 있는지 확인합니다. 자세한 내용은 [사용자 지정 보안 그룹 사용](launch-templates.md#launch-template-security-groups) 섹션을 참조하세요.
**참고**  
Windows의 경우 이 명령에서 SSH를 활성화하지 않습니다. 대신 Amazon EC2 키 페어를 인스턴스와 연결하고 인스턴스에 RDP할 수 있습니다.
   + **SSH 키 페어**에서 사용할 Amazon EC2 SSH 키를 선택합니다. Linux에 대한 자세한 내용은 *Amazon EC2 사용 설명서*의 [Amazon EC2 키 페어 및 Linux 인스턴스](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)를 참조하세요. Windows에 대한 자세한 내용은 *Amazon EC2 사용 설명서*의 [Amazon EC2 키 페어 및 Windows 인스턴스](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-key-pairs.html)를 참조하세요. 시작 템플릿을 사용하도록 선택한 경우 시작 템플릿을 선택할 수 없습니다. Bottlerocket AMI를 사용하여 노드 그룹에 Amazon EC2 SSH 키가 제공되면 관리 컨테이너도 사용됩니다. 자세한 내용은 GitHub의 [Admin container](https://github.com/bottlerocket-os/bottlerocket#admin-container)를 참조하세요.
   + 특정 인스턴스에 대한 액세스를 제한하려면 **다음에서 SSH 원격 액세스 허용(Allow SSH remote access from)**에서 해당 인스턴스에 연결된 보안 그룹을 선택합니다. 특정 보안 그룹을 선택하지 않는 경우, 인터넷의 어느 곳에서나(`0.0.0.0/0`) SSH 액세스가 허용됩니다.

1. **검토 및 생성** 페이지에서 관리형 노드 그룹 구성을 검토하고 **생성**을 선택합니다.

   노드가 클러스터에 조인하지 못한 경우 문제 해결 장의 [노드가 클러스터 조인에 실패](troubleshooting.md#worker-node-fail) 섹션을 참조하세요.

1. 노드의 상태를 확인하고 `Ready` 상태가 될 때까지 대기합니다.

   ```
   kubectl get nodes --watch
   ```

1. (GPU 노드만 해당) GPU 인스턴스 유형과 Amazon EKS 최적화 가속 AMI를 선택한 경우 클러스터에 [Kubernetes용 NVIDIA 디바이스 플러그인](https://github.com/NVIDIA/k8s-device-plugin)을 DaemonSet으로 적용해야 합니다. 다음 명령을 실행하기 전에 *vX.X.X*를 원하는 [NVIDIA/k8s-device-plugin](https://github.com/NVIDIA/k8s-device-plugin/releases) 버전으로 바꿉니다.

   ```
   kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/deployments/static/nvidia-device-plugin.yml
   ```

## Kubernetes 추가 기능 설치
<a name="_install_kubernetes_add_ons"></a>

정상 작동하는 Amazon EKS 클러스터와 노드가 있으므로, Kubernetes 추가 기능을 설치하고 클러스터에 애플리케이션을 배포하기 시작할 준비가 되었습니다. 다음은 클러스터의 기능을 확장하는 데 도움이 되는 설명서 주제입니다.
+ 클러스터를 생성한 [IAM 위탁자](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)는 `kubectl` 또는 AWS Management Console을 사용하여 Kubernetes API 서버를 직접적으로 직접 호출할 수 있는 유일한 위탁자입니다. 다른 IAM 보안 주체가 클러스터에 액세스할 수 있게 하려면 해당 보안 주체를 추가해야 합니다. 자세한 내용은 [IAM 사용자 및 역할에 Kubernetes API에 대한 액세스 권한 부여](grant-k8s-access.md) 및 [필수 권한](view-kubernetes-resources.md#view-kubernetes-resources-permissions)(을)를 참조하세요.
+ 다음과 같은 조건에 해당하면 IMDS에 대한 포드 액세스를 차단하는 것이 좋습니다.
  + 포드에 필요한 최소 권한만 있도록 모든 Kubernetes 서비스 계정에 IAM 역할을 할당할 계획입니다.
  + 클러스터의 어떤 포드도 현재 AWS 리전 검색 등의 다른 이유로 Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 액세스할 필요가 없습니다.

  자세한 내용은 [작업자 노드에 할당된 인스턴스 프로필에 대한 액세스 제한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 부분을 참조하세요.
+ 노드 그룹의 노드 수를 자동으로 조정하도록 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)를 구성합니다.
+ 클러스터에 [샘플 애플리케이션](sample-deployment.md)을 배포합니다.
+  클러스터를 관리하기 위한 중요한 도구를 사용하여 [클러스터 리소스를 구성하고 모니터링](eks-managing.md)합니다.

# 클러스터에 대한 관리형 노드 그룹 업데이트
<a name="update-managed-node-group"></a>

관리형 노드 그룹 업데이트를 시작하면 Amazon EKS가 [노드 업데이트의 각 단계 이해](managed-node-update-behavior.md)에 나열된 단계를 완료하여 자동으로 노드를 업데이트합니다. Amazon EKS 최적화 AMI를 사용하는 경우 Amazon EKS는 최신 AMI 릴리스 버전의 일부로 최신 보안 패치 및 운영 체제 업데이트를 노드에 자동으로 적용합니다.

Amazon EKS 관리형 노드 그룹의 버전 또는 구성을 업데이트하는 것이 유용한 몇 가지 시나리오가 있습니다.
+ Amazon EKS 클러스터의 Kubernetes 버전을 업데이트했으며 동일한 Kubernetes 버전을 사용하도록 노드를 업데이트하려고 합니다.
+ 관리형 노드 그룹에 새 AMI 릴리스 버전을 사용할 수 있습니다. AMI 버전에 대한 자세한 내용은 다음 섹션을 참조하세요.
  +  [Amazon Linux AMI 버전 정보 검색](eks-linux-ami-versions.md) 
  +  [최적화된 Bottlerocket AMI를 사용한 노드 생성](eks-optimized-ami-bottlerocket.md) 
  +  [Windows AMI 버전 정보 검색](eks-ami-versions-windows.md) 
+ 관리형 노드 그룹에 있는 인스턴스의 최소, 최대 또는 원하는 수를 조정하려고 합니다.
+ 관리형 노드 그룹의 인스턴스에서 Kubernetes 레이블을 추가하거나 제거하려고 합니다.
+ 관리형 노드 그룹에서 AWS 태그를 추가하거나 제거하려고 합니다.
+ 업데이트된 사용자 지정 AMI와 같은 구성 변경 사항이 있는 시작 템플릿의 새 버전을 배포해야 합니다.
+ Amazon VPC CNI 추가 기능의 버전 `1.9.0` 이상을 배포하고, 접두사 위임에 대해 추가 기능을 사용하도록 설정했으며, 노드 그룹의 새로운 AWS Nitro System 인스턴스가 크게 증가된 포드 수를 지원하도록 했습니다. 자세한 내용은 [접두사를 사용하여 Amazon EKS 노드에 추가 IP 주소 할당](cni-increase-ip-addresses.md) 섹션을 참조하세요.
+ Windows 노드에 대해 IP 접두사 위임을 활성화했으며 노드 그룹의 새 AWS Nitro System 인스턴스가 크게 늘어난 수의 포드를 지원하도록 하려고 합니다. 자세한 내용은 [접두사를 사용하여 Amazon EKS 노드에 추가 IP 주소 할당](cni-increase-ip-addresses.md) 섹션을 참조하세요.

관리형 노드 그룹의 Kubernetes 버전에 대한 최신 AMI 릴리스 버전이 있는 경우 노드 그룹의 버전을 업데이트하여 최신 AMI 버전을 사용할 수 있습니다. 마찬가지로 클러스터에서 노드 그룹보다 최신 버전의 Kubernetes 버전을 실행 중인 경우 최신 AMI 릴리스 버전을 사용하여 클러스터의 Kubernetes 버전과 일치하도록 노드 그룹을 업데이트할 수 있습니다.

크기 조정 작업 또는 업데이트로 인해 관리형 노드 그룹의 노드가 종료되면 해당 노드의 포드가 먼저 드레이닝됩니다. 자세한 내용은 [노드 업데이트의 각 단계 이해](managed-node-update-behavior.md) 섹션을 참조하세요.

## 노드 그룹 버전 업데이트
<a name="mng-update"></a>

다음 중 하나를 사용하여 노드 그룹 버전을 업데이트할 수 있습니다.
+  [`eksctl`](#eksctl_update_managed_nodegroup) 
+  [AWS Management Console](#console_update_managed_nodegroup) 

업데이트하는 버전은 컨트롤 플레인 버전보다 이후일 수 없습니다.

## `eksctl`
<a name="eksctl_update_managed_nodegroup"></a>

 **`eksctl`를 사용하여 관리형 노드 그룹 업데이트** 

다음 명령을 사용하여 노드에 현재 배포된 동일한 Kubernetes 버전의 최신 AMI 릴리스로 관리형 노드 그룹을 업데이트합니다. 모든 *예제 값*을 자신의 값으로 바꾸세요.

```
eksctl upgrade nodegroup \
  --name=node-group-name \
  --cluster=my-cluster \
  --region=region-code
```

**참고**  
시작 템플릿과 함께 배포된 노드 그룹을 새 시작 템플릿 버전으로 업그레이드하는 경우 이전 명령에 `--launch-template-version version-number `을 추가합니다. 시작 템플릿은 [시작 템플릿 을 사용하여 관리형 노드 사용자 지정](launch-templates.md)에 설명된 요구 사항을 충족해야 합니다. 시작 템플릿에 사용자 지정 AMI 가 포함되어 있는 경우 해당 AMI가 [AMI 지정](launch-templates.md#launch-template-custom-ami)의 요구 사항을 충족해야 합니다. 노드 그룹을 최신 버전의 시작 템플릿으로 업그레이드하면 지정된 시작 템플릿 버전의 새 구성과 일치하도록 모든 노드가 재활용됩니다.

시작 템플릿 없이 배포된 노드 그룹은 새 시작 템플릿 버전으로 직접 업그레이드할 수 없습니다. 대신 시작 템플릿을 사용하여 새 노드 그룹을 배포하여 노드 그룹을 새 시작 템플릿 버전으로 업데이트해야 합니다.

노드 그룹을 컨트롤 플레인의 Kubernetes 버전과 동일한 버전으로 업그레이드할 수 있습니다. 예를 들어 Kubernetes `1.35`을 실행하는 클러스터가 있는 경우 다음 명령을 사용하여 현재 Kubernetes `1.34`을 실행 중인 노드를 버전 `1.35`으로 업그레이드할 수 있습니다.

```
eksctl upgrade nodegroup \
  --name=node-group-name \
  --cluster=my-cluster \
  --region=region-code \
  --kubernetes-version=1.35
```

## AWS Management Console
<a name="console_update_managed_nodegroup"></a>

 **AWS Management Console를 사용하여 관리형 노드 그룹 업데이트** 

1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)을 엽니다.

1. 업데이트할 노드 그룹이 포함된 클러스터를 선택합니다.

1. 하나 이상의 노드 그룹에 사용 가능한 업데이트가 있는 경우 페이지 상단에 사용 가능한 업데이트를 알리는 상자가 나타납니다. **컴퓨팅** 탭을 선택하면 사용 가능한 업데이트가 있는 노드 그룹에 대한 **노드 그룹** 테이블의 **AMI 릴리스 버전** 열에 **지금 업데이트**가 표시됩니다. 노드 그룹을 업데이트하려면 **지금 업데이트**를 선택합니다.

   사용자 지정 AMI와 함께 배포된 노드 그룹에 대한 알림이 표시되지 않습니다. 노드가 사용자 지정 AMI와 함께 배포된 경우 다음 단계를 완료하여 새로운 업데이트된 사용자 지정 AMI를 배포합니다.

   1. AMI의 새 버전을 생성합니다.

   1. 새 AMI ID를 사용하여 새 시작 템플릿 버전을 생성합니다.

   1. 노드를 새 버전의 시작 템플릿으로 업그레이드합니다.

1. **노드 그룹 버전 업데이트** 대화 상자에서 다음과 같은 옵션을 활성화하거나 비활성화합니다.
   +  **노드 그룹 버전 업데이트** - 사용자 지정 AMI를 배포했거나 Amazon EKS에 최적화된 AMI가 현재 클러스터의 최신 버전에 있는 경우에는 이 옵션을 사용할 수 없습니다.
   +  **시작 템플릿 버전 변경** - 노드 그룹이 사용자 지정 시작 템플릿 없이 배포된 경우에는 이 옵션을 사용할 수 없습니다. 사용자 지정 시작 템플릿을 사용하여 배포된 노드 그룹의 시작 템플릿 버전만 업데이트할 수 있습니다. 노드 그룹을 업데이트할 **시작 템플릿 버전**을 선택합니다. 노드 그룹이 사용자 지정 AMI로 구성된 경우 선택한 버전에서도 AMI를 지정해야 합니다. 최신 버전의 시작 템플릿으로 업그레이드하면 지정된 시작 템플릿 버전의 새 구성과 일치하도록 모든 노드가 재활용됩니다.

1. **전략 업데이트**의 경우, 다음과 같은 옵션 중 하나를 선택합니다.
   +  **롤링 업데이트** - 이 옵션은 클러스터에 대한 포드 중단 예산을 고려합니다. 포드 중단 예산 문제로 인해 Amazon EKS에서 이 노드 그룹에서 실행 중인 포드를 적절하게 드레이닝할 수 없는 경우 업데이트에 실패합니다.
   +  **강제 업데이트** - 이 옵션은 포드 중단 예산을 따르지 않습니다. 노드 재시작을 강제로 적용하여 포드 중단 예산 문제와 관계없이 업데이트가 수행됩니다.

1. **업데이트**를 선택합니다.

## 노드 그룹 구성 편집
<a name="mng-edit"></a>

관리형 노드 그룹의 일부 구성을 수정할 수 있습니다.

1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)을 엽니다.

1. 편집할 노드 그룹이 포함된 클러스터를 선택합니다.

1. **컴퓨팅** 탭을 선택합니다.

1. 편집할 노드 그룹을 선택한 다음에 **편집**을 선택합니다.

1. (선택사항) **노드 그룹 편집** 페이지에서 다음을 수행합니다.

   1. **노드 그룹 크기 조정 구성**을 편집합니다.
      +  **원하는 크기** - 관리형 노드 그룹에서 유지해야 하는 현재 노드 수를 지정합니다.
      +  **최소 크기**-관리형 노드 그룹이 확장될 수 있는 최소 노드 수를 지정합니다.
      +  **최대 크기** - 관리형 노드 그룹이 확장될 수 있는 최대 노드 수를 지정합니다. 노드 그룹에서 지원되는 최대 노드 수는 [Amazon EKS 및 Fargate Service Quotas 보기 및 관리](service-quotas.md) 섹션을 참조하세요.

   1. (선택 사항) **Kubernetes 레이블**을 노드 그룹의 노드에 추가하거나 제거합니다. 여기에 표시된 레이블은 Amazon EKS에 적용한 레이블일 뿐입니다. 여기에 표시되지 않는 노드에 다른 레이블이 존재할 수 있습니다.

   1. (선택 사항) **Kubernetes 테인트**를 노드 그룹의 노드에 추가하거나 제거합니다. 추가된 테인트는 ` NoSchedule `,` NoExecute ` 또는 ` PreferNoSchedule ` 중 하나의 효과를 가질 수 있습니다. 자세한 내용은 [레시피: 특정 노드에서 포드가 예약되지 않도록 방지](node-taints-managed-node-groups.md) 섹션을 참조하세요.

   1. (선택사항) **태그**를 추가하거나 노드 그룹 리소스에서 제거합니다. 이러한 태그는 Amazon EKS 노드 그룹에만 적용됩니다. 노드 그룹의 서브넷 또는 Amazon EC2 인스턴스 등의 다른 리소스로 전파되지 않습니다.

   1. (선택사항) **노드 그룹 업데이트 구성**을 편집합니다. **숫자** 또는 **비율**을 선택합니다.
      +  **숫자** - 노드 그룹에서 병렬로 업데이트할 수 있는 노드 수를 선택하고 지정합니다. 이러한 노드는 업데이트 중에 사용할 수 없습니다.
      +  **비율** - 노드 그룹에서 병렬로 업데이트할 수 있는 노드의 비율을 선택하고 지정합니다. 이러한 노드는 업데이트 중에 사용할 수 없습니다. 이 기능은 노드 그룹에 많은 노드가 있는 경우에 유용합니다.

   1. 편집을 마쳤으면 **변경 사항 저장**을 선택합니다.

**중요**  
노드 그룹 구성을 업데이트할 때 [https://docs.aws.amazon.com/eks/latest/APIReference/API_NodegroupScalingConfig.html](https://docs.aws.amazon.com/eks/latest/APIReference/API_NodegroupScalingConfig.html)를 수정해도 포드 중단 예산(PDB)이 반영되지 않습니다. 업그레이드 단계에서 노드를 소모시키고 PDB를 고려하는 [노드 그룹 업데이트](managed-node-update-behavior.md) 프로세스와 달리, 스케일링 구성을 업데이트하면 Auto Scaling 그룹(ASG) 스케일 다운 직접 호출을 통해 노드가 즉시 종료됩니다. 이는 스케일 다운하려는 대상 크기와 상관없이 PDB를 고려하지 않고 이루어집니다. 즉, Amazon EKS 관리형 노드 그룹의 `desiredSize`를 줄이면 포드는 PDB를 적용하지 않고 노드가 종료되는 즉시 제거됩니다.

# 노드 업데이트의 각 단계 이해
<a name="managed-node-update-behavior"></a>

Amazon EKS 관리형 작업자 노드 업그레이드 전략에는 다음 섹션에서 설명하는 4가지 단계가 있습니다.

## 설정 단계
<a name="managed-node-update-set-up"></a>

설정 단계는 다음과 같습니다.

1. 노드 그룹과 연결된 Auto Scaling 그룹의 새 Amazon EC2 시작 템플릿 버전을 생성합니다. 새 시작 템플릿 버전은 업데이트를 위해 대상 AMI 또는 사용자 지정 시작 템플릿 버전을 사용합니다.

1. 최신 시작 템플릿 버전을 사용하도록 Auto Scaling 그룹을 업데이트합니다.

1. 노드 그룹의 `updateConfig` 속성을 사용하여 병렬로 업그레이드할 최대 노드 수를 결정합니다. 사용할 수 없는 최대 노드의 할당량은 100개입니다. 기본값은 노드 1개입니다. 자세한 내용은 *Amazon EKS API 참조*에서 [updateConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateNodegroupConfig.html#API_UpdateNodegroupConfig_RequestSyntax) 속성을 참조하세요.

## 확장 단계
<a name="managed-node-update-scale-up"></a>

관리형 노드 그룹의 노드를 업그레이드할 때 업그레이드된 노드는 업그레이드 중인 노드와 동일한 가용 영역에서 시작됩니다. 이 배치를 보장하기 위해 Amazon EC2의 가용 영역 재분배를 사용합니다. 자세한 내용은 *Amazon EC2 Auto Scaling 사용 설명서*의 [가용 영역 재분배](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-benefits.html#AutoScalingBehavior.InstanceUsage)를 참조하세요. 이 요구 사항이 충족되도록 관리형 노드 그룹의 가용 영역당 최대 2개의 인스턴스를 시작할 수 있습니다.

확장 단계는 다음과 같습니다.

1. Auto Scaling 그룹의 최대 크기와 원하는 크기를 다음 중 더 큰 값으로 늘립니다.
   + Auto Scaling 그룹이 배포된 가용 영역 수의 최대 2배.
   + 업그레이드할 수 없는 최대값입니다.

     예를 들어, 노드 그룹에 5개의 가용 영역이 있고 `maxUnavailable`이 하나인 경우 업그레이드 프로세스에서 최대 10개의 노드를 시작할 수 있습니다. 하지만 `maxUnavailable`이 20이거나 10보다 크면 프로세스에서 20개의 새 노드를 시작합니다.

1. Auto Scaling 그룹 크기를 조정한 후 해당 노드 그룹에 최신 설정을 사용하는 노드가 있는지 확인합니다. 이 단계는 다음 기준을 충족하는 경우에만 성공합니다.
   + 노드가 있는 모든 가용 영역에서 하나 이상의 새 노드가 시작됩니다.
   + 모든 새 노드는 `Ready` 상태여야 합니다.
   + 새 노드에 Amazon EKS 적용 레이블이 있어야 합니다.

     다음은 일반 노드 그룹에 있는 작업자 노드의 Amazon EKS 적용 레이블입니다.
     +  `eks.amazonaws.com/nodegroup-image=$amiName` 
     +  `eks.amazonaws.com/nodegroup=$nodeGroupName` 

     다음은 사용자 정의 시작 템플릿 또는 AMI 노드 그룹에 있는 작업자 노드의 Amazon EKS 적용 레이블입니다.
     +  `eks.amazonaws.com/nodegroup-image=$amiName` 
     +  `eks.amazonaws.com/nodegroup=$nodeGroupName` 
     +  `eks.amazonaws.com/sourceLaunchTemplateId=$launchTemplateId` 
     +  `eks.amazonaws.com/sourceLaunchTemplateVersion=$launchTemplateVersion` 

1. 새 포드의 예약을 피하기 위해 노드를 스케줄 불가능으로 표시합니다. 또한 노드를 종료하기 전에 로드 밸런서에서 이전 노드를 제거하도록 `node.kubernetes.io/exclude-from-external-load-balancers=true`로 노드에 레이블을 지정합니다.

이 단계에서 `NodeCreationFailure` 오류가 발생하는 알려진 이유는 다음과 같습니다.

 **가용 영역의 용량 부족**   
요청된 인스턴스 유형의 용량이 가용 영역에 없을 가능성이 있습니다. 관리형 노드 그룹을 생성하는 동안 여러 인스턴스 유형을 구성하는 것이 좋습니다.

 **계정의 EC2 인스턴스 제한**   
Service Quotas를 사용하여 계정이 동시에 실행할 수 있는 Amazon EC2 인스턴스 수를 늘려야 할 수 있습니다. 자세한 내용은 *Linux 인스턴스용 Amazon Elastic Compute Cloud 사용 설명서*의 [EC2 Service Quotas](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html)를 참조하세요.

 **사용자 정의 사용자 데이터**   
사용자 정의 사용자 데이터로 인해 부트스트랩 프로세스가 중단될 수 있습니다. 이 시나리오에서는 노드에서 `kubelet`이 시작되지 않거나 예상되는 Amazon EKS 레이블을 가져오지 못할 수 있습니다. 자세한 내용은 [AMI 지정](launch-templates.md#launch-template-custom-ami) 섹션을 참조하세요.

 **노드를 비정상적이거나 준비되지 않은 상태로 만드는 모든 변경 사항**   
노드 디스크 압력, 메모리 압력 및 이와 유사한 조건으로 인해 노드가 `Ready` 상태가 되지 않을 수 있습니다.

 **15분 내에 각 노드 대부분 부트스트랩**   
노드가 클러스터를 부트스트랩하고 조인하는 데 15분 이상 걸리는 경우 업그레이드 시간이 초과됩니다. 새 노드가 필요한 시점부터 클러스터에 조인할 때까지 측정된 새 노드 부트스트래핑을 위한 총 런타임입니다. 관리형 노드 그룹을 업그레이드할 때 Auto Scaling 그룹 크기가 커지는 즉시 시간 카운터가 시작됩니다.

## 업그레이드 단계
<a name="managed-node-update-upgrade"></a>

업그레이드 단계는 *업데이트 전략*에 따라 두 가지 방식으로 작동합니다. **기본**과 **최소**의 두 가지 업데이트 전략이 있습니다.

대부분의 시나리오에서는 기본 전략을 사용하는 것이 좋습니다. 이 전략은 이전 노드를 종료하기 전에 새 노드를 생성하므로 업그레이드 단계에서 사용 가능한 용량이 유지됩니다. 최소 전략은 GPU 등의 하드웨어 액셀러레이터와 같이 리소스 또는 비용에 제약이 있는 시나리오에서 유용합니다. 이 전략은 새 노드를 생성하기 전에 이전 노드를 종료하므로 총 용량이 구성된 수량을 초과하여 증가하지 않습니다.

*기본* 업데이트 전략에는 다음 단계가 있습니다.

1. Auto Scaling 그룹에서 노드의 양(원하는 수)을 늘려 노드 그룹이 추가 노드를 생성하게 합니다.

1. 노드 그룹에 대해 구성된 사용 불가능한 최대값까지 업그레이드해야 하는 노드를 무작위로 선택합니다.

1. 노드에서 포드를 드레이닝합니다. 포드가 15분 이내에 노드를 떠나지 않고 force 플래그가 없으면 `PodEvictionFailure` 오류와 함께 업그레이드 단계가 실패합니다. 이 시나리오에서는 `update-nodegroup-version` 요청과 함께 force 플래그를 적용하여 포드를 삭제할 수 있습니다.

1. 모든 포드가 제거된 후 노드를 차단하고 60초 동안 기다립니다. 이 작업은 서비스 컨트롤러가 이 노드에 새 요청을 보내지 않고 활성 노드 목록에서 이 노드를 제거하도록 하기 위해 수행됩니다.

1. 코드화된 노드에 대한 Auto Scaling 그룹에 종료 요청을 보냅니다.

1. 이전 버전의 시작 템플릿으로 배포된 노드 그룹에 노드가 없을 때까지 이전 업그레이드 단계를 반복합니다.

*최소* 업데이트 전략에는 다음 단계가 있습니다.

1. 서비스 컨트롤러가 이러한 노드에 새 요청을 보내지 않도록 처음부터 노드 그룹의 모든 노드를 차단합니다.

1. 노드 그룹에 대해 구성된 사용 불가능한 최대값까지 업그레이드해야 하는 노드를 무작위로 선택합니다.

1. 선택한 노드에서 포드를 드레이닝합니다. 포드가 15분 이내에 노드를 떠나지 않고 force 플래그가 없으면 `PodEvictionFailure` 오류와 함께 업그레이드 단계가 실패합니다. 이 시나리오에서는 `update-nodegroup-version` 요청과 함께 force 플래그를 적용하여 포드를 삭제할 수 있습니다.

1. 모든 포드가 제거되면 60초 동안 기다린 후 선택한 노드의 Auto Scaling 그룹에 종료 요청을 전송합니다. Auto Scaling 그룹이 누락된 용량을 대체하기 위해 (선택한 노드 수와 동일하게) 새 노드를 생성합니다.

1. 이전 버전의 시작 템플릿으로 배포된 노드 그룹에 노드가 없을 때까지 이전 업그레이드 단계를 반복합니다.

### 업그레이드 단계 중 `PodEvictionFailure` 오류
<a name="_podevictionfailure_errors_during_the_upgrade_phase"></a>

이 단계에서 `PodEvictionFailure` 오류가 발생하는 알려진 이유는 다음과 같습니다.

 **적극적인 PDB**   
적극적인 PDB가 포드에 정의되어 있거나 동일한 포드를 가리키는 여러 PDB가 있습니다.

 **모든 테인트를 허용하는 배포**   
모든 포드가 제거되면 이전 단계에서 노드가 [테인트](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)되었기 때문에 노드가 비어 있어야 합니다. 그러나 배포가 모든 테인트를 허용하는 경우 노드가 비어 있지 않을 가능성이 높아져 포드 제거 실패로 이어집니다.

## 축소 단계
<a name="managed-node-update-scale-down"></a>

축소 단계는 Auto Scaling 그룹의 최대 크기와 원하는 크기를 하나씩 줄여 업데이트가 시작되기 전의 값으로 돌아갑니다.

업그레이드 워크플로에서 Cluster Autoscaler가 워크플로의 축소 단계에서 노드 그룹을 확장하고 있다고 판단하면 노드 그룹을 원래 크기로 되돌리지 않고 즉시 종료됩니다.

# 시작 템플릿을 사용한 관리형 노드 사용자 지정
<a name="launch-templates"></a>

최고 수준의 사용자 지정을 위해 이 페이지의 단계에 기반한 자체 시작 템플릿을 사용하여 관리형 노드를 배포할 수 있습니다. 시작 템플릿을 사용하면 노드 배포 중에 부트스트랩 인수(예: 추가 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 인수)를 제공하거나 노드에 할당된 IP 주소와 다른 CIDR 블록의 포드에 IP 주소를 할당하거나 노드에 자체 사용자 지정 AMI를 배포하거나 노드에 자체 사용자 지정 CNI를 배포하는 등의 기능을 허용합니다.

관리형 노드 그룹을 처음 만들 때 자체 시작 템플릿을 제공하면 나중에 더 유연하게 사용할 수 있습니다. 자체 시작 템플릿을 사용하여 관리형 노드 그룹을 배포한 후 동일한 시작 템플릿의 다른 버전으로 업데이트할 수 있습니다. 노드 그룹을 다른 버전의 시작 템플릿으로 업데이트하면 그룹의 모든 노드가 지정된 시작 템플릿 버전의 새 구성과 일치하도록 재활용됩니다.

관리형 노드 그룹은 항상 Amazon EC2 Auto Scaling 그룹에서 사용할 시작 템플릿과 함께 배포됩니다. Amazon EKS API는 사용자가 제공한 템플릿을 복사하거나 계정의 기본값으로 자동 생성하여 이 시작 템플릿을 생성합니다. 자동 생성된 시작 템플릿을 수정하지 않는 것이 좋습니다. 사용자 정의 시작 템플릿을 사용하지 않는 기존 노드 그룹은 직접 업데이트할 수 없습니다. 대신 사용자 정의 시작 템플릿을 사용하여 새 노드 그룹을 생성해야 합니다.

## 시작 템플릿 기본 사항
<a name="launch-template-basics"></a>

AWS Management Console, AWS CLI 또는 AWS SDK를 사용하여 Amazon EC2 Auto Scaling 시작 템플릿을 생성할 수 있습니다. 자세한 내용을 알아보려면 *Amazon EC2 Auto Scaling 사용 설명서*의 [Auto Scaling 그룹을 위한 시작 템플릿 생성](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-template.html)을 참조하세요. 시작 템플릿의 일부 설정은 관리형 노드 구성에 사용되는 설정과 유사합니다. 시작 템플릿을 사용하여 노드 그룹을 배포하거나 업데이트할 때 노드 그룹 구성 또는 시작 템플릿에 일부 설정을 지정해야 합니다. 두 위치 모두에 설정을 지정하지 않습니다. 잘못된 위치에 설정이 있으면 노드 그룹 생성 또는 업데이트와 같은 작업이 실패합니다.

다음 표에는 시작 템플릿에서 금지된 설정이 나열되어 있습니다. 사용 가능한 경우 관리형 노드 그룹 구성에 필요한 유사한 설정도 나열되어 있습니다. 나열된 설정은 콘솔에 표시되는 설정입니다. AWS CLI 및 SDK에서 비슷하지만 다른 이름을 가질 수 있습니다.


| 시작 템플릿 - 금지됨 | Amazon EKS 노드 그룹 구성 | 
| --- | --- | 
|   **네트워크 인터페이스**의 **서브넷**(**네트워크 인터페이스 추가**)  |   **네트워킹 지정** 페이지의 **노드 그룹 네트워크 구성**에 있는 **서브넷**  | 
|   **고급 세부 정보**의 **IAM 인스턴스 프로필**   |   **노드 그룹 구성** 페이지의 **노드 그룹 구성**에 있는 **노드 IAM 역할**  | 
|   **고급 세부 정보**의 **종료 동작** 및 **중지 - 최대 절전 모드 동작**. 두 설정 모두 실행 템플릿에서 기본값인 **실행 템플릿 설정에 포함하지 않음**을 유지합니다.  |  동일한 사항 없음 Amazon EKS는 Auto Scaling 그룹이 아니라 인스턴스 수명 주기를 제어해야 합니다.  | 

다음 표에는 관리형 노드 그룹 구성에서 금지된 설정이 나열되어 있습니다. 사용 가능한 경우 시작 템플릿에 필요한 유사한 설정도 나열되어 있습니다. 나열된 설정은 콘솔에 표시되는 설정입니다. AWS CLI 및 SDK에서 비슷한 이름을 가질 수 있습니다.


| Amazon EKS 노드 그룹 구성 — 금지됨 | 시작 템플릿 | 
| --- | --- | 
|  (시작 템플릿에서 사용자 정의 AMI를 지정한 경우,에만 해당) **컴퓨팅 및 크기 조정 구성 설정** 페이지의 **노드 그룹 컴퓨팅 구성**에 있는 **AMI 유형** - 콘솔에 **시작 템플릿에서 지정됨**이라는 메시지와 지정된 AMI ID가 표시됩니다. 시작 템플릿에 **애플리케이션 및 OS 이미지(Amazon 머신 이미지)**가 지정되지 않은 경우, 노드 그룹 구성에서 AMI를 선택할 수 있습니다.  |   **시작 템플릿 컨텐츠**의 **애플리케이션 및 OS 이미지(Amazon Machine Image)** - 다음 요구 사항 중 하나가 있는 경우, ID를 지정해야 합니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/launch-templates.html)  | 
|   **컴퓨팅 및 크기 조정 구성 설정** 페이지의 **노드 그룹 컴퓨팅 구성**에 있는 **디스크 크기** - 콘솔에 **시작 템플릿에 지정됨**이라는 메시지가 표시됩니다.  |   **스토리지(볼륨)**의 **크기**(**새 볼륨 추가**). 시작 템플릿에서 이 옵션을 지정해야 합니다.  | 
|   **네트워킹 지정** 페이지의 **노드 그룹 구성**에 있는 **SSH 키 페어** - 콘솔에 시작 템플릿에 지정되어 있는 키가 표시되거나 **시작 템플릿에 지정되지 않음**이라는 메시지가 표시됩니다.  |   **키 페어(로그인)**의 **키 페어 이름**.  | 
|  시작 템플릿을 사용할 때 원격 액세스가 허용되는 소스 보안 그룹을 지정할 수 없습니다.  |   인스턴스의 **네트워크 설정**에 있는 **보안 그룹** 또는 **네트워크 인터페이스**의 **보안 그룹**(**네트워크 인터페이스 추가**), 두 가지 모두 설정할 수는 없습니다. 자세한 내용은 [사용자 지정 보안 그룹 사용](#launch-template-security-groups) 섹션을 참조하세요.  | 

**참고**  
시작 템플릿을 사용하여 노드 그룹을 배포하는 경우 시작 템플릿의 **시작 템플릿 콘텐츠**에서 **인스턴스 유형**을 0개 또는 1개 지정합니다. 또는 콘솔의 **컴퓨팅 및 크기 조정 구성 설정** 페이지에서 **인스턴스 유형**에 대해 0\$120개의 인스턴스 유형을 지정할 수 있습니다. 또는 Amazon EKS API를 사용하는 다른 도구로 인스턴스 유형을 지정할 수 있습니다. 시작 템플릿에서 인스턴스 유형을 지정하고 해당 시작 템플릿을 사용하여 노드 그룹을 배포하는 경우 콘솔에서 인스턴스 유형을 지정하거나 Amazon EKS API를 사용하는 다른 도구를 사용하여 인스턴스 유형을 지정할 수 없습니다. 시작 템플릿, 콘솔 또는 Amazon EKS API를 사용하는 다른 도구를 사용하여 인스턴스 유형을 지정하지 않으면 `t3.medium` 인스턴스 유형이 사용됩니다. 노드 그룹에서 스팟 용량 유형을 사용하는 경우 콘솔을 사용하여 여러 인스턴스 유형을 지정하는 것이 좋습니다. 자세한 내용은 [관리형 노드 그룹 용량](managed-node-groups.md#managed-node-group-capacity-types) 섹션을 참조하세요.
노드 그룹에 배포하는 컨테이너가 인스턴스 메타데이터 서비스 버전 2를 사용하는 경우 시작 템플릿에 **메타데이터 응답 홉 제한**이 `2`로 설정되어 있어야 합니다. 자세한 내용은 **Amazon EC2 사용 설명서의 [인스턴스 메타데이터 및 사용자 데이터](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)를 참조하세요.
시작 템플릿은 유연한 인스턴스 유형 선택을 허용하는 `InstanceRequirements` 기능을 지원하지 않습니다.

## Amazon EC2 인스턴스 태깅
<a name="launch-template-tagging"></a>

시작 템플릿의 `TagSpecification` 파라미터를 사용하여 노드 그룹의 Amazon EC2 인스턴스에 적용할 태그를 지정할 수 있습니다. `CreateNodegroup` 또는 `UpdateNodegroupVersion`API를 직접 호출하는 IAM 엔터티에는 `ec2:RunInstances` 및 `ec2:CreateTags`에 대한 권한이 있어야 하며, 시작 템플릿에 태그가 추가되어 있어야 합니다.

## 사용자 지정 보안 그룹 사용
<a name="launch-template-security-groups"></a>

시작 템플릿을 사용하여 사용자 지정 Amazon EC2 [보안 그룹](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html) 지정하고 노드 그룹의 인스턴스에 적용할 수 있습니다. 이는 인스턴스 수준 보안 그룹 파라라미터 또는 네트워크 인터페이스 구성 파라미터의 일부로 사용할 수 있습니다. 하지만 인스턴스 수준 및 네트워크 인터페이스 보안 그룹을 모두 지정하는 시작 템플릿을 생성할 수 없습니다. 관리형 노드 그룹과 함께 사용자 지정 보안 그룹을 사용할 때 적용되는 다음 조건을 고려하세요.
+ AWS Management Console을 사용하면 Amazon EKS는 단일 네트워크 인터페이스 사양이 있는 시작 템플릿만 허용합니다.
+ 기본적으로 Amazon EKS는 [클러스터 보안 그룹](sec-group-reqs.md)을 노드 그룹의 인스턴스에 적용하여 노드와 제어 플레인 간의 통신을 용이하게 합니다. 앞에서 언급한 옵션 중 하나를 사용하여 시작 템플릿에 사용자 지정 보안 그룹을 지정하는 경우 Amazon EKS는 클러스터 보안 그룹을 추가하지 않습니다. 따라서 보안 그룹의 인바운드 및 아웃바운드 규칙이 클러스터 엔드포인트와의 통신을 사용 설정하는지 확인해야 합니다. 보안 그룹 규칙이 올바르지 않으면 작업자 노드가 클러스터에 참여할 수 없습니다. 보안 그룹 규칙에 대한 자세한 내용은 [클러스터에 대한 Amazon EKS 보안 그룹 요구 사항 보기](sec-group-reqs.md) 부분을 참조하세요.
+ 노드 그룹의 인스턴스에 대한 SSH 액세스가 필요한 경우 해당 액세스를 허용하는 보안 그룹을 포함합니다.

## Amazon EC2 사용자 데이터
<a name="launch-template-user-data"></a>

시작 템플릿에는 사용자 정의 사용자 데이터에 대한 부분이 포함되어 있습니다. 개별 사용자 정의 AMI를 수동으로 생성하지 않고 이 섹션에서 노드 그룹에 대한 구성 설정을 지정할 수 있습니다. Bottlerocket에 사용할 수 있는 설정에 대한 자세한 내용은 GitHub의 [Using user data](https://github.com/bottlerocket-os/bottlerocket#using-user-data)을 참조하세요.

인스턴스를 시작할 때 `cloud-init`를 사용하여 시작 템플릿에 Amazon EC2 사용자 데이터를 제공할 수 있습니다. 자세한 내용은 [cloud-init 설명서](https://cloudinit.readthedocs.io/en/latest/index.html)를 참조하세요. 사용자 데이터를 사용하여 일반적인 구성 작업을 수행할 수 있습니다. 여기에는 다음 옵션이 포함됩니다.
+  [사용자 또는 그룹 포함](https://cloudinit.readthedocs.io/en/latest/topics/examples.html#including-users-and-groups) 
+  [패키지 설치](https://cloudinit.readthedocs.io/en/latest/topics/examples.html#install-arbitrary-packages) 

관리형 노드 그룹과 함께 사용되는 시작 템플릿의 Amazon EC2 사용자 데이터는 Amazon Linux AMI의 경우 [MIME 멀티파트 아카이브](https://cloudinit.readthedocs.io/en/latest/topics/format.html#mime-multi-part-archive) 형식이어야 하고 Bottlerocket AMI의 경우 TOML 형식이어야 합니다. 이는 사용자 데이터가 노드가 클러스터에 조인하는 데 필요한 Amazon EKS 사용자 데이터와 병합되기 때문입니다. `kubelet`을 시작하거나 수정하는 명령을 사용자 데이터에 지정하지 마세요. 이는 Amazon EKS에 의해 병합된 사용자 데이터의 일부로 수행됩니다. 노드의 레이블 설정과 같은 특정 `kubelet` 파라미터는 관리형 노드 그룹 API를 통해 직접 구성될 수 있습니다.

**참고**  
수동으로 시작하거나 사용자 정의 구성 파라미터를 전달하는 등의 고급 `kubelet` 사용자 지정에 대한 자세한 내용은 [AMI 지정](#launch-template-custom-ami) 부분을 참조하세요. 시작 템플릿에 사용자 정의 AMI ID가 지정된 경우 Amazon EKS는 사용자 데이터를 병합하지 않습니다.

다음 세부 정보는 사용자 데이터 섹션에 대한 자세한 정보를 제공합니다.

 **Amazon Linux 2 사용자 데이터**   
여러 사용자 데이터 블록을 단일 MIME 멀티파트 파일로 결합할 수 있습니다. 예를 들어 Docker 대몬을 구성하는 클라우드 boothook를 사용자 지정 패키지를 설치하는 사용자 데이터 셸 스크립트와 결합할 수 있습니다. MIME 멀티파트 파일은 다음과 같은 구성 요소로 이루어집니다.  
+ 콘텐츠 유형 및 요소 경계 선언 - `Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="` 
+ MIME 버전 선언 - `MIME-Version: 1.0` 
+ 다음 구성 요소를 포함하는 하나 이상의 사용자 데이터 블록:
  + 사용자 데이터 블록의 시작을 나타내는 열린 경계 - `--==MYBOUNDARY==` 
  + 블록에 대한 콘텐츠 유형 선언: `Content-Type: text/cloud-config; charset="us-ascii"`. 콘텐츠 유형에 대한 자세한 내용은 [cloud-init](https://cloudinit.readthedocs.io/en/latest/topics/format.html) 문서를 참조하세요.
  + 사용자 데이터 콘텐츠(예: 셸 명령 또는 `cloud-init` 지시어 목록)
  + MIME 멀티파트 파일의 끝을 나타내는 폐쇄 경계: `--==MYBOUNDARY==--` 

  다음은 직접 파일을 작성하는 데 사용할 수 있는 MIME 멀티파트 파일의 예입니다.

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="

--==MYBOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
echo "Running custom user data script"

--==MYBOUNDARY==--
```

 **Amazon Linux 2023 사용자 데이터**   
Amazon Linux 2023(AL2023)에 YAML 구성 스키마를 사용하는 새로운 노드 초기화 프로세스 `nodeadm`이 도입됩니다. 자체 관리형 노드 그룹 또는 시작 템플릿이 있는 AMI를 사용하는 경우 이제 새 노드 그룹을 생성할 때 추가 클러스터 메타데이터를 명시적으로 제공해야 합니다. 최소 필수 파라미터의 [예시](https://awslabs.github.io/amazon-eks-ami/nodeadm/)는 다음과 같으며, 여기에서 `apiServerEndpoint`, `certificateAuthority` 및 서비스 `cidr`가 필수입니다.  

```
---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name: my-cluster
    apiServerEndpoint: https://example.com
    certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
    cidr: 10.100.0.0/16
```
대체로 이 구성은 사용자 데이터에 있는 그대로 또는 MIME 멀티파트 문서에 포함되도록 설정합니다.  

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="BOUNDARY"

--BOUNDARY
Content-Type: application/node.eks.aws

---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig spec: [...]

--BOUNDARY--
```
AL2에서 이러한 파라미터의 메타데이터는 Amazon EKS `DescribeCluster` API 직접 호출에서 확인되었습니다. AL2023 버전에서는 대형 노드 스케일 업 도중 추가 API 직접 호출로 인해 제한이 발생할 위험이 있기 때문에 이러한 동작이 변경되었습니다. 시작 템플릿이 없는 관리형 노드 그룹을 사용하거나 Karpenter를 사용하는 경우 이 변경 사항이 영향을 미치지 않습니다. `certificateAuthority` 및 서비스 `cidr`에 대한 자세한 내용은 *Amazon EKS API 참조*의 [https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html](https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html)를 참조하세요.  
다음은 노드를 사용자 지정하기 위한 쉘 스크립트(예: 패키지 설치 또는 컨테이너 이미지 사전 캐싱)를 필수 `nodeadm` 구성과 결합하는 AL2023 사용자 데이터의 전체 예제입니다. 이 예제는 다음을 포함한 일반적인 사용자 지정을 보여줍니다. \$1 추가 시스템 패키지 설치 \$1 포드 시작 시간을 개선하기 위해 컨테이너 이미지 사전 캐싱 \$1 HTTP 프록시 구성 설정 \$1 노드 레이블 지정을 위한 `kubelet` 플래그 구성  

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="BOUNDARY"

--BOUNDARY
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset

# Install additional packages
yum install -y htop jq iptables-services

# Pre-cache commonly used container images
nohup docker pull public.ecr.aws/eks-distro/kubernetes/pause:3.2 &

# Configure HTTP proxy if needed
cat > /etc/profile.d/http-proxy.sh << 'EOF'
export HTTP_PROXY="http://proxy.example.com:3128"
export HTTPS_PROXY="http://proxy.example.com:3128"
export NO_PROXY="localhost,127.0.0.1,169.254.169.254,.internal"
EOF

--BOUNDARY
Content-Type: application/node.eks.aws

apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name: my-cluster
    apiServerEndpoint: https://example.com
    certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
    cidr: 10.100.0.0/16
  kubelet:
    config:
      clusterDNS:
      - 10.100.0.10
    flags:
    - --node-labels=app=my-app,environment=production

--BOUNDARY--
```

 **Bottlerocket 사용자 데이터**   
Bottlerocket은 사용자 데이터를 TOML 형식으로 구성합니다. Amazon EKS에서 제공하는 사용자 데이터와 병합할 사용자 데이터를 제공할 수 있습니다. 예를 들어, 추가 `kubelet` 설정을 제공할 수 있습니다.  

```
[settings.kubernetes.system-reserved]
cpu = "10m"
memory = "100Mi"
ephemeral-storage= "1Gi"
```
지원되는 설정에 대한 자세한 내용은 [Bottlerocket 설명서](https://github.com/bottlerocket-os/bottlerocket)를 참조하세요. 사용자 데이터에서 노드 레이블과 [테인트](node-taints-managed-node-groups.md)를 구성할 수 있습니다. 그러나 대신 노드 그룹 내에서 구성하는 것이 좋습니다. 그러면 Amazon EKS에서 이러한 구성을 적용합니다.  
사용자 데이터가 병합되면 서식이 유지되지 않지만 내용은 동일하게 유지됩니다. 사용자 데이터에 제공하는 구성은 Amazon EKS에서 구성하는 모든 설정을 재정의합니다. 따라서 `settings.kubernetes.max-pods` 또는 `settings.kubernetes.cluster-dns-ip`를 설정하면 사용자 데이터의 값이 노드에 적용됩니다.  
Amazon EKS는 모든 유효한 TOML을 지원하지 않습니다. 다음은 지원되지 않는 알려진 형식 목록입니다.  
+ 따옴표 붙은 키 안의 따옴표: `'quoted "value"' = "value"` 
+ 값의 이스케이프된 따옴표: `str = "I’m a string. \"You can quote me\""` 
+ 혼합 부동 소수점 및 정수: `numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ]` 
+ 배열의 혼합 유형: `contributors = ["[foo@example.com](mailto:foo@example.com)", { name = "Baz", email = "[baz@example.com](mailto:baz@example.com)" }]` 
+ 따옴표 붙은 키가 있는 대괄호로 묶은 헤더: `[foo."bar.baz"]` 

 **Windows 사용자 데이터**   
Windows 사용자 데이터는 PowerShell 명령을 사용합니다. 관리형 노드 그룹을 생성할 때 사용자 지정 사용자 데이터는 Amazon EKS 관리형 사용자 데이터와 결합됩니다. PowerShell 명령과 관리형 사용자 데이터 명령이 모두 하나의 `<powershell></powershell>` 태그 내에서 차례로 나타납니다.  
Windows 노드 그룹을 생성할 때 Amazon EKS는 Linux 기반 노드가 클러스터에 조인할 수 있도록 `aws-auth` `ConfigMap`을 업데이트합니다. 서비스는 Windows AMI에 대한 권한을 자동으로 구성하지 않습니다. Windows 노드를 사용하는 경우 액세스 항목 API를 통해 또는 `aws-auth` `ConfigMap`을 직접 업데이트하여 액세스를 관리해야 합니다. 자세한 내용은 [EKS 클러스터에 Windows 노드 배포](windows-support.md) 섹션을 참조하세요.
시작 템플릿에 AMI ID가 지정되어 있지 않으면 사용자 데이터의 Windows Amazon EKS Bootstrap 스크립트를 사용하여 Amazon EKS를 구성하지 마세요.
예시 사용자 데이터는 다음과 같습니다.  

```
<powershell>
Write-Host "Running custom user data script"
</powershell>
```

## AMI 지정
<a name="launch-template-custom-ami"></a>

다음 요구 사항 중 하나가 있는 경우 시작 템플릿의 `ImageId` 필드에 AMI ID를 지정합니다. 추가 정보를 보려면 요구 사항을 선택하세요.

### Amazon EKS 최적화 Linux/Bottlerocket AMI에 포함된 `bootstrap.sh` 파일에 인수를 전달하기 위해 사용자 데이터를 제공함
<a name="mng-specify-eks-ami"></a>

부트스트래핑은 인스턴스가 시작될 때 실행할 수 있는 명령의 추가에 대해 설명하는 데 사용되는 용어입니다. 예를 들어, 부트스트랩을 사용하면 추가 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 인수를 사용할 수 있습니다. 시작 템플릿을 지정하지 않고 `eksctl`을 사용하여 `bootstrap.sh` 스크립트에 인수를 전달할 수 있습니다. 이를 위해 시작 템플릿의 사용자 데이터 부분에 정보를 지정할 수도 있습니다.

 **시작 템플릿을 지정하지 않고 eksctl**   
다음 내용으로 *my-nodegroup.yaml*이라는 파일을 만듭니다. 모든 *예제 값*을 자신의 값으로 바꾸세요. `--apiserver-endpoint`, `--b64-cluster-ca` 및 `--dns-cluster-ip` 인수는 선택 사항입니다. 그러나 이를 정의하면 `bootstrap.sh` 스크립트가 `describeCluster`를 직접 호출하는 것을 방지할 수 있습니다. 이는 노드를 자주 확장하고 축소하는 프라이빗 클러스터 설정이나 클러스터에서 유용합니다. `bootstrap.sh` 스크립트에 대한 자세한 내용은 GitHub의 [bootstrap.sh](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh) 파일을 참조하세요.  
+ 유일한 필수 인수는 클러스터 이름(*my-cluster*)입니다.
+ `ami-1234567890abcdef0 `에 대해 최적화된 AMI ID를 검색하려면 다음 섹션을 참조하세요.
  +  [권장 Amazon Linux AMI ID 검색](retrieve-ami-id.md) 
  +  [권장 Bottlerocket AMI ID 검색](retrieve-ami-id-bottlerocket.md) 
  +  [권장 Microsoft Windows AMI ID 검색](retrieve-windows-ami-id.md) 
+ 클러스터의 *certificate-authority*를 검색하려면 다음 명령을 실행합니다.

  ```
  aws eks describe-cluster --query "cluster.certificateAuthority.data" --output text --name my-cluster --region region-code
  ```
+ 클러스터의 *api-server-endpoint*를 검색하려면 다음 명령을 실행합니다.

  ```
  aws eks describe-cluster --query "cluster.endpoint" --output text --name my-cluster --region region-code
  ```
+ `--dns-cluster-ip`의 값은 `.10`으로 끝나는 서비스 CIDR입니다. 클러스터의 *service-cidr*를 검색하려면 다음 명령을 실행합니다. 예를 들어, 반환된 값이 `ipv4 10.100.0.0/16`인 경우 값은 *10.100.0.10*입니다.

  ```
  aws eks describe-cluster --query "cluster.kubernetesNetworkConfig.serviceIpv4Cidr" --output text --name my-cluster --region region-code
  ```
+ 이 예에서는 추가 `kubelet` 인수를 제공하여 Amazon EKS 최적화 AMI에 포함된 `bootstrap.sh` 스크립트로 사용자 지정 `max-pods` 값을 설정합니다. 노드 그룹 이름은 63자를 초과할 수 없습니다. 문자나 숫자로 시작하되, 나머지 문자의 경우 하이픈과 밑줄을 포함할 수 있습니다. *my-max-pods-value*를 선택하는 방법에 대한 도움말은 을 참조하세요. 관리형 노드 그룹을 사용할 때 `maxPods`를 결정하는 방법에 대한 자세한 내용은 [maxPods 결정 방법](choosing-instance-type.md#max-pods-precedence) 섹션을 참조하세요.

  ```
  ---
  apiVersion: eksctl.io/v1alpha5
  kind: ClusterConfig
  
  metadata:
    name: my-cluster
    region: region-code
  
  managedNodeGroups:
    - name: my-nodegroup
      ami: ami-1234567890abcdef0
      instanceType: m5.large
      privateNetworking: true
      disableIMDSv1: true
      labels: { x86-al2-specified-mng }
      overrideBootstrapCommand: |
        #!/bin/bash
        /etc/eks/bootstrap.sh my-cluster \
          --b64-cluster-ca certificate-authority \
          --apiserver-endpoint api-server-endpoint \
          --dns-cluster-ip service-cidr.10 \
          --kubelet-extra-args '--max-pods=my-max-pods-value' \
          --use-max-pods false
  ```

  사용 가능한 모든 `eksctl` `config` 파일 옵션은 `eksctl` 설명서의 [구성 파일 스키마](https://eksctl.io/usage/schema/)를 참조하세요. `eksctl` 유틸리티는 여전히 사용자를 위해 시작 템플릿을 생성하고 해당 사용자 데이터를 `config` 파일에서 제공되는 데이터로 채웁니다.

  다음 명령을 사용하여 노드 그룹을 생성합니다.

  ```
  eksctl create nodegroup --config-file=my-nodegroup.yaml
  ```

 **시작 템플릿의 사용자 데이터**   
시작 템플릿의 사용자 데이터 부분에서 다음 정보를 지정합니다. 모든 *예제 값*을 자신의 값으로 바꾸세요. `--apiserver-endpoint`, `--b64-cluster-ca` 및 `--dns-cluster-ip` 인수는 선택 사항입니다. 그러나 이를 정의하면 `bootstrap.sh` 스크립트가 `describeCluster`를 직접 호출하는 것을 방지할 수 있습니다. 이는 노드를 자주 확장하고 축소하는 프라이빗 클러스터 설정이나 클러스터에서 유용합니다. `bootstrap.sh` 스크립트에 대한 자세한 내용은 GitHub의 [bootstrap.sh](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh) 파일을 참조하세요.  
+ 유일한 필수 인수는 클러스터 이름(*my-cluster*)입니다.
+ 클러스터의 *certificate-authority*를 검색하려면 다음 명령을 실행합니다.

  ```
  aws eks describe-cluster --query "cluster.certificateAuthority.data" --output text --name my-cluster --region region-code
  ```
+ 클러스터의 *api-server-endpoint*를 검색하려면 다음 명령을 실행합니다.

  ```
  aws eks describe-cluster --query "cluster.endpoint" --output text --name my-cluster --region region-code
  ```
+ `--dns-cluster-ip`의 값은 `.10`으로 끝나는 서비스 CIDR입니다. 클러스터의 *service-cidr*를 검색하려면 다음 명령을 실행합니다. 예를 들어, 반환된 값이 `ipv4 10.100.0.0/16`인 경우 값은 *10.100.0.10*입니다.

  ```
  aws eks describe-cluster --query "cluster.kubernetesNetworkConfig.serviceIpv4Cidr" --output text --name my-cluster --region region-code
  ```
+ 이 예에서는 추가 `kubelet` 인수를 제공하여 Amazon EKS 최적화 AMI에 포함된 `bootstrap.sh` 스크립트로 사용자 지정 `max-pods` 값을 설정합니다. *my-max-pods-value*를 선택하는 방법에 대한 도움말은 을 참조하세요. 관리형 노드 그룹을 사용할 때 `maxPods`를 결정하는 방법에 대한 자세한 내용은 [maxPods 결정 방법](choosing-instance-type.md#max-pods-precedence) 섹션을 참조하세요.

  ```
  MIME-Version: 1.0
  Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
  
  --==MYBOUNDARY==
  Content-Type: text/x-shellscript; charset="us-ascii"
  
  #!/bin/bash
  set -ex
  /etc/eks/bootstrap.sh my-cluster \
    --b64-cluster-ca certificate-authority \
    --apiserver-endpoint api-server-endpoint \
    --dns-cluster-ip service-cidr.10 \
    --kubelet-extra-args '--max-pods=my-max-pods-value' \
    --use-max-pods false
  
  --==MYBOUNDARY==--
  ```

### Amazon EKS 최적화 Windows AMI에 포함된 `Start-EKSBootstrap.ps1` 파일에 인수를 전달하기 위해 사용자 데이터를 제공함
<a name="mng-specify-eks-ami-windows"></a>

부트스트래핑은 인스턴스가 시작될 때 실행할 수 있는 명령의 추가에 대해 설명하는 데 사용되는 용어입니다. 시작 템플릿을 지정하지 않고 `eksctl`을 사용하여 `Start-EKSBootstrap.ps1` 스크립트에 인수를 전달할 수 있습니다. 이를 위해 시작 템플릿의 사용자 데이터 부분에 정보를 지정할 수도 있습니다.

사용자 지정 Windows AMI ID를 지정하려면 다음과 같은 사항을 고려하세요.
+ 시작 템플릿을 사용하고 사용자 데이터 부분의 필수 부트스트랩 명령을 제공해야 합니다. 원하는 Windows ID를 검색하려면 [최적화된 Windows AMI가 있는 노드 생성](eks-optimized-windows-ami.md) 테이블을 사용할 수 있습니다.
+ 몇 가지 제한과 조건이 있습니다. 예를 들어, AWS IAM Authenticator 구성 맵에 `eks:kube-proxy-windows`를 추가해야 합니다. 자세한 내용은 [AMI ID 지정 시 제한과 조건](#mng-ami-id-conditions) 섹션을 참조하세요.

시작 템플릿의 사용자 데이터 부분에서 다음 정보를 지정합니다. 모든 *예제 값*을 자신의 값으로 바꾸세요. `-APIServerEndpoint`, `-Base64ClusterCA` 및 `-DNSClusterIP` 인수는 선택 사항입니다. 그러나 이를 정의하면 `Start-EKSBootstrap.ps1` 스크립트가 `describeCluster`를 직접 호출하는 것을 방지할 수 있습니다.
+ 유일한 필수 인수는 클러스터 이름(*my-cluster*)입니다.
+ 클러스터의 *certificate-authority*를 검색하려면 다음 명령을 실행합니다.

  ```
  aws eks describe-cluster --query "cluster.certificateAuthority.data" --output text --name my-cluster --region region-code
  ```
+ 클러스터의 *api-server-endpoint*를 검색하려면 다음 명령을 실행합니다.

  ```
  aws eks describe-cluster --query "cluster.endpoint" --output text --name my-cluster --region region-code
  ```
+ `--dns-cluster-ip`의 값은 `.10`으로 끝나는 서비스 CIDR입니다. 클러스터의 *service-cidr*를 검색하려면 다음 명령을 실행합니다. 예를 들어, 반환된 값이 `ipv4 10.100.0.0/16`인 경우 값은 *10.100.0.10*입니다.

  ```
  aws eks describe-cluster --query "cluster.kubernetesNetworkConfig.serviceIpv4Cidr" --output text --name my-cluster --region region-code
  ```
+ 추가 인수는 [부트스트랩 스크립트 구성 파라미터](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters) 부분을 참조하세요.
**참고**  
사용자 지정 서비스 CIDR을 사용하는 경우 `-ServiceCIDR` 파라미터를 사용하여 CIDR을 지정해야 합니다. 그렇지 않으면 클러스터의 포드에 대한 DNS 확인이 실패합니다.

```
<powershell>
[string]$EKSBootstrapScriptFile = "$env:ProgramFiles\Amazon\EKS\Start-EKSBootstrap.ps1"
& $EKSBootstrapScriptFile -EKSClusterName my-cluster `
	 -Base64ClusterCA certificate-authority `
	 -APIServerEndpoint api-server-endpoint `
	 -DNSClusterIP service-cidr.10
</powershell>
```

### 특정 보안, 규정 준수 또는 내부 정책 요구 사항으로 인해 사용자 정의 AMI 실행함
<a name="mng-specify-custom-ami"></a>

자세한 내용은 *Amazon EC2 사용 설명서*에서 [Amazon Machine Image(AMI)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html)를 참조하세요. Amazon EKS AMI 빌드 사양에는 Amazon Linux를 기반으로 사용자 지정 Amazon EKS AMI를 구축하기 위한 리소스 및 구성 스크립트가 포함되어 있습니다. 자세한 내용은 GitHub에서 [Amazon EKS AMI 빌드 사양](https://github.com/awslabs/amazon-eks-ami/) 섹션을 참조하세요. 다른 운영 체제와 함께 설치된 사용자 지정 AMI를 생성하려면 GitHub에서 [Amazon EKS 샘플 사용자 지정 AMI](https://github.com/aws-samples/amazon-eks-custom-amis) 섹션을 참조하세요.

관리형 노드 그룹에 사용되는 시작 템플릿에서는 AMI ID에 동적 파라미터 참조를 사용할 수 없습니다.

**중요**  
AMI를 지정할 때 Amazon EKS는 클러스터의 컨트롤 플레인 버전을 기준으로 AMI에 포함된 Kubernetes 버전을 검증하지 않습니다. 사용자 지정 AMI의 Kubernetes 버전이 [Kubernetes 버전 스큐 정책](https://kubernetes.io/releases/version-skew-policy)을 준수하는지 확인하는 것은 사용자의 책임입니다.  
노드의 `kubelet` 버전은 클러스터 버전보다 최신 버전이어서는 안 됨
노드의 `kubelet` 버전은 클러스터 버전 뒤로 최대 3개 이상의 마이너 버전(Kubernetes 버전 `1.28` 이상의 경우)이거나 클러스터 버전 뒤로 최대 2개의 마이너 버전(Kubernetes 버전 `1.27` 이하의 경우)이어야 함  
버전 스큐를 위반하는 관리형 노드 그룹을 생성하면 다음과 같은 상황이 발생할 수 있습니다.
노드가 클러스터에 조인하지 못함
정의되지 않은 동작 또는 API 비호환성
클러스터 불안정성 또는 워크로드 장애
AMI를 지정할 때 Amazon EKS는 사용자 데이터를 병합하지 않습니다. 사용자가 필요한 `bootstrap` 명령을 사용하여 노드를 클러스터에 조인해야 합니다. 노드가 클러스터에 조인되지 않은 경우 Amazon EKS `CreateNodegroup` 및 `UpdateNodegroupVersion` 작업도 실패합니다.

## AMI ID 지정 시 제한과 조건
<a name="mng-ami-id-conditions"></a>

다음은 관리형 노드 그룹으로 AMI ID를 지정하는 것과 관련된 제한 및 조건입니다.
+ 시작 템플릿에서 AMI ID를 지정하는 것과 AMI ID를 지정하지 않는 것 사이를 전환하려면 새 노드 그룹을 생성해야 합니다.
+ 최신 AMI 버전을 사용할 수 있는 경우에도 콘솔에 알림이 표시되지 않습니다. 노드 그룹을 최신 AMI 버전으로 업데이트하려면 업데이트된 AMI ID로 시작 템플릿의 새 버전을 생성해야 합니다. 그런 다음 새 시작 템플릿 버전으로 노드 그룹을 업데이트해야 합니다.
+ AMI ID를 지정하는 경우 API에서 다음 필드를 설정할 수 없습니다.
  +  `amiType` 
  +  `releaseVersion` 
  +  `version` 
+ AMI ID를 지정하는 경우 API에 설정된 모든 `taints`가 비동기적으로 적용됩니다. 노드가 클러스터에 합류하기 전에 테인트를 적용하려면 `kubelet` 명령줄 플래그를 사용하여 사용자 데이터의 `--register-with-taints`에 테인트를 전달해야 합니다. 자세한 내용은 Kubernetes 문서의 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)를 참조하세요.
+ Windows 관리형 노드 그룹에 사용자 지정 AMI ID를 지정할 때는 AWS IAM Authenticator 구성 맵에 `eks:kube-proxy-windows`를 추가합니다. DNS가 제대로 작동하려면 필요합니다.

  1. 편집을 위해 AWS IAM Authenticator 구성 맵을 엽니다.

     ```
     kubectl edit -n kube-system cm aws-auth
     ```

  1. Windows 노드와 연결된 각 `rolearn` 아래의 `groups` 목록에 이 항목을 추가합니다. 구성 맵은 [aws-auth-cm-windows.yaml ](https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm-windows.yaml)과 비슷해야 합니다.

     ```
     - eks:kube-proxy-windows
     ```

  1. 파일을 저장하고 텍스트 편집기를 종료합니다.
+ 사용자 지정 시작 템플릿을 사용하는 모든 AMI의 경우 관리형 노드 그룹의 `HttpPutResponseHopLimit` 기본값은 `2`로 설정됩니다.

# 클러스터에서 관리형 노드 그룹 삭제
<a name="delete-managed-node-group"></a>

이 주제에서는 Amazon EKS 관리형 노드 그룹을 삭제하는 방법에 대해 설명합니다. 관리형 노드 그룹을 삭제하면 Amazon EKS는 먼저 Auto Scaling 그룹의 최소, 최대 및 원하는 크기를 0으로 설정합니다. 그러면 노드 그룹이 축소됩니다.

각 인스턴스가 종료되기 전에 Amazon EKS는 해당 노드를 드레이닝하기 위해 신호를 전송합니다. 드레이닝 프로세스 중에 Kubernetes는 노드의 각 포드에서 다음을 수행합니다. 구성된 `preStop` 수명 주기 후크를 실행하고, `SIGTERM` 신호를 컨테이너로 전송한 다음, 정상적으로 종료될 때까지 `terminationGracePeriodSeconds`의 시간을 기다립니다. 5분 후에 노드가 드레이닝되지 않을 경우 Amazon EKS는 오토 스케일링을 통해 인스턴스 종료를 계속 강제로 수행할 수 있습니다. 모든 인스턴스가 종료되면 Auto Scaling 그룹이 삭제됩니다.

**중요**  
클러스터의 다른 관리형 노드 그룹에서 사용하지 않는 노드 IAM 역할을 사용하는 관리형 노드 그룹을 삭제하면 역할이 `aws-auth` `ConfigMap`에서 제거됩니다. 클러스터의 자체 관리형 노드 그룹이 동일한 노드 IAM 역할을 사용하는 경우 자체 관리형 노드는 `NotReady` 상태로 전환됩니다. 또한 클러스터 작업도 중단됩니다. 자체 관리 노드 그룹에만 사용하는 역할에 대한 매핑을 추가하려면 클러스터의 플랫폼 버전이 [EKS 액세스 항목으로 IAM 사용자에게 Kubernetes 액세스 권한 부여](access-entries.md)의 전제 조건 섹션에 나열된 최소 버전 이상인 경우 [액세스 항목 생성](creating-access-entries.md)를 참조하세요. 플랫폼 버전이 액세스 항목에 필요한 최소 버전보다 이전인 경우 항목을 `aws-auth` `ConfigMap`에 다시 추가할 수 있습니다. 자세한 내용을 보려면 터미널에 `eksctl create iamidentitymapping --help`를 입력합니다.

관리되는 노드 그룹은 다음을 사용하여 삭제할 수 있습니다:
+  [`eksctl`](#eksctl-delete-managed-nodegroup) 
+  [AWS Management Console](#console-delete-managed-nodegroup) 
+  [AWS CLI](#awscli-delete-managed-nodegroup) 

## `eksctl`
<a name="eksctl-delete-managed-nodegroup"></a>

 **`eksctl`로 관리되는 노드 그룹 삭제** 

다음 명령을 입력하십시오. 모든 `<example value>`를 고유한 값으로 바꿉니다.

```
eksctl delete nodegroup \
  --cluster <my-cluster> \
  --name <my-mng> \
  --region <region-code>
```

추가 옵션은 `eksctl` 설명서의 [Deleting and draining nodegroups](https://eksctl.io/usage/nodegroups/#deleting-and-draining-nodegroups)를 참조하세요.

## AWS Management Console
<a name="console-delete-managed-nodegroup"></a>

 **로 관리되는 노드 그룹 삭제AWS Management Console** 

1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)을 엽니다.

1. **클러스터** 페이지에서 삭제할 노드 그룹이 포함된 클러스터를 선택합니다.

1. 선택한 클러스터 페이지에서 **컴퓨팅** 탭을 선택합니다.

1. **노드 그룹** 섹션에서 삭제할 노드 그룹을 선택합니다. 그런 다음 **삭제**를 선택합니다.

1. **노드 그룹 삭제** 확인 대화 상자에서 노드 그룹의 이름을 입력합니다. 그런 다음 **삭제**를 선택합니다.

## AWS CLI
<a name="awscli-delete-managed-nodegroup"></a>

 **AWS CLI을 사용하여 관리형 노드 그룹을 삭제** 

1. 다음 명령을 입력하십시오. 모든 `<example value>`를 고유한 값으로 바꿉니다.

   ```
   aws eks delete-nodegroup \
     --cluster-name <my-cluster> \
     --nodegroup-name <my-mng> \
     --region <region-code>
   ```

1. CLI 구성에 `cli_pager=`가 설정된 경우 키보드의 화살표 키를 사용하여 응답 출력을 스크롤하세요. 작업을 마치면 `q` 키를 누릅니다.

   자세한 옵션은 *AWS CLI 명령 참조*에서 ` [delete-nodegroup](https://docs.aws.amazon.com/cli/latest/reference/eks/delete-nodegroup.html) ` 명령을 참조하세요.

# 자체 관리형 노드로 노드 직접 유지
<a name="worker"></a>

클러스터에는 포드가 예약된 하나 이상의 Amazon EC2 노드가 포함되어 있습니다. Amazon EKS 노드는 AWS 계정에서 실행되고 클러스터 API 서버 엔드포인트를 통해 클러스터의 제어 영역에 연결됩니다. Amazon EC2 가격을 기준으로 요금이 청구됩니다. 자세한 설명은 [Amazon EC2 요금](https://aws.amazon.com/ec2/pricing/)을 참조하세요.

클러스터에는 여러 노드 그룹이 포함될 수 있습니다. 각 노드 그룹에는 [Amazon EC2 Auto Scaling 그룹](https://docs.aws.amazon.com/autoscaling/ec2/userguide/AutoScalingGroup.html)에 배포된 하나 이상의 노드가 포함되어 있습니다. 그룹 내 노드의 인스턴스 유형은 [Karpenter](https://karpenter.sh/)를 사용한 [attribute-based 인스턴스 유형 선택](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html)을 사용하는 경우와 같이 달라질 수 있습니다. 노드 그룹의 모든 인스턴스는 [Amazon EKS 노드 IAM 역할](create-node-role.md)을 사용해야 합니다.

Amazon EKS에서는 Amazon EKS 최적화 AMI라는 특별한 Amazon Machine Image(AMI)를 제공합니다. AMI는 Amazon EKS와 함께 작동하도록 구성되어 있습니다. 구성 요소에는 `containerd`, `kubelet`, AWS IAM 인증자가 포함됩니다. 또한 AMI에는 특별한 [부트스트랩 스크립트](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh)도 포함되어 있어 클러스터의 제어 영역을 자동으로 찾고 연결할 수 있습니다.

CIDR 블록을 사용하여 클러스터의 퍼블릭 엔드포인트에 대한 액세스를 제한하는 경우 프라이빗 엔드포인트 액세스도 사용 설정하는 것이 좋습니다. 이는 노드가 클러스터와 통신할 수 있도록 하기 위한 것입니다. 프라이빗 엔드포인트를 활성화하지 않은 경우, 퍼블릭 액세스에 대해 지정하는 CIDR 블록에는 VPC의 송신 소스가 포함되어야 합니다. 자세한 내용은 [클러스터 API 서버 엔드포인트](cluster-endpoint.md) 섹션을 참조하세요.

Amazon EKS 클러스터에 자체 관리형 노드를 추가하려면 다음 항목을 참조하세요. 자체 관리형 노드를 수동으로 시작하는 경우 `<cluster-name>`이 클러스터와 일치하는지 확인하면서 각 노드에 다음 태그를 추가합니다. 자세한 내용은 [개별 리소스에 대한 태그 추가 및 삭제](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#adding-or-deleting-tags)를 참조하세요. 가이드의 단계를 수행하면 필수 태그가 자동으로 노드에 추가됩니다.


| 키 | 값 | 
| --- | --- | 
|   `kubernetes.io/cluster/<cluster-name>`   |   `owned`   | 

**중요**  
Amazon EC2 인스턴스 메타데이터 서비스(IMDS)의 태그는 EKS 노드와 호환되지 않습니다. 인스턴스 메타데이터 태그가 활성화되면 태그 값에 슬래시('/')를 사용할 수 없습니다. 이러한 제한으로 인해 인스턴스 시작이 실패할 수 있습니다. 특히 Karpenter 또는 Cluster Autoscaler와 같은 노드 관리 도구를 사용하는 경우 적절한 기능을 위해 슬래시가 포함된 태그에 의존하기 때문입니다.

일반 Kubernetes 관점에서 노드에 대한 자세한 내용은 Kubernetes 문서의 [노드](https://kubernetes.io/docs/concepts/architecture/nodes/)를 참조하세요.

**Topics**
+ [자체 관리형 Amazon Linux 노드 생성](launch-workers.md)
+ [자체 관리형 Bottlerocket 노드 생성](launch-node-bottlerocket.md)
+ [자체 관리형 Microsoft Windows 노드 생성](launch-windows-workers.md)
+ [자체 관리형 Ubuntu Linux 노드 생성](launch-node-ubuntu.md)
+ [클러스터의 자체 관리형 노드 업데이트](update-workers.md)

# 자체 관리형 Amazon Linux 노드 생성
<a name="launch-workers"></a>

이 주제에서는 Amazon EKS 클러스터에 등록하는 Linux 노드의 Auto Scaling 그룹을 시작하는 방법을 설명합니다. 노드가 클러스터에 조인한 이후 Kubernetes 애플리케이션을 배포할 수 있습니다. `eksctl` 또는 AWS Management Console을 사용하여 자체 관리형 Amazon Linux 노드를 시작할 수도 있습니다. AWS Outposts에서 노드를 시작해야 하는 경우 [AWS Outposts에 Amazon Linux 노드 생성](eks-outposts-self-managed-nodes.md) 부분을 참조하세요.
+ 기존 Amazon EKS 클러스터. 배포하려면 [Amazon EKS 클러스터 생성](create-cluster.md) 섹션을 참조하세요. AWS Outposts, AWS Wavelength 또는 AWS Local Zones이 사용된 AWS 리전에 서브넷이 있는 경우 클러스터를 생성할 때 해당 서브넷이 전달되지 않은 상태여야 합니다.
+ 노드가 사용할 기존 IAM 역할. 파일을 만들려면 [Amazon EKS 노드 IAM 역할](create-node-role.md) 섹션을 참조하세요. 이 역할에 VPC CNI에 대한 정책 중 하나도 없는 경우 VPC CNI 포드에 대해 다음과 같은 별도의 역할이 필요합니다.
+ (선택 사항이지만 권장됨) 필요한 IAM 정책이 연결된 자체 IAM 역할로 구성된 Kubernetes용 Amazon VPC CNI 플러그인 추가 기능. 자세한 내용은 [IRSA를 사용하도록 Amazon VPC CNI 플러그인 구성](cni-iam-role.md) 섹션을 참조하세요.
+ [최적의 Amazon EC2 노드 인스턴스 유형 선택](choosing-instance-type.md) 에 나열된 고려 사항에 익숙합니다. 선택하는 인스턴스 유형에 따라 클러스터 및 VPC에 대한 추가 전제 조건이 있을 수 있습니다.

다음 중 하나를 사용하여 자체 관리형 Linux 노드를 시작할 수 있습니다.
+  [`eksctl`](#eksctl_create_managed_amazon_linux) 
+  [AWS Management Console](#console_create_managed_amazon_linux) 

## `eksctl`
<a name="eksctl_create_managed_amazon_linux"></a>

 **`eksctl`을 사용하여 자체 관리형 Linux 노드 시작 ** 

1. 장치에 설치된 `eksctl` 명령줄 도구의 버전 `0.215.0` 이상 또는 AWS CloudShell이 필요합니다. `eksctl`을 설치 또는 업그레이드하려면 `eksctl` 설명서에서 [설치](https://eksctl.io/installation)를 참조하세요.

1. (선택 사항) **AmazonEKS\$1CNI\$1Policy** 관리형 IAM 정책이 [Amazon EKS 노드 IAM 역할](create-node-role.md)에 연결되어 있는 경우 대신 Kubernetes `aws-node` 서비스 계정에 연결한 IAM 역할에 할당하는 것이 좋습니다. 자세한 내용은 [IRSA를 사용하도록 Amazon VPC CNI 플러그인 구성](cni-iam-role.md) 섹션을 참조하세요.

1. 다음 명령은 기존 클러스터의 노드 그룹을 생성합니다. *al-nodes*를 노드 그룹의 이름으로 바꿉니다. 노드 그룹 이름은 63자를 초과할 수 없습니다. 문자나 숫자로 시작하되, 나머지 문자의 경우 하이픈과 밑줄을 포함할 수 있습니다. *my-cluster*를 해당 클러스터의 이름으로 바꿉니다. 이름에는 영숫자(대소문자 구분)와 하이픈만 사용할 수 있습니다. 영숫자로 시작해야 하며 100자 이하여야 합니다. 이름은 클러스터를 생성하는 AWS 리전과 AWS 계정 내에서 고유해야 합니다. 나머지 *예제 값*을 자신의 값으로 바꿉니다. 노드는 기본적으로 제어 영역과 동일한 Kubernetes 버전으로 작성됩니다.

   `--node-type`에 대한 값을 선택하기 전에 [최적의 Amazon EC2 노드 인스턴스 유형 선택](choosing-instance-type.md)을 검토합니다.

   *my-key*를 Amazon EC2 키 페어 또는 퍼블릭 키 이름으로 바꿉니다. 이 키는 노드를 시작한 후 SSH로 연결하는 데 사용됩니다. Amazon EC2 키 페어가 아직 없는 경우 AWS Management Console에서 새로 생성할 수 있습니다. 자세한 내용을 알아보려면 *Amazon EC2 key pairs*의 [Amazon EC2 키 페어](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)를 참조하세요.

   다음 명령을 사용하여 노드 그룹을 생성합니다.
**중요**  
노드 그룹을 AWS Outposts, Wavelength 또는 Local Zones 서브넷에 배포하려는 경우 추가 고려 사항이 있습니다.  
클러스터를 생성할 때 서브넷이 전달되지 않았어야 합니다.
서브넷과 ` [volumeType](https://eksctl.io/usage/schema/#nodeGroups-volumeType): gp2`을 지정하는 구성 파일로 노드 그룹을 생성해야 합니다. 자세한 내용은 `eksctl` 문서의 [구성 파일을 사용하여 nodegroup 생성](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file) 및 [구성 파일 스키마](https://eksctl.io/usage/schema/) 부분을 참조하세요.

   ```
   eksctl create nodegroup \
     --cluster my-cluster \
     --name al-nodes \
     --node-type t3.medium \
     --nodes 3 \
     --nodes-min 1 \
     --nodes-max 4 \
     --ssh-access \
     --managed=false \
     --ssh-public-key my-key
   ```

   다음과 같은 노드 그룹을 배포할 수 있습니다.
   + 포드에 기본 구성보다 훨씬 더 많은 수의 IP 주소를 할당할 수 있는 노드 그룹을 배포하려면 [접두사를 사용하여 Amazon EKS 노드에 추가 IP 주소 할당](cni-increase-ip-addresses.md) 섹션을 참조하세요.
   + 인스턴스와 다른 CIDR 블록의 포드에 `IPv4` 주소를 할당할 수 있는 노드 그룹을 배포하려면 [사용자 지정 네트워킹을 통해 대체 서브넷에 포드 배포](cni-custom-network.md) 섹션을 참조하세요.
   + 포드 및 서비스에 `IPv6` 주소를 할당할 수 있는 노드 그룹을 배포하려면 [클러스터, 포드 및 서비스에 대한 IPv6 주소에 대해 알아보기](cni-ipv6.md) 섹션을 참조하세요.
   + 아웃바운드 인터넷 액세스가 없는 노드 그룹을 배포하려면 [인터넷 액세스가 제한된 프라이빗 클러스터 배포](private-clusters.md) 부분을 참조하세요.

     사용 가능한 모든 옵션 및 기본값의 전체 목록을 보려면 다음 명령을 입력합니다.

     ```
     eksctl create nodegroup --help
     ```

     노드가 클러스터에 조인하지 못한 경우 문제 해결 장의 [노드가 클러스터 조인에 실패](troubleshooting.md#worker-node-fail) 섹션을 참조하세요.

     예제 출력은 다음과 같습니다. 노드가 생성되는 동안 여러 줄이 출력됩니다. 출력의 마지막 줄 중 하나는 다음 예제 줄과 유사합니다.

     ```
     [✔]  created 1 nodegroup(s) in cluster "my-cluster"
     ```

1. (선택 사항) [샘플 애플리케이션](sample-deployment.md)을 배포하여 클러스터 및 Linux 노드를 테스트합니다.

1. 다음과 같은 조건에 해당하면 IMDS에 대한 포드 액세스를 차단하는 것이 좋습니다.
   + 포드에 필요한 최소 권한만 있도록 모든 Kubernetes 서비스 계정에 IAM 역할을 할당할 계획입니다.
   + 클러스터의 어떤 포드도 현재 AWS 리전 검색 등의 다른 이유로 Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 액세스할 필요가 없습니다.

   자세한 내용은 [작업자 노드에 할당된 인스턴스 프로필에 대한 액세스 제한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 부분을 참조하세요.

## AWS Management Console
<a name="console_create_managed_amazon_linux"></a>

 **1단계: AWS Management Console을 사용하여 자체 관리형 Linux 노드 시작 ** 

1. AWS CloudFormation 템플릿의 최신 버전 다운로드

   ```
   curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2025-11-26/amazon-eks-nodegroup.yaml
   ```

1. 클러스터 상태가 `ACTIVE`가 되기를 기다립니다. 클러스터가 활성화되기 전에 노드를 시작하면 노드가 클러스터에 등록되지 않고 노드를 다시 시작해야 합니다.

1. [AWSCloudFormation 콘솔](https://console.aws.amazon.com/cloudformation/)을 엽니다.

1. **스택 생성**을 선택한 다음 **새 리소스 사용(표준)**을 선택합니다.

1. **템플릿 지정**에서 **템플릿 파일 업로드**를 선택한 다음 **파일 선택**을 선택합니다.

1. 다운로드한 `amazon-eks-nodegroup.yaml` 파일을 선택합니다.

1. **다음**을 선택합니다.

1. **스택 세부 정보 지정** 페이지에서 이에 따라 다음 파라미터를 입력한 후 **다음**을 선택합니다.
   +  **스택 이름**: AWS CloudFormation 스택에 대한 스택 이름을 선택합니다. 예를 들어, *my-cluster-nodes*로 지정할 수 있습니다. 이름에는 영숫자(대소문자 구분)와 하이픈만 사용할 수 있습니다. 영숫자로 시작해야 하며 100자 이하여야 합니다. 이름은 클러스터를 생성하는 AWS 리전과 AWS 계정 내에서 고유해야 합니다.
   +  **ClusterName**: Amazon EKS 클러스터 생성 시 사용할 이름을 입력합니다. 이 이름은 클러스터 이름과 같아야 합니다. 그렇지 않으면 노드가 클러스터에 조인할 수 없습니다.
   +  **ClusterControlPlaneSecurityGroup**: [VPC](creating-a-vpc.md)를 생성할 때 생성한 AWS CloudFormation 출력에서 **SecurityGroups**값을 선택합니다.

     다음 단계에서는 해당 그룹을 검색하는 한 가지 작업을 보여줍니다.

     1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)을 엽니다.

     1. 클러스터의 이름을 선택합니다.

     1. **네트워킹** 탭을 선택합니다.

     1. **ClusterControlPlaneSecurityGroup** 드롭다운 목록에서 선택할 때 **추가 보안 그룹** 값을 참조로 사용하세요.
   +  **ApiServerEndpoint**: EKS 클러스터의 API 서버 엔드포인트를 입력합니다. 이는 EKS 클러스터 콘솔의 세부 정보에서 확인할 수 있습니다.
   +  **CertificateAuthorityData**: base64로 인코딩된 인증 기관 데이터를 입력합니다. 이는 EKS 클러스터 콘솔의 세부 정보 섹션에서도 확인할 수 있습니다.
   +  **ServiceCidr**: 클러스터 내 Kubernetes 서비스에 IP 주소를 할당하는 데 사용되는 CIDR 범위를 입력합니다. 이는 EKS 클러스터 콘솔의 네트워킹 탭에 있습니다.
   +  **AuthenticationMode**: EKS 클러스터 콘솔의 액세스 탭을 검토하여 EKS 클러스터에서 사용 중인 인증 모드를 선택합니다.
   +  **NodeGroupName**: 노드 그룹의 이름을 입력합니다. 이 이름은 나중에 노드에 대해 생성된 Auto Scaling 노드 그룹을 식별하는 데 사용할 수 있습니다. 노드 그룹 이름은 63자를 초과할 수 없습니다. 문자나 숫자로 시작하되, 나머지 문자의 경우 하이픈과 밑줄을 포함할 수 있습니다.
   +  **NodeAutoScalingGroupMinSize**: Auto Scaling 그룹이 축소할 수 있는 노드의 최소 노드 수를 입력합니다.
   +  **NodeAutoScalingGroupDesiredCapacity**: 스택을 생성할 때 조정할 원하는 노드 수를 입력합니다.
   +  **NodeAutoScalingGroupMaxSize**: Auto Scaling 그룹이 확장할 수 있는 노드의 최대 노드 수를 입력합니다.
   +  **NodeInstanceType**: 노드에 대한 인스턴스 유형을 선택합니다. 자세한 내용은 [최적의 Amazon EC2 노드 인스턴스 유형 선택](choosing-instance-type.md) 섹션을 참조하세요.
   +  **NodeImageIdSSMParam**: 가변 Kubernetes 버전에 대한 최신 Amazon EKS 최적화 Amazon Linux 2023 AMI의 Amazon EC2 Systems Manager 파라미터로 미리 채워집니다. Amazon EKS에서 지원되는 다른 Kubernetes 마이너 버전을 사용하려면 *1.XX*를 다른 [지원되는 버전](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)으로 바꿉니다. 클러스터와 동일한 Kubernetes 버전을 지정하는 것이 좋습니다.

     *amazon-linux-2023*를 다른 AMI 유형으로 바꿀 수도 있습니다. 자세한 내용은 [권장 Amazon Linux AMI ID 검색](retrieve-ami-id.md) 섹션을 참조하세요.
**참고**  
Amazon EKS 노드 AMI는 Amazon Linux를 기반으로 합니다. [Amazon Linux 보안 센터](https://alas.aws.amazon.com/alas2023.html)에서 Amazon Linux 2023의 보안 또는 프라이버시 이벤트를 추적하거나 관련 [RSS 피드](https://alas.aws.amazon.com/AL2023/alas.rss)를 구독하세요. 보안 및 프라이버시 이벤트에는 문제의 개요, 영향을 받는 패키지 및 인스턴스를 업데이트하여 문제를 해결하는 방법이 포함됩니다.
   +  **NodeImageId**: (선택사항) Amazon EKS 최적화 AMI 대신 사용자 정의 AMI를 사용 중인 경우, 해당 AWS 리전에 노드 AMI ID를 입력합니다. 여기에서 값을 지정하면 **NodeImageIdSSMParam** 필드에 있는 모든 값이 재정의됩니다.
   +  **NodeVolumeSize**: 노드에 대해 루트 볼륨 크기를 GiB 단위로 지정합니다.
   +  **NodeVolumeType**: 노드의 루트 볼륨 유형을 지정합니다.
   +  **KeyName**: 시작 이후 SSH를 사용하여 노드에 연결하는 데 사용할 수 있는 Amazon EC2 SSH 키 페어 이름을 입력합니다. Amazon EC2 키 페어가 아직 없는 경우 AWS Management Console에서 새로 생성할 수 있습니다. 자세한 내용을 알아보려면 *Amazon EC2 key pairs*의 [Amazon EC2 키 페어](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)를 참조하세요.
   +  **VpcId**: 생성한 [VPC](creating-a-vpc.md)에 대한 ID를 입력합니다.
   +  **서브넷**: VPC용으로 생성한 서브넷을 선택합니다. [Amazon EKS 클러스터를 위한 Amazon VPC 만들기](creating-a-vpc.md)에 설명된 단계를 사용하여 VPC를 만든 경우, 노드가 시작될 VPC 내의 사설 서브넷만 지정하세요. 클러스터의 **Networking**에서 각 서브넷 링크를 열면 어떤 서브넷이 프라이빗인지 확인할 수 있습니다.
**중요**  
서브넷 중 하나가 퍼블릭 서브넷인 경우 자동 퍼블릭 IP 주소 할당 설정을 사용하도록 설정해야 합니다. 퍼블릭 서브넷에 대해 이 설정을 사용하지 않으면 해당 퍼블릭 서브넷에 배포하는 노드에는 퍼블릭 IP 주소가 할당되지 않으며 클러스터 또는 기타 AWS 서비스와 통신할 수 없습니다. 서브넷이 2020년 3월 26일 이전에 [Amazon EKS AWS CloudFormation VPC 템플릿](creating-a-vpc.md) 또는 `eksctl`을 사용하여 배포된 경우 퍼블릭 서브넷에 대해 자동 퍼블릭 IP 주소 할당이 사용 중지됩니다. 서브넷에 퍼블릭 IP 주소 할당을 활성화하는 방법에 대한 자세한 내용은 [서브넷에 대한 퍼블릭 IPv4 주소 지정 속성 수정](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)을 참조하세요. 노드가 프라이빗 서브넷에 배포되면 NAT 게이트웨이를 통해 클러스터 및 다른 AWS 서비스와 통신할 수 있습니다.
서브넷에서 인터넷에 액세스할 수 없는 경우 [인터넷 액세스가 제한된 비공개 클러스터 배포하기](private-clusters.md)의 고려 사항과 추가 단계를 숙지하고 있는지 확인하세요.
AWS Outposts, Wavelength 또는 Local Zones 서브넷을 선택하는 경우 클러스터를 생성할 때 해당 서브넷이 전달되지 않은 상태여야 합니다.

1. **스택 옵션 구성** 페이지에서 원하는 선택 항목을 선택한 후 **다음**을 선택합니다.

1. **AWS CloudFormation에서 IAM 리소스를 생성할 수 있음을 인정합니다**의 왼쪽에 있는 확인란을 선택한 다음 **스택 생성**을 선택합니다.

1. 스택이 생성된 후 콘솔에서 이를 선택하고 **출력**을 선택합니다. `EKS API` 또는 `EKS API and ConfigMap` 인증 모드를 사용하는 경우 마지막 단계입니다.

1. `ConfigMap` 인증 모드를 사용하는 경우 생성된 노드 그룹의 **NodeInstanceRole**을 기록하세요.

 **2단계: 노드가 클러스터에 조인하도록 하려면** 

**참고**  
다음 두 단계는 EKS 클러스터 내에서 Configmap 인증 모드를 사용하는 경우에만 필요합니다. 또한 아웃바운드 인터넷 액세스 없이 프라이빗 VPC 내에서 노드를 시작한 경우 VPC 내에서 노드가 클러스터에 조인하도록 설정해야 합니다.

1. `aws-auth` `ConfigMap`이 이미 있는지 확인합니다.

   ```
   kubectl describe configmap -n kube-system aws-auth
   ```

1. `aws-auth` `ConfigMap`이 표시되면 필요에 따라 이를 업데이트합니다.

   1. 편집을 위해 `ConfigMap`을 엽니다.

      ```
      kubectl edit -n kube-system configmap/aws-auth
      ```

   1. 필요에 따라 새 `mapRoles` 항목을 추가합니다. `rolearn` 값을 이전 절차에서 기록한 **NodeInstanceRole** 값으로 설정합니다.

      ```
      [...]
      data:
        mapRoles: |
          - rolearn: <ARN of instance role (not instance profile)>
            username: system:node:{{EC2PrivateDNSName}}
            groups:
              - system:bootstrappers
              - system:nodes
      [...]
      ```

   1. 파일을 저장하고 텍스트 편집기를 종료합니다.

1. "`Error from server (NotFound): configmaps "aws-auth" not found`라는 오류 메시지가 표시되면 스톡 `ConfigMap`을 적용합니다.

   1. 구성 맵을 다운로드합니다.

      ```
      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
      ```

   1. `aws-auth-cm.yaml` 파일에서 `rolearn` 값을 이전 절차에서 기록한 **NodeInstanceRole** 값으로 설정합니다. 이 작업은 텍스트 편집기를 사용하거나 *my-node-instance-role*을 대체하고 다음 명령을 실행하여 수행할 수 있습니다.

      ```
      sed -i.bak -e 's|<ARN of instance role (not instance profile)>|my-node-instance-role|' aws-auth-cm.yaml
      ```

   1. 구성을 적용합니다. 이 명령을 완료하는 데 몇 분이 걸릴 수 있습니다.

      ```
      kubectl apply -f aws-auth-cm.yaml
      ```

1. 노드의 상태를 확인하고 `Ready` 상태가 될 때까지 대기합니다.

   ```
   kubectl get nodes --watch
   ```

   `Ctrl`\$1`C`를 입력하여 쉘 프롬프트로 돌아갑니다.
**참고**  
권한 부여 또는 리소스 유형 오류가 표시되는 경우 문제 해결 주제의 [권한이 없거나 액세스가 거부됨(`kubectl`)](troubleshooting.md#unauthorized) 부분을 참조하세요.

   노드가 클러스터에 조인하지 못한 경우 문제 해결 장의 [노드가 클러스터 조인에 실패](troubleshooting.md#worker-node-fail) 섹션을 참조하세요.

1. (GPU 노드만 해당) GPU 인스턴스 유형과 Amazon EKS 최적화 가속 AMI를 선택한 경우 클러스터에 [Kubernetes용 NVIDIA 디바이스 플러그인](https://github.com/NVIDIA/k8s-device-plugin)을 DaemonSet으로 적용해야 합니다. 다음 명령을 실행하기 전에 *vX.X.X*를 원하는 [NVIDIA/k8s-device-plugin](https://github.com/NVIDIA/k8s-device-plugin/releases) 버전으로 바꿉니다.

   ```
   kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/deployments/static/nvidia-device-plugin.yml
   ```

 **3단계: 추가 작업** 

1. (선택 사항) [샘플 애플리케이션](sample-deployment.md)을 배포하여 클러스터 및 Linux 노드를 테스트합니다.

1. (선택 사항) **AmazonEKS\$1CNI\$1Policy** 관리형 IAM 정책(`IPv4` 클러스터를 사용하는 경우) 또는 *AmazonEKS\$1CNI\$1IPv6\$1Policy*(`IPv6` 클러스터를 사용하는 경우 [직접 생성한 항목](cni-iam-role.md#cni-iam-role-create-ipv6-policy))가 [Amazon EKS 노드 IAM 역할](create-node-role.md)에 연결되어 있는 경우 대신 Kubernetes `aws-node` 서비스 계정에 연결하는 IAM 역할에 할당하는 것이 좋습니다. 자세한 내용은 [IRSA를 사용하도록 Amazon VPC CNI 플러그인 구성](cni-iam-role.md) 섹션을 참조하세요.

1. 다음과 같은 조건에 해당하면 IMDS에 대한 포드 액세스를 차단하는 것이 좋습니다.
   + 포드에 필요한 최소 권한만 있도록 모든 Kubernetes 서비스 계정에 IAM 역할을 할당할 계획입니다.
   + 클러스터의 어떤 포드도 현재 AWS 리전 검색 등의 다른 이유로 Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 액세스할 필요가 없습니다.

   자세한 내용은 [워커 노드에 할당된 인스턴스 프로필에 대한 액세스 제한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 섹션을 참조하세요.

# 자체 관리형 Bottlerocket 노드 생성
<a name="launch-node-bottlerocket"></a>

**참고**  
관리형 노드 그룹은 사용 사례에 대한 몇 가지 이점을 제공할 수 있습니다. 자세한 내용은 [관리형 노드 그룹을 사용한 노드 수명 주기 간소화](managed-node-groups.md) 섹션을 참조하세요.

이 주제에서는 Amazon EKS 클러스터에 등록하는 [Bottlerocket](https://aws.amazon.com/bottlerocket/) 노드의 Auto Scaling 그룹을 시작하는 방법을 설명합니다. Bottlerocket은 가상 머신 또는 베어메탈 호스트에서 컨테이너를 실행하는 데 사용할 수 있는 AWS의 Linux 기반 오픈 소스 운영 체제입니다. 노드가 클러스터에 조인한 이후 Kubernetes 애플리케이션을 배포할 수 있습니다. Bottlerocket에 대한 자세한 내용은 GitHub의 [Using a Bottlerocket AMI with Amazon EKS](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-EKS.md)와 `eksctl` 설명서의 [사용자 정의 AMI 지원](https://eksctl.io/usage/custom-ami-support/)을 참조하세요.

현재 위치 업그레이드에 대한 자세한 내용은 GitHub의 [Bottlerocket Update Operator](https://github.com/bottlerocket-os/bottlerocket-update-operator)를 참조하세요.

**중요**  
Amazon EKS 노드는 표준 Amazon EC2 인스턴스이고, 일반 Amazon EC2 인스턴스 가격을 기반으로 비용이 청구됩니다. 자세한 설명은 [Amazon EC2 요금](https://aws.amazon.com/ec2/pricing/)을 참조하세요.
Bottlerocket 노드를 AWS Outposts의 Amazon EKS 확장 클러스터에서 시작할 수 있지만 AWS Outposts의 로컬 클러스터에서는 시작할 수 없습니다. 자세한 내용은 [AWS Outposts를 사용한 Amazon EKS 온프레미스 배포](eks-outposts.md) 섹션을 참조하세요.
`x86` 또는 Arm프로세서가 있는 Amazon EC2 인스턴스에 배포할 수 있습니다. 그러나 Inferentia 칩이 있는 인스턴스에는 배포할 수 없습니다.
Bottlerocket은 AWS CloudFormation과 호환됩니다. 그러나 Amazon EKS용 Bottlerocket 노드를 배포하기 위해 복사할 수 있는 공식 CloudFormation 템플릿은 없습니다.
Bottlerocket 이미지는 SSH 서버나 쉘과 함께 제공되지 않습니다. 대역 외 액세스 방법을 사용하여 SSH가 관리 컨테이너를 사용 설정하고 사용자 데이터와 함께 일부 부트스트래핑 구성 단계를 전달하도록 할 수 있습니다. 자세한 내용은 GitHub의 [bottlerocket Readme.md](https://github.com/bottlerocket-os/bottlerocket)에 있는 관련 섹션을 참조하세요.  
 [탐색](https://github.com/bottlerocket-os/bottlerocket#exploration) 
 [관리자 컨테이너](https://github.com/bottlerocket-os/bottlerocket#admin-container) 
 [Kubernetes 설정](https://github.com/bottlerocket-os/bottlerocket#kubernetes-settings) 

이 절차에는 `eksctl` 버전 `0.215.0` 이상이 필요합니다. 버전은 다음 명령을 통해 확인할 수 있습니다.

```
eksctl version
```

`eksctl`을 설치하거나 업그레이드하는 방법에 대한 지침은 `eksctl` 문서의 [설치](https://eksctl.io/installation)를 참조하세요.참고: 이 절차는 `eksctl`로 생성한 클러스터에서만 작동합니다.

1. 다음 콘텐츠를 디바이스에 복사합니다. *my-cluster*를 해당 클러스터의 이름으로 바꿉니다. 이름에는 영숫자(대소문자 구분)와 하이픈만 사용할 수 있습니다. 영숫자로 시작해야 하며 100자 이하여야 합니다. 이름은 클러스터를 생성하는 AWS 리전과 AWS 계정 내에서 고유해야 합니다. *no-bottlerocket*을 노드 그룹의 이름으로 바꿉니다. 노드 그룹 이름은 63자를 초과할 수 없습니다. 문자나 숫자로 시작하되, 나머지 문자의 경우 하이픈과 밑줄을 포함할 수 있습니다. Arm 인스턴스에 배포하려면 *m5.large*을 Arm 인스턴스 유형으로 바꿉니다. *my-ec2-keypair-name*을 시작 이후 SSH를 사용하여 노드에 연결하는 데 사용할 수 있는 Amazon EC2 SSH 키 페어 이름으로 변경합니다. Amazon EC2 키 페어가 아직 없는 경우 AWS Management Console에서 새로 생성할 수 있습니다. 자세한 내용을 알아보려면 *Amazon EC2 key pairs*의 [Amazon EC2 키 페어](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)를 참조하세요. 나머지 예제 값을 자신의 값으로 바꿉니다. 다 바꾼 후 수정된 명령을 실행하여 `bottlerocket.yaml` 파일을 생성합니다.

   Arm Amazon EC2 인스턴스 유형을 지정하는 경우 배포하기 전에 [Amazon EKS 최적화 Arm Amazon Linux AMI](eks-optimized-ami.md#arm-ami)의 고려 사항을 검토하세요. 사용자 정의 AMI를 사용하여 배포하는 방법에 대한 지침은 GitHub의 [Building Bottlerocket](https://github.com/bottlerocket-os/bottlerocket/blob/develop/BUILDING.md)과 `eksctl` 문서의 [사용자 정의 AMI 지원](https://eksctl.io/usage/custom-ami-support/)을 참조하세요. 관리형 노드 그룹을 배포하려면 시작 템플릿을 사용하여 사용자 정의 AMI를 배포합니다. 자세한 내용은 [시작 템플릿을 사용한 관리형 노드 사용자 지정](launch-templates.md) 섹션을 참조하세요.
**중요**  
노드 그룹을 AWS Outposts, AWS Wavelength 또는 AWS Local Zones 서브넷에 배포하려면 클러스터를 생성할 때 AWS Outposts, AWS Wavelength 또는 AWS 로컬 영역 서브넷을 전달하지 마세요. 다음 예에서는 서브넷을 지정해야 합니다. 자세한 내용은 `eksctl` 문서에서 [구성 파일을 사용하여 nodegroup 생성](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file) 및 [구성 파일 스키마](https://eksctl.io/usage/schema/) 부분을 참조하세요. *region-code*를 클러스터가 있는 AWS 리전으로 바꿉니다.

   ```
   cat >bottlerocket.yaml <<EOF
   ---
   apiVersion: eksctl.io/v1alpha5
   kind: ClusterConfig
   
   metadata:
     name: my-cluster
     region: region-code
     version: '1.35'
   
   iam:
     withOIDC: true
   
   nodeGroups:
     - name: ng-bottlerocket
       instanceType: m5.large
       desiredCapacity: 3
       amiFamily: Bottlerocket
       ami: auto-ssm
       iam:
          attachPolicyARNs:
             - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
             - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
             - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
             - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
       ssh:
           allow: true
           publicKeyName: my-ec2-keypair-name
   EOF
   ```

1. 다음 명령을 사용하여 노드를 배포합니다.

   ```
   eksctl create nodegroup --config-file=bottlerocket.yaml
   ```

   예제 출력은 다음과 같습니다.

   노드가 생성되는 동안 여러 줄이 출력됩니다. 출력의 마지막 줄 중 하나는 다음 예제 줄과 유사합니다.

   ```
   [✔]  created 1 nodegroup(s) in cluster "my-cluster"
   ```

1. (선택 사항) [Amazon EBS CSI 플러그 인](https://github.com/kubernetes-sigs/aws-ebs-csi-driver)을 사용하여 Bottlerocket 노드에 Kubernetes [영구 볼륨](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)을 생성합니다. 기본 Amazon EBS 드라이버는 Bottlerocket에 포함되지 않은 파일 시스템 도구에 의존합니다. 드라이버를 사용하여 스토리지 클래스를 생성하는 방법에 대한 자세한 내용은 [Amazon EBS와 함께 Kubernetes 볼륨 스토리지 사용](ebs-csi.md) 부분을 참조하세요.

1. (선택 사항) 기본적으로 `kube-proxy`는 Bottlerocket이 부팅 시에 원래 설정한 것과 다를 수 있는 기본값으로 `nf_conntrack_max` 커널 파라미터를 설정합니다. Bottlerocket의 [기본 설정](https://github.com/bottlerocket-os/bottlerocket-core-kit/blob/develop/packages/release/release-sysctl.conf)을 유지하려면 다음 명령을 사용하여 `kube-proxy` 구성을 편집합니다.

   ```
   kubectl edit -n kube-system daemonset kube-proxy
   ```

   `--conntrack-max-per-core` 및 `--conntrack-min`을 다음 예에 있는 `kube-proxy` 인수에 추가합니다. `0`으로 설정할 경우 변경하지 않음을 나타냅니다.

   ```
         containers:
         - command:
           - kube-proxy
           - --v=2
           - --config=/var/lib/kube-proxy-config/config
           - --conntrack-max-per-core=0
           - --conntrack-min=0
   ```

1. (선택 사항) [샘플 애플리케이션](sample-deployment.md)을 배포하여 Bottlerocket 노드를 테스트합니다.

1. 다음과 같은 조건에 해당하면 IMDS에 대한 포드 액세스를 차단하는 것이 좋습니다.
   + 포드에 필요한 최소 권한만 있도록 모든 Kubernetes 서비스 계정에 IAM 역할을 할당할 계획입니다.
   + 클러스터의 어떤 포드도 현재 AWS 리전 검색 등의 다른 이유로 Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 액세스할 필요가 없습니다.

   자세한 내용은 [워커 노드에 할당된 인스턴스 프로필에 대한 액세스 제한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 섹션을 참조하세요.

# 자체 관리형 Microsoft Windows 노드 생성
<a name="launch-windows-workers"></a>

이 주제에서는 Amazon EKS 클러스터에 등록하는 Windows 노드의 오토 스케일링 그룹을 시작하는 방법을 설명합니다. 노드가 클러스터에 조인한 이후 Kubernetes 애플리케이션을 배포할 수 있습니다.

**중요**  
Amazon EKS 노드는 표준 Amazon EC2 인스턴스이고, 일반 Amazon EC2 인스턴스 가격을 기반으로 비용이 청구됩니다. 자세한 설명은 [Amazon EC2 요금](https://aws.amazon.com/ec2/pricing/)을 참조하세요.
Windows 노드를 AWS Outposts의 Amazon EKS 확장 클러스터에서 시작할 수 있지만 AWS Outposts의 로컬 클러스터에서는 시작할 수 없습니다. 자세한 내용은 [AWS Outposts를 사용한 Amazon EKS 온프레미스 배포](eks-outposts.md) 섹션을 참조하세요.

클러스터에 Windows 지원 사용 Windows 노드 그룹을 시작하기 전에 중요한 고려 사항을 검토하는 것이 좋습니다. 자세한 내용은 [Windows 지원 사용](windows-support.md#enable-windows-support) 섹션을 참조하세요.

다음 중 하나를 사용하여 자체 관리형 Windows 노드를 시작할 수 있습니다.
+  [`eksctl`](#eksctl_create_windows_nodes) 
+  [AWS Management Console](#console_create_windows_nodes) 

## `eksctl`
<a name="eksctl_create_windows_nodes"></a>

 **`eksctl`을 사용하여 자체 관리형 Windows 노드 시작 ** 

이 절차에서는 `eksctl`을 설치하고 `eksctl` 버전 `0.215.0` 이상을 요구합니다. 버전은 다음 명령을 통해 확인할 수 있습니다.

```
eksctl version
```

`eksctl` 설치 또는 업데이트에 대한 지침은 `eksctl` 설명서에서 [설치](https://eksctl.io/installation)를 참조하세요.

**참고**  
이 방법은 `eksctl`로 생성된 클러스터에만 사용할 수 있습니다.

1. (선택 사항) **AmazonEKS\$1CNI\$1Policy** 관리형 IAM 정책(`IPv4` 클러스터를 사용하는 경우) 또는 *AmazonEKS\$1CNI\$1IPv6\$1Policy*(`IPv6` 클러스터를 사용하는 경우 [직접 만든 것](cni-iam-role.md#cni-iam-role-create-ipv6-policy))이 [Amazon EKS 노드 IAM 역할](create-node-role.md)에 연결되어 있는 경우 대신 Kubernetes `aws-node` 서비스 계정에 연결하는 IAM 역할에 할당하는 것을 권장합니다. 자세한 내용은 [IRSA를 사용하도록 Amazon VPC CNI 플러그인 구성](cni-iam-role.md) 섹션을 참조하세요.

1. 이 절차에서는 기존 클러스터가 있다고 가정합니다. Windows 노드 그룹을 추가할 Amazon EKS 클러스터 및 Amazon Linux 노드 그룹이 아직 없는 경우에는 [Amazon EKS 시작하기 – `eksctl`](getting-started-eksctl.md) 가이드를 따르는 것이 좋습니다. 이 설명서에서는 Amazon Linux 노드로 Amazon EKS 클러스터를 생성하는 방법에 대한 전체 시연을 제공합니다.

   다음 명령을 사용하여 노드 그룹을 생성합니다. *region-code*를 클러스터가 있는 AWS 리전으로 바꿉니다. *<cluster-name>*을 클러스터 이름으로 바꿉니다. 이름에는 영숫자(대소문자 구분)와 하이픈만 사용할 수 있습니다. 영숫자로 시작해야 하며 100자 이하여야 합니다. 이름은 클러스터를 생성하는 AWS 리전과 AWS 계정 내에서 고유해야 합니다. *ng-windows*을 노드 그룹의 이름으로 바꿉니다. 노드 그룹 이름은 63자를 초과할 수 없습니다. 문자나 숫자로 시작하되, 나머지 문자의 경우 하이픈과 밑줄을 포함할 수 있습니다. Windows Server 2022를 사용하기 위해 *2019*를 `2022`로 대체하거나 Windows Server 2025를 사용하기 위해 `2025`로 대체할 수 있습니다. 나머지 예제 값을 자신의 값으로 대체합니다.
**중요**  
노드 그룹을 AWS Outposts, AWS Wavelength 또는 AWS Local Zones 서브넷에 배포하려면 클러스터를 생성할 때 AWS Outposts, Wavelength 또는 로컬 영역 서브넷을 전달하지 마세요. 구성 파일을 사용하여 노드 그룹을 생성합니다. 이때 AWS Outposts, Wavelength 또는 Local Zones 서브넷을 지정합니다. 자세한 내용은 `eksctl` 문서의 [구성 파일을 사용하여 nodegroup 생성](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file) 및 [구성 파일 스키마](https://eksctl.io/usage/schema/) 섹션을 참조하세요.

   ```
   eksctl create nodegroup \
       --region region-code \
       --cluster my-cluster \
       --name ng-windows \
       --node-type t2.large \
       --nodes 3 \
       --nodes-min 1 \
       --nodes-max 4 \
       --managed=false \
       --node-ami-family WindowsServer2019FullContainer
   ```
**참고**  
노드가 클러스터에 조인하지 못한 경우 문제 해결 안내서의 [노드가 클러스터 조인에 실패](troubleshooting.md#worker-node-fail) 부분을 참조하세요.
`eksctl` 명령에 사용 가능한 옵션을 보려면 다음 명령을 입력합니다.  

     ```
     eksctl command -help
     ```

   예제 출력은 다음과 같습니다. 노드가 생성되는 동안 여러 줄이 출력됩니다. 출력의 마지막 줄 중 하나는 다음 예제 줄과 유사합니다.

   ```
   [✔]  created 1 nodegroup(s) in cluster "my-cluster"
   ```

1. (선택 사항) [샘플 애플리케이션](sample-deployment.md)을 배포하여 클러스터 및 Windows 노드를 테스트합니다.

1. 다음과 같은 조건에 해당하면 IMDS에 대한 포드 액세스를 차단하는 것이 좋습니다.
   + 포드에 필요한 최소 권한만 있도록 모든 Kubernetes 서비스 계정에 IAM 역할을 할당할 계획입니다.
   + 클러스터의 어떤 포드도 현재 AWS 리전 검색 등의 다른 이유로 Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 액세스할 필요가 없습니다.

   자세한 내용은 [워커 노드에 할당된 인스턴스 프로필에 대한 액세스 제한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 섹션을 참조하세요.

## AWS Management Console
<a name="console_create_windows_nodes"></a>

 **사전 조건** 
+ 기존 Amazon EKS 클러스터 및 Linux 노드 그룹. 이러한 리소스가 없는 경우 [Amazon EKS 시작하기](getting-started.md)의 가이드 중 하나를 사용하여 생성하는 것이 좋습니다. 이러한 가이드에서는 Linux 노드로 Amazon EKS 클러스터를 생성하는 방법에 대해 설명합니다.
+ Amazon EKS 클러스터의 요구 사항을 충족하는 기존 VPC 및 전용 보안 그룹. 자세한 내용은 [VPC 및 서브넷에 대한 Amazon EKS 네트워킹 요구 사항 보기](network-reqs.md) 및 [클러스터에 대한 Amazon EKS 보안 그룹 요구 사항 보기](sec-group-reqs.md) 섹션을 참조하세요. [Amazon EKS 시작하기](getting-started.md)의 가이드에 따라 요구 사항을 충족하는 VPC를 만듭니다. 또는 [Amazon EKS 클러스터에 대한 Amazon VPC 생성](creating-a-vpc.md)을 따라 수동으로 생성할 수도 있습니다.
+ Amazon EKS 클러스터의 요구 사항을 충족하는 VPC 및 보안 그룹을 사용하는 기존 Amazon EKS 클러스터. 자세한 내용은 [Amazon EKS 클러스터 생성](create-cluster.md) 섹션을 참조하세요. AWS Outposts, AWS Wavelength 또는 AWS Local Zones이 사용된 AWS 리전에 서브넷이 있는 경우 클러스터를 생성할 때 해당 서브넷이 전달되지 않은 상태여야 합니다.

 **1단계: AWS Management Console을 사용하여 자체 관리형 Windows 노드를 시작하려면** 

1. 클러스터 상태가 `ACTIVE`가 되기를 기다립니다. 클러스터가 활성화되기 전에 노드를 시작하면 노드가 클러스터에 등록되지 않고 노드를 다시 시작해야 합니다.

1. [AWS CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation/) 열기 

1. **스택 생성**을 선택합니다.

1. **템플릿 지정**에서 **Amazon S3 URL**을 선택합니다.

1. 다음과 같은 URL을 복사하여 **Amazon S3 URL**에 붙여 넣습니다.

   ```
   https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2023-02-09/amazon-eks-windows-nodegroup.yaml
   ```

1. **다음**을 두 번 선택합니다

1. **빠른 스택 생성** 페이지에서 다음 파라미터를 적절하게 입력합니다.
   +  **스택 이름**: AWS CloudFormation 스택에 대한 스택 이름을 선택합니다. 예를 들어 `my-cluster-nodes`라고 할 수 있습니다.
   +  **ClusterName**: Amazon EKS 클러스터 생성 시 사용할 이름을 입력합니다.
**중요**  
이 이름은 [1단계: Amazon EKS 클러스터 생성](getting-started-console.md#eks-create-cluster)에서 사용한 이름과 정확히 일치해야 합니다. 그렇지 않으면 노드가 클러스터에 가입할 수 없습니다.
   +  **ClusterControlPlaneSecurityGroup**: [VPC](creating-a-vpc.md)를 만들 때 생성한 AWS CloudFormation 출력에서 보안 그룹을 선택합니다. 다음 단계에서는 해당 그룹을 검색하는 한 가지 방법을 보여줍니다.

     1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)을 엽니다.

     1. 클러스터의 이름을 선택합니다.

     1. **네트워킹** 탭을 선택합니다.

     1. **ClusterControlPlaneSecurityGroup** 드롭다운 목록에서 선택할 때 **추가 보안 그룹** 값을 참조로 사용하세요.
   +  **NodeGroupName**: 노드 그룹의 이름을 입력합니다. 이 이름은 나중에 노드에 대해 생성된 Auto Scaling 노드 그룹을 식별하는 데 사용할 수 있습니다. 노드 그룹 이름은 63자를 초과할 수 없습니다. 문자나 숫자로 시작하되, 나머지 문자의 경우 하이픈과 밑줄을 포함할 수 있습니다.
   +  **NodeAutoScalingGroupMinSize**: Auto Scaling 그룹이 축소할 수 있는 노드의 최소 노드 수를 입력합니다.
   +  **NodeAutoScalingGroupDesiredCapacity**: 스택을 생성할 때 조정할 원하는 노드 수를 입력합니다.
   +  **NodeAutoScalingGroupMaxSize**: Auto Scaling 그룹이 확장할 수 있는 노드의 최대 노드 수를 입력합니다.
   +  **NodeInstanceType**: 노드에 대한 인스턴스 유형을 선택합니다. 자세한 내용은 [최적의 Amazon EC2 노드 인스턴스 유형 선택](choosing-instance-type.md) 섹션을 참조하세요.
**참고**  
최신 버전의 [Kubernetes용 Amazon VPC CNI 플러그 인](https://github.com/aws/amazon-vpc-cni-k8s)에 대해 지원되는 인스턴스 유형은 GitHub의 [vpc\$1ip\$1resource\$1limit.go](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/pkg/vpc/vpc_ip_resource_limit.go)에 나열되어 있습니다. 지원되는 최신 인스턴스 유형을 사용하려면 CNI 버전을 업데이트해야 할 수 있습니다. 자세한 내용은 [Amazon VPC CNI를 통해 포드에 IP 할당](managing-vpc-cni.md) 섹션을 참조하세요.
   +  **NodeImageIdSSMParam**: 현재 권장되는 Amazon EKS 최적화 Windows Core AMI ID의 Amazon EC2 Systems Manager 파라미터로 미리 채워집니다. 전체 버전의 Windows를 사용하려면 *Core*를 `Full`로 바꿉니다.
   +  **NodeImageId**: (선택사항) Amazon EKS 최적화 AMI 대신 사용자 정의 AMI를 사용 중인 경우, 해당 AWS 리전에 노드 AMI ID를 입력합니다. 이 필드의 값을 지정하면 **NodeImageIdSSMParam** 필드에 있는 모든 값이 재정의됩니다.
   +  **NodeVolumeSize**: 노드에 대해 루트 볼륨 크기를 GiB 단위로 지정합니다.
   +  **KeyName**: 시작 이후 SSH를 사용하여 노드에 연결하는 데 사용할 수 있는 Amazon EC2 SSH 키 페어 이름을 입력합니다. Amazon EC2 키 페어가 아직 없는 경우 AWS Management Console에서 새로 생성할 수 있습니다. 자세한 내용을 알아보려면 *Amazon EC2 key pairs*의 [Amazon EC2 키 페어](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-key-pairs.html)를 참조하세요.
**참고**  
여기에 키 페어을 제공하지 않으면 AWS CloudFormation 스택이 생성되지 않습니다.
   +  **BootstrapArguments**: `-KubeletExtraArgs`를 사용하여 별도의 `kubelet` 인수와 같이 노드 부트스트랩 스크립트에 전달할 선택적 인수를 지정합니다.
   +  **DisableIMDSv1**: 기본적으로 각 노드는 인스턴스 메타데이터 서비스 버전 1(IMDSv1) 및 IMDSv2를 지원합니다. IMDSv1을 사용 중지할 수 있습니다. 향후 노드 그룹의 노드와 포드가 MDSv1을 사용하지 못하게 하려면 **DisableIMDSv1**을 **true**로 설정합니다. IMDS에 대한 자세한 내용은 [인스턴스 메타데이터 서비스 구성](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)을 참조하세요.
   +  **VpcId**: 생성한 [VPC](creating-a-vpc.md)에 대한 ID를 선택합니다.
   +  **NodeSecurityGroups**: [VPC](creating-a-vpc.md)를 생성할 때 Linux 노드 그룹에 대해 생성된 보안 그룹을 선택합니다. Linux 노드에 둘 이상의 보안 그룹이 연결되어 있는 경우 모든 보안 그룹을 지정합니다. 예를 들어 Linux 노드 그룹이 `eksctl`로 생성된 경우입니다.
   +  **서브넷**: 생성한 서브넷을 선택합니다. [Amazon EKS 클러스터를 위한 Amazon VPC 만들기](creating-a-vpc.md)의 단계를 사용하여 VPC를 만든 경우, 노드가 실행할 VPC 내의 사설 서브넷만 지정합니다.
**중요**  
서브넷 중 하나가 퍼블릭 서브넷인 경우 자동 퍼블릭 IP 주소 할당 설정을 사용하도록 설정해야 합니다. 퍼블릭 서브넷에 대해 이 설정을 사용하지 않으면 해당 퍼블릭 서브넷에 배포하는 노드에는 퍼블릭 IP 주소가 할당되지 않으며 클러스터 또는 기타 AWS 서비스와 통신할 수 없습니다. 서브넷이 2020년 3월 26일 이전에 [Amazon EKS AWS CloudFormation VPC 템플릿](creating-a-vpc.md) 또는 `eksctl`을 사용하여 배포된 경우 퍼블릭 서브넷에 대해 자동 퍼블릭 IP 주소 할당이 사용 중지됩니다. 서브넷에 퍼블릭 IP 주소 할당을 활성화하는 방법에 대한 자세한 내용은 [서브넷에 대한 퍼블릭 IPv4 주소 지정 속성 수정](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)을 참조하세요. 노드가 프라이빗 서브넷에 배포되면 NAT 게이트웨이를 통해 클러스터 및 다른 AWS 서비스와 통신할 수 있습니다.
서브넷에서 인터넷에 액세스할 수 없는 경우 [인터넷 액세스가 제한된 비공개 클러스터 배포하기](private-clusters.md)의 고려 사항과 추가 단계를 숙지하고 있는지 확인하세요.
AWS Outposts, Wavelength 또는 Local Zones 서브넷을 선택하는 경우 클러스터를 생성할 때 해당 서브넷이 전달되지 않은 상태여야 합니다.

1. 스택에서 IAM 리소스를 생성할 수 있는지 확인한 다음 **스택 생성**을 선택합니다.

1. 스택이 생성된 후 콘솔에서 이를 선택하고 **출력**을 선택합니다.

1. 생성된 노드 그룹에 대해 **NodeInstanceRole**을 기록합니다. Amazon EKS Windows 노드를 구성할 때 필요합니다.

 **2단계: 노드가 클러스터에 조인하도록 하려면** 

1. `aws-auth` `ConfigMap`이 이미 있는지 확인합니다.

   ```
   kubectl describe configmap -n kube-system aws-auth
   ```

1. `aws-auth` `ConfigMap`이 표시되면 필요에 따라 이를 업데이트합니다.

   1. 편집을 위해 `ConfigMap`을 엽니다.

      ```
      kubectl edit -n kube-system configmap/aws-auth
      ```

   1. 필요에 따라 새 `mapRoles` 항목을 추가합니다. `rolearn` 값을 이전 절차에서 기록한 **NodeInstanceRole** 값으로 설정합니다.

      ```
      [...]
      data:
        mapRoles: |
      - rolearn: <ARN of linux instance role (not instance profile)>
            username: system:node:{{EC2PrivateDNSName}}
            groups:
              - system:bootstrappers
              - system:nodes
          - rolearn: <ARN of windows instance role (not instance profile)>
            username: system:node:{{EC2PrivateDNSName}}
            groups:
              - system:bootstrappers
              - system:nodes
              - eks:kube-proxy-windows
      [...]
      ```

   1. 파일을 저장하고 텍스트 편집기를 종료합니다.

1. "`Error from server (NotFound): configmaps "aws-auth" not found`라는 오류 메시지가 표시되면 스톡 `ConfigMap`을 적용합니다.

   1. 구성 맵을 다운로드합니다.

      ```
      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm-windows.yaml
      ```

   1. `aws-auth-cm-windows.yaml` 파일에서 `rolearn` 값을 이전 절차에서 기록한 해당 **NodeInstanceRole** 값으로 설정합니다. 이 작업은 텍스트 편집기를 사용하거나 예제 값을 바꾸고 다음 명령을 실행하여 수행할 수 있습니다.

      ```
      sed -i.bak -e 's|<ARN of linux instance role (not instance profile)>|my-node-linux-instance-role|' \
          -e 's|<ARN of windows instance role (not instance profile)>|my-node-windows-instance-role|' aws-auth-cm-windows.yaml
      ```
**중요**  
이 파일에서 어떠한 행도 수정하지 마세요.
Windows 및 Linux 노드 모두에 동일한 IAM 역할을 사용하지 마세요.

   1. 구성을 적용합니다. 이 명령을 완료하는 데 몇 분이 걸릴 수 있습니다.

      ```
      kubectl apply -f aws-auth-cm-windows.yaml
      ```

1. 노드의 상태를 확인하고 `Ready` 상태가 될 때까지 대기합니다.

   ```
   kubectl get nodes --watch
   ```

   `Ctrl`\$1`C`를 입력하여 쉘 프롬프트로 돌아갑니다.
**참고**  
권한 부여 또는 리소스 유형 오류가 표시되는 경우 문제 해결 주제의 [권한이 없거나 액세스가 거부됨(`kubectl`)](troubleshooting.md#unauthorized) 부분을 참조하세요.

   노드가 클러스터에 조인하지 못한 경우 문제 해결 장의 [노드가 클러스터 조인에 실패](troubleshooting.md#worker-node-fail) 섹션을 참조하세요.

 **3단계: 추가 작업** 

1. (선택 사항) [샘플 애플리케이션](sample-deployment.md)을 배포하여 클러스터 및 Windows 노드를 테스트합니다.

1. (선택 사항) **AmazonEKS\$1CNI\$1Policy** 관리형 IAM 정책(`IPv4` 클러스터를 사용하는 경우) 또는 *AmazonEKS\$1CNI\$1IPv6\$1Policy*(`IPv6` 클러스터를 사용하는 경우 [직접 생성한 항목](cni-iam-role.md#cni-iam-role-create-ipv6-policy))가 [Amazon EKS 노드 IAM 역할](create-node-role.md)에 연결되어 있는 경우 대신 Kubernetes `aws-node` 서비스 계정에 연결하는 IAM 역할에 할당하는 것이 좋습니다. 자세한 내용은 [IRSA를 사용하도록 Amazon VPC CNI 플러그인 구성](cni-iam-role.md) 섹션을 참조하세요.

1. 다음과 같은 조건에 해당하면 IMDS에 대한 포드 액세스를 차단하는 것이 좋습니다.
   + 포드에 필요한 최소 권한만 있도록 모든 Kubernetes 서비스 계정에 IAM 역할을 할당할 계획입니다.
   + 클러스터의 어떤 포드도 현재 AWS 리전 검색 등의 다른 이유로 Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 액세스할 필요가 없습니다.

   자세한 내용은 [워커 노드에 할당된 인스턴스 프로필에 대한 액세스 제한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 섹션을 참조하세요.

# 자체 관리형 Ubuntu Linux 노드 생성
<a name="launch-node-ubuntu"></a>

**참고**  
관리형 노드 그룹은 사용 사례에 대한 몇 가지 이점을 제공할 수 있습니다. 자세한 내용은 [관리형 노드 그룹을 사용한 노드 수명 주기 간소화](managed-node-groups.md) 섹션을 참조하세요.

이 주제에서는 Amazon EKS 클러스터에 등록하는 [Amazon Elastic Kubernetes Service(EKS)의 Ubuntu](https://cloud-images.ubuntu.com/aws-eks/) 또는 [Amazon Elastic Kubernetes Service(EKS)의 Ubuntu Pro](https://ubuntu.com/blog/ubuntu-pro-for-eks-is-now-generally-available) 노드의 Auto Scaling 그룹을 시작하는 방법을 설명합니다. Ubuntu 및 Ubuntu Pro for EKS는 공식 Ubuntu Minimal LTS를 기반으로 하며, AWS와 공동으로 개발되고 EKS용으로 특별히 구축된 사용자 지정 AWS 커널을 포함합니다. Ubuntu Pro는 EKS 확장 지원 기간, 커널 라이브패치, FIPS 규정 준수 및 무제한 Pro 컨테이너를 실행할 수 있는 기능을 지원하여 보안 범위를 추가합니다.

노드가 클러스터에 조인한 이후 컨테이너화된 애플리케이션을 배포할 수 있습니다. 자세한 내용은 `eksctl` 설명서의 [AWS 상의 Ubuntu](https://documentation.ubuntu.com/aws/en/latest/) 및 [사용자 지정 AMI 지원](https://eksctl.io/usage/custom-ami-support/)을 참조하세요.

**중요**  
Amazon EKS 노드는 표준 Amazon EC2 인스턴스이고, 일반 Amazon EC2 인스턴스 가격을 기반으로 비용이 청구됩니다. 자세한 설명은 [Amazon EC2 요금](https://aws.amazon.com/ec2/pricing/)을 참조하세요.
Ubuntu 노드를 AWSOutposts의 Amazon EKS 확장 클러스터에서 시작할 수 있지만 AWS Outposts의 로컬 클러스터에서는 시작할 수 없습니다. 자세한 내용은 [AWS Outposts를 사용한 Amazon EKS 온프레미스 배포](eks-outposts.md) 섹션을 참조하세요.
`x86` 또는 Arm프로세서가 있는 Amazon EC2 인스턴스에 배포할 수 있습니다. 하지만 Inferentia 칩이 있는 인스턴스의 경우 먼저 [Neuron SDK](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/)를 설치해야 할 수 있습니다.

이 절차에는 `eksctl` 버전 `0.215.0` 이상이 필요합니다. 버전은 다음 명령을 통해 확인할 수 있습니다.

```
eksctl version
```

`eksctl`을 설치하거나 업그레이드하는 방법에 대한 지침은 `eksctl` 문서의 [설치](https://eksctl.io/installation)를 참조하세요.참고: 이 절차는 `eksctl`로 생성한 클러스터에서만 작동합니다.

1. 다음 콘텐츠를 디바이스에 복사합니다. `my-cluster`를 클러스터 이름으로 바꿉니다. 이름에는 영숫자(대소문자 구분)와 하이픈만 사용할 수 있습니다. 영문자로 시작해야 하며 100자 이하여야 합니다. `ng-ubuntu`을 노드 그룹의 이름으로 바꿉니다. 노드 그룹 이름은 63자를 초과할 수 없습니다. 문자나 숫자로 시작하되, 나머지 문자의 경우 하이픈과 밑줄을 포함할 수 있습니다. Arm 인스턴스에 배포하려면 `m5.large`을 Arm 인스턴스 유형으로 바꿉니다. `my-ec2-keypair-name`을 시작 이후 SSH를 사용하여 노드에 연결하는 데 사용할 수 있는 Amazon EC2 SSH 키 페어 이름으로 변경합니다. Amazon EC2 키 페어가 아직 없는 경우 AWS Management Console에서 새로 생성할 수 있습니다. 자세한 내용을 알아보려면 Amazon EC2 사용 설명서의 [Amazon EC2 키 페어](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)를 참조하세요. 나머지 예제 값을 자신의 값으로 바꿉니다. 다 바꾼 후 수정된 명령을 실행하여 `ubuntu.yaml` 파일을 생성합니다.
**중요**  
노드 그룹을 AWS Outposts, AWS Wavelength 또는 AWS Local Zones 서브넷에 배포하려면 클러스터를 생성할 때 AWS Outposts, AWS Wavelength 또는 AWS 로컬 영역 서브넷을 전달하지 마세요. 다음 예에서는 서브넷을 지정해야 합니다. 자세한 내용은 `eksctl` 문서에서 [구성 파일을 사용하여 nodegroup 생성](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file) 및 [구성 파일 스키마](https://eksctl.io/usage/schema/) 부분을 참조하세요. *region-code*를 클러스터가 있는 AWS 리전으로 바꿉니다.

   ```
   cat >ubuntu.yaml <<EOF
   ---
   apiVersion: eksctl.io/v1alpha5
   kind: ClusterConfig
   
   metadata:
     name: my-cluster
     region: region-code
     version: '1.35'
   
   iam:
     withOIDC: true
   
   nodeGroups:
     - name: ng-ubuntu
       instanceType: m5.large
       desiredCapacity: 3
       amiFamily: Ubuntu2204
       iam:
          attachPolicyARNs:
             - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
             - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
             - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
             - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
       ssh:
           allow: true
           publicKeyName: my-ec2-keypair-name
   EOF
   ```

   Ubuntu Pro 노드 그룹을 생성하려면 `amiFamily` 값을 `UbuntuPro2204`로 변경하면 됩니다.

1. 다음 명령을 사용하여 노드를 배포합니다.

   ```
   eksctl create nodegroup --config-file=ubuntu.yaml
   ```

   예제 출력은 다음과 같습니다.

   노드가 생성되는 동안 여러 줄이 출력됩니다. 출력의 마지막 줄 중 하나는 다음 예제 줄과 유사합니다.

   ```
   [✔]  created 1 nodegroup(s) in cluster "my-cluster"
   ```

1. (선택 사항) [샘플 애플리케이션](sample-deployment.md)을 배포하여 Ubuntu 노드를 테스트합니다.

1. 다음과 같은 조건에 해당하면 IMDS에 대한 포드 액세스를 차단하는 것이 좋습니다.
   + 포드에 필요한 최소 권한만 있도록 모든 Kubernetes 서비스 계정에 IAM 역할을 할당할 계획입니다.
   + 클러스터의 어떤 포드도 현재 AWS 리전 검색 등의 다른 이유로 Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 액세스할 필요가 없습니다.

   자세한 내용은 [워커 노드에 할당된 인스턴스 프로필에 대한 액세스 제한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 섹션을 참조하세요.

# 클러스터의 자체 관리형 노드 업데이트
<a name="update-workers"></a>

새로운 Amazon EKS 최적화 AMI가 릴리스되면 자체 관리형 노드 그룹의 노드를 새 AMI로 교체하는 것을 고려합니다. 마찬가지로, Amazon EKS 클러스터용 Kubernetes 버전을 업데이트한 경우 동일한 Kubernetes 버전이 있는 노드를 사용하도록 노드를 업데이트합니다.

**중요**  
이 주제에서는 자체 관리형 노드 그룹에 대한 노드 업데이트에 대해 설명합니다. [관리형 노드 그룹](managed-node-groups.md)을 사용하는 경우 [클러스터에 대한 관리형 노드 그룹 업데이트](update-managed-node-group.md) 섹션을 참조하세요.

새 AMI를 사용하도록 클러스터의 자체 관리형 노드 그룹을 업데이트하는 기본 방법에는 두 가지가 있습니다.

 ** [애플리케이션을 새 노드 그룹으로 마이그레이션](migrate-stack.md) **   
새 노드 그룹을 생성하고 포드를 해당 그룹으로 마이그레이션합니다. 기존 AWS CloudFormation 스택에서 단순히 AMI ID를 업데이트하는 것보다 새 노드 그룹으로 마이그레이션하는 것이 낫습니다. 이는 마이그레이션 프로세스가 이전 노드 그룹을 `NoSchedule`로 [테인트](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)하고 새 스택이 기존 포드 워크로드를 수락할 준비가 된 후 노드를 드레이닝하기 때문입니다.

 ** [AWS CloudFormation 노드 스택 업데이트](update-stack.md) **   
새 AMI를 사용하도록 기존 노드 그룹의 AWSCloudFormation 스택을 업데이트합니다. 이 방법은 `eksctl`로 생성한 노드 그룹에는 사용할 수 없습니다.

# 애플리케이션을 새 노드 그룹으로 마이그레이션
<a name="migrate-stack"></a>

이 주제에서는 새로운 노드 그룹을 생성하고, 기존 애플리케이션을 새 그룹으로 안정적으로 마이그레이션한 다음, 이전 노드 그룹을 클러스터에서 제거하는 방법을 설명합니다. `eksctl` 또는 AWS Management Console을 사용하여 새 노드 그룹으로 마이그레이션할 수 있습니다.
+  [`eksctl`](#eksctl_migrate_apps) 
+  [AWS Management Console 및 AWS CLI](#console_migrate_apps) 

## `eksctl`
<a name="eksctl_migrate_apps"></a>

 **`eksctl`을 사용하여 애플리케이션을 새 노드 그룹으로 마이그레이션하려면** 

마이그레이션에 eksctl을 사용하는 방법에 대한 자세한 내용은 `eksctl` 설명서의 [비관리형 노드 그룹](https://eksctl.io/usage/nodegroup-unmanaged/)을 참조하세요.

이 절차에는 `eksctl` 버전 `0.215.0` 이상이 필요합니다. 버전은 다음 명령을 통해 확인할 수 있습니다.

```
eksctl version
```

`eksctl` 설치 또는 업데이트에 대한 지침은 `eksctl` 설명서에서 [설치](https://eksctl.io/installation)를 참조하세요.

**참고**  
이 절차는 `eksctl`을 사용하여 생성한 클러스터 및 노드 그룹에 대해서만 사용할 수 있습니다.

1. *my-cluster*를 클러스터 이름으로 바꿔서 기존 노드 그룹의 이름을 검색합니다.

   ```
   eksctl get nodegroups --cluster=my-cluster
   ```

   예제 출력은 다음과 같습니다.

   ```
   CLUSTER      NODEGROUP          CREATED               MIN SIZE      MAX SIZE     DESIRED CAPACITY     INSTANCE TYPE     IMAGE ID
   default      standard-nodes   2019-05-01T22:26:58Z  1             4            3                    t3.medium         ami-05a71d034119ffc12
   ```

1. 다음 명령어로 `eksctl`을 사용하여 새 노드 그룹을 시작합니다. 명령에서 모든 *예제 값*을 고유한 값으로 바꿉니다. 버전 번호는 컨트롤 플레인의 Kubernetes 버전보다 이후일 수 없습니다. 또한 컨트롤 플레인의 Kubernetes 버전보다 이전인 마이너 버전이 2개를 초과할 수 없습니다. 컨트롤 플레인과 동일한 버전을 사용하는 것이 좋습니다.

   다음과 같은 조건에 해당하면 IMDS에 대한 포드 액세스를 차단하는 것이 좋습니다.
   + 포드에 필요한 최소 권한만 있도록 모든 Kubernetes 서비스 계정에 IAM 역할을 할당할 계획입니다.
   + 클러스터의 어떤 포드도 현재 AWS 리전 검색 등의 다른 이유로 Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 액세스할 필요가 없습니다.

     자세한 내용은 [작업자 노드에 할당된 인스턴스 프로필에 대한 액세스 제한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 부분을 참조하세요.

     포드가 IMDS에 액세스하지 못하게 차단하려면 `--disable-pod-imds` 옵션을 다음 명령에 추가합니다.
**참고**  
사용 가능한 플래그 및 설명에 대한 자세한 내용은 https://eksctl.io/를 참조하세요.

   ```
   eksctl create nodegroup \
     --cluster my-cluster \
     --version 1.35 \
     --name standard-nodes-new \
     --node-type t3.medium \
     --nodes 3 \
     --nodes-min 1 \
     --nodes-max 4 \
     --managed=false
   ```

1. 이전 명령이 완료되면 다음 명령으로 모든 노드가 `Ready` 상태가 되었는지 확인합니다.

   ```
   kubectl get nodes
   ```

1. 다음 명령을 사용하여 원래 노드 그룹을 삭제합니다. 명령에서 모든 *예제 값*을 클러스터 이름과 노드 그룹 이름으로 바꿉니다.

   ```
   eksctl delete nodegroup --cluster my-cluster --name standard-nodes-old
   ```

## AWS Management Console 및 AWS CLI
<a name="console_migrate_apps"></a>

 **AWS Management Console 및 AWS CLI에서 애플리케이션을 새 노드 그룹으로 마이그레이션하려면** 

1. [자체 관리 Amazon Linux 노드 생성](launch-workers.md)에 설명된 단계에 따라 새 노드 그룹을 시작합니다.

1. 스택이 생성된 후 콘솔에서 이를 선택하고 **출력**을 선택합니다.

1.  생성된 노드 그룹에 대해 **NodeInstanceRole**을 기록합니다. 새 Amazon EKS 노드를 클러스터에 추가하려면 이 정보가 필요합니다.
**참고**  
추가 IAM 정책을 이전 노드 그룹의 IAM 역할에 연결한 경우 새 그룹에서 해당 기능을 유지하려면 동일한 정책을 새 노드 그룹의 IAM 역할에 연결해야 합니다. 이는 예를 들어, Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler)에 대한 권한을 추가한 경우에 적용됩니다.

1. 두 노드 그룹이 서로 통신할 수 있도록 두 노드 그룹의 보안 그룹을 업데이트합니다. 자세한 내용은 [클러스터에 대한 Amazon EKS 보안 그룹 요구 사항 보기](sec-group-reqs.md) 섹션을 참조하세요.

   1. 두 노드 그룹에 대한 보안 그룹 ID를 모두 기록합니다. 이는 AWS CloudFormation 스택 출력에 **NodeSecurityGroup** 값으로 표시됩니다.

      다음 AWS CLI 명령을 사용하여 스택 이름에서 보안 그룹 ID를 가져옵니다. 이러한 명령에서 `oldNodes`는 이전 노드 스택의 AWS CloudFormation 스택 이름이고 `newNodes`는 마이그레이션하는 대상 스택의 이름입니다. 모든 *예제 값*을 자신의 값으로 바꾸세요.

      ```
      oldNodes="old_node_CFN_stack_name"
      newNodes="new_node_CFN_stack_name"
      
      oldSecGroup=$(aws cloudformation describe-stack-resources --stack-name $oldNodes \
      --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \
      --output text)
      newSecGroup=$(aws cloudformation describe-stack-resources --stack-name $newNodes \
      --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \
      --output text)
      ```

   1. 각 노드 보안 그룹이 서로의 트래픽을 수락하도록 노드 보안 그룹에 인그레스 규칙을 추가합니다.

      다음 AWS CLI 명령은 상대 보안 그룹의 모든 프로토콜에서 모든 트래픽을 허용하는 인바운드 규칙을 각 보안 그룹에 추가합니다. 이렇게 구성하면 워크로드를 새 그룹으로 마이그레이션하는 동안 각 노드 그룹의 포드가 서로 통신할 수 있습니다.

      ```
      aws ec2 authorize-security-group-ingress --group-id $oldSecGroup \
      --source-group $newSecGroup --protocol -1
      aws ec2 authorize-security-group-ingress --group-id $newSecGroup \
      --source-group $oldSecGroup --protocol -1
      ```

1. `aws-auth` configmap을 편집하여 RBAC에서 새 노드 인스턴스 역할을 매핑합니다.

   ```
   kubectl edit configmap -n kube-system aws-auth
   ```

   새 노드 그룹에 대한 새 `mapRoles` 항목을 추가합니다.

   ```
   apiVersion: v1
   data:
     mapRoles: |
       - rolearn: ARN of instance role (not instance profile)
         username: system:node:{{EC2PrivateDNSName}}
         groups:
           - system:bootstrappers
           - system:nodes>
       - rolearn: arn:aws:iam::111122223333:role/nodes-1-16-NodeInstanceRole-U11V27W93CX5
         username: system:node:{{EC2PrivateDNSName}}
         groups:
           - system:bootstrappers
           - system:nodes
   ```

   *ARN of instance role (not instance profile)* 조각을 [이전 절차](#node-instance-role-step)에서 기록한 **NodeInstanceRole **값으로 교체하고 파일을 저장합니다. 그런 다음 파일을 저장하고 닫아서 업데이트된 configmap을 적용합니다.

1. 노드의 상태를 보면서 새 노드가 클러스터에 조인하고 `Ready` 상태에 도달할 때까지 기다립니다.

   ```
   kubectl get nodes --watch
   ```

1. (선택사항) [Kubernetes Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler)를 사용하는 경우, 배포를 복제본 0개로 축소하여 조정 작업의 충돌을 방지합니다.

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=0 -n kube-system
   ```

1. 다음 명령을 사용하여 `NoSchedule`로 제거하려는 각 노드를 테인트합니다. 이는 바꾸고 있는 노드에서 새 포드가 예약되거나 다시 예약되지 않도록 하기 위한 것입니다. 자세한 내용은 Kubernetes 설명서의 [테인트와 허용 오차](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)를 참조하세요.

   ```
   kubectl taint nodes node_name key=value:NoSchedule
   ```

   노드를 새 Kubernetes 버전으로 업그레이드하는 경우 다음 코드 조각을 사용하여 특정 Kubernetes 버전(이 경우 `1.33`)의 모든 노드를 식별하고 테인트할 수 있습니다. 버전 번호는 컨트롤 플레인의 Kubernetes 버전보다 이후일 수 없습니다. 또한 컨트롤 플레인의 Kubernetes 버전보다 이전인 마이너 버전이 2개를 초과할 수 없습니다. 컨트롤 플레인과 동일한 버전을 사용하는 것이 좋습니다.

   ```
   K8S_VERSION=1.33
   nodes=$(kubectl get nodes -o jsonpath="{.items[?(@.status.nodeInfo.kubeletVersion==\"v$K8S_VERSION\")].metadata.name}")
   for node in ${nodes[@]}
   do
       echo "Tainting $node"
       kubectl taint nodes $node key=value:NoSchedule
   done
   ```

1.  클러스터의 DNS 공급자를 결정합니다.

   ```
   kubectl get deployments -l k8s-app=kube-dns -n kube-system
   ```

   예제 출력은 다음과 같습니다. 이 클러스터는 DNS 확인에 CoreDNS를 사용하고 있지만, 클러스터는 그 대신 `kube-dns`를 반환할 수 있습니다.

   ```
   NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
   coredns   1         1         1            1           31m
   ```

1. 현재 배포가 두 개 미만의 복제본을 실행하고 있는 경우, 배포를 복제본 두 개로 확장합니다. 이전 명령 출력에서 해당 값이 대신 반환된 경우 *coredns*을 `kubedns`로 교체합니다.

   ```
   kubectl scale deployments/coredns --replicas=2 -n kube-system
   ```

1. 다음 명령을 사용하여 클러스터에서 제거할 각 노드를 드레이닝합니다.

   ```
   kubectl drain node_name --ignore-daemonsets --delete-local-data
   ```

   노드를 새 Kubernetes 버전으로 업그레이드하는 경우 다음 코드 조각을 사용하여 특정 Kubernetes 버전(이 경우 *1.33*)의 모든 노드를 식별하고 드레이닝합니다.

   ```
   K8S_VERSION=1.33
   nodes=$(kubectl get nodes -o jsonpath="{.items[?(@.status.nodeInfo.kubeletVersion==\"v$K8S_VERSION\")].metadata.name}")
   for node in ${nodes[@]}
   do
       echo "Draining $node"
       kubectl drain $node --ignore-daemonsets --delete-local-data
   done
   ```

1. 이전 노드가 드레이닝을 완료한 후 앞서 권한을 부여한 보안 그룹 인바운드 규칙을 취소합니다. 그런 다음 AWS CloudFormation 스택을 삭제하여 인스턴스를 종료합니다.
**참고**  
[Kubernetes 클러스터 오토스케일러](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler)에 대한 사용 권한 추가와 같이 이전 노드 그룹 IAM 역할에 추가 IAM 정책을 첨부한 경우, AWS CloudFormation 스택을 삭제하기 전에 해당 추가 정책을 역할에서 분리해야 합니다.

   1. 위에서 노드 보안 그룹에 대해 생성한 인바운드 규칙을 취소합니다. 이러한 명령에서 `oldNodes`는 이전 노드 스택의 AWS CloudFormation 스택 이름이고 `newNodes`는 마이그레이션하는 대상 스택의 이름입니다.

      ```
      oldNodes="old_node_CFN_stack_name"
      newNodes="new_node_CFN_stack_name"
      
      oldSecGroup=$(aws cloudformation describe-stack-resources --stack-name $oldNodes \
      --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \
      --output text)
      newSecGroup=$(aws cloudformation describe-stack-resources --stack-name $newNodes \
      --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \
      --output text)
      aws ec2 revoke-security-group-ingress --group-id $oldSecGroup \
      --source-group $newSecGroup --protocol -1
      aws ec2 revoke-security-group-ingress --group-id $newSecGroup \
      --source-group $oldSecGroup --protocol -1
      ```

   1. [AWS CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation/)을 엽니다.

   1. 이전 노드 스택을 선택합니다.

   1. **삭제**를 선택합니다.

   1. **스택 삭제** 확인 대화 상자에서 **스택 삭제**를 선택합니다.

1. `aws-auth` configmap을 편집하여 RBAC에서 이전 노드 인스턴스 역할을 제거합니다.

   ```
   kubectl edit configmap -n kube-system aws-auth
   ```

   이전 노드 그룹에 대한 `mapRoles` 항목을 삭제합니다.

   ```
   apiVersion: v1
   data:
     mapRoles: |
       - rolearn: arn:aws:iam::111122223333:role/nodes-1-16-NodeInstanceRole-W70725MZQFF8
         username: system:node:{{EC2PrivateDNSName}}
         groups:
           - system:bootstrappers
           - system:nodes
       - rolearn: arn:aws:iam::111122223333:role/nodes-1-15-NodeInstanceRole-U11V27W93CX5
         username: system:node:{{EC2PrivateDNSName}}
         groups:
           - system:bootstrappers
           - system:nodes>
   ```

   파일을 저장하고 닫아서 업데이트된 configmap을 적용합니다.

1. (선택사항) Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler)를 사용하는 경우, 배포를 다시 복제본 한 개로 축소합니다.
**참고**  
또한 새 Auto Scaling 그룹에 적절한 태그를 지정하고(예: `k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/my-cluster`) 태그가 새로 지정된 Auto Scaling 그룹을 가리키도록 Cluster Autoscaler 배포에 대한 명령을 업데이트해야 합니다. 자세한 내용은 [AWS의 Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/cluster-autoscaler-release-1.3/cluster-autoscaler/cloudprovider/aws)를 참조하세요.

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=1 -n kube-system
   ```

1. (선택사항) 최신 버전의 [Kubernetes용 Amazon VPC CNI 플러그인](https://github.com/aws/amazon-vpc-cni-k8s)을 사용하고 있는지 확인합니다. 지원되는 최신 인스턴스 유형을 사용하려면 CNI 버전을 업데이트해야 할 수 있습니다. 자세한 내용은 [Amazon VPC CNI를 통해 포드에 IP 할당](managing-vpc-cni.md) 섹션을 참조하세요.

1. 클러스터가 DNS 확인에 `kube-dns`를 사용하는 경우,([[migrate-determine-dns-step]](#migrate-determine-dns-step) 단계 참조) `kube-dns` 배포를 복제본 한 개로 축소합니다.

   ```
   kubectl scale deployments/kube-dns --replicas=1 -n kube-system
   ```

# AWS CloudFormation 노드 스택 업데이트
<a name="update-stack"></a>

이 주제에서는 기존 AWS CloudFormation 자체 관리형 노드 스택을 새 AMI로 업데이트하는 방법을 설명합니다. 이 절차를 사용하여 클러스터 업데이트 후 새 버전의 Kubernetes로 노드를 업데이트할 수 있습니다. 그렇지 않으면 기존 Kubernetes 버전에 대해 최신 Amazon EKS 최적화 AMI로 업데이트할 수 있습니다.

**중요**  
이 주제에서는 자체 관리형 노드 그룹에 대한 노드 업데이트에 대해 설명합니다. [관리형 노드 그룹에서 Simplify 노드 수명 주기](managed-node-groups.md)를 사용하는 방법에 대한 자세한 내용은 [클러스터에 대한 관리형 노드 그룹 업데이트](update-managed-node-group.md)을 참조하세요.

최신 기본 Amazon EKS 노드 AWS CloudFormation 템플릿은 예전 인스턴스를 제거하기 전에 한 번에 하나씩 새 AMI로 인스턴스를 시작하도록 구성되어 있습니다. 이렇게 구성하면 업데이트를 적용하는 동안 클러스터의 Auto Scaling 그룹에 항상 활성 인스턴스 수를 원하는 대로 항상 유지할 수 있습니다.

**참고**  
이 방법은 `eksctl`로 생성한 노드 그룹에는 사용할 수 없습니다. `eksctl`을 사용하여 클러스터 또는 노드 그룹을 생성한 경우, [애플리케이션을 새 노드 그룹으로 마이그레이션](migrate-stack.md) 부분을 참조하세요.

1. 클러스터의 DNS 공급자를 결정합니다.

   ```
   kubectl get deployments -l k8s-app=kube-dns -n kube-system
   ```

   예제 출력은 다음과 같습니다. 이 클러스터는 DNS 확인에 CoreDNS를 사용하고 있지만, 클러스터는 그 대신 `kube-dns`를 반환할 수 있습니다. 사용 중인 `kubectl` 버전에 따라 출력물이 다르게 보일 수 있습니다.

   ```
   NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
   coredns   1         1         1            1           31m
   ```

1. 현재 배포가 두 개 미만의 복제본을 실행하고 있는 경우, 배포를 복제본 두 개로 확장합니다. 이전 명령 출력에서 해당 값이 대신 반환된 경우 *coredns*을 `kube-dns`로 교체합니다.

   ```
   kubectl scale deployments/coredns --replicas=2 -n kube-system
   ```

1. (선택사항) [Kubernetes Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)를 사용하는 경우, 배포를 복제본 0개로 축소하여 조정 작업의 충돌을 방지합니다.

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=0 -n kube-system
   ```

1.  현재 노드 그룹의 인스턴스 유형과 원하는 인스턴스 수를 결정합니다. 나중에 그룹에 대한 AWS CloudFormation 템플릿을 업데이트할 때 이러한 값을 입력합니다.

   1. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.

   1. 왼쪽 탐색 창에서 **시작 구성**을 선택하고 기존 노드 시작 구성에 대한 인스턴스 유형을 기록해 둡니다.

   1. 왼쪽 탐색 창에서 **Auto Scaling 그룹**을 선택하고 기존 노드 Auto Scaling 그룹에 대해 **원하는** 인스턴스 수를 적어둡니다.

1. [AWS CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation/)을 엽니다.

1. 노드 그룹 스택을 선택한 다음 **업데이트**를 선택합니다.

1. **현재 템플릿 대치**를 선택하고 **Amazon S3 URL**을 선택합니다.

1. **Amazon S3 URL**에서 다음 URL을 텍스트 영역에 붙여 넣어 최신 버전의 노드 AWS CloudFormation 템플릿을 사용하고 있는지 확인합니다. 그리고 **다음**을 선택합니다.

   ```
   https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2022-12-23/amazon-eks-nodegroup.yaml
   ```

1. **스택 세부 정보 지정** 페이지에서 다음 파라미터를 입력하고 **다음**을 선택합니다.
   +  **NodeAutoScalingGroupDesiredCapacity** - [이전 단계](#existing-worker-settings-step)에서 기록한 원하는 인스턴스 수를 입력합니다. 또는 스택을 업데이트할 때 조정할 원하는 새 노드 수를 입력합니다.
   +  **NodeAutoScalingGroupMaxSize** - Auto Scaling 그룹이 확장할 수 있는 노드의 최대 노드 수를 입력합니다. 이 값은 원하는 용량보다 하나 이상의 노드여야 합니다. 이는 업데이트 중에 노드 수를 줄이지 않고 노드의 롤링 업데이트를 수행할 수 있도록 하기 위한 것입니다.
   +  **NodeInstanceType** - [이전 단계](#existing-worker-settings-step)에서 기록한 인스턴스 유형을 선택합니다. 또는 노드에 대해 다른 인스턴스 유형을 선택합니다. 다른 인스턴스 유형을 선택하기 전에 [최적의 Amazon EC2 노드 인스턴스 유형 선택](choosing-instance-type.md)을 검토합니다. 각 Amazon EC2 인스턴스 유형은 탄력적 네트워크 인터페이스(네트워크 인터페이스)의 최대 수를 지원하며 각 네트워크 인터페이스는 최대 IP 주소 수를 지원합니다. 각 워커 노드와 포드에는 고유한 IP 주소가 할당되므로 각 Amazon EC2 노드에서 실행할 최대 포드 수를 지원하는 인스턴스 유형을 선택하는 것이 중요합니다. 인스턴스 유형이 지원하는 네트워크 인터페이스 및 IP 주소의 수 목록은 [인스턴스 유형별 네트워크 인터페이스당 IP 주소](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)를 참조하세요. 예를 들어, `m5.large` 인스턴스 유형은 워커 노드 및 포드에 대해 최대 30개의 IP 주소를 지원합니다.
**참고**  
최신 버전의 [Kubernetes용 Amazon VPC CNI 플러그 인](https://github.com/aws/amazon-vpc-cni-k8s)에 대해 지원되는 인스턴스 유형은 GitHub의 [vpc\$1ip\$1resource\$1limit.go](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/pkg/vpc/vpc_ip_resource_limit.go)에 나와 있습니다. 지원되는 최신 인스턴스 유형을 사용하려면 Kubernetes용 Amazon VPC CNI 플러그인 버전을 업데이트해야 할 수 있습니다. 자세한 내용은 [Amazon VPC CNI를 통해 포드에 IP 할당](managing-vpc-cni.md) 섹션을 참조하세요.
**중요**  
AWS 리전에 따라 일부 인스턴스 유형은 사용할 수 없습니다.
   +  **NodeImageIdSSMParam** – 업데이트하려는 AMI ID의 Amazon EC2 Systems Manager 파라미터입니다. 다음 값에서는 Kubernetes 버전 `1.35`에 대해 최신 Amazon EKS 최적화 AMI를 사용합니다.

     ```
     /aws/service/eks/optimized-ami/1.35/amazon-linux-2/recommended/image_id
     ```

     *1.35*을 동일한 [플랫폼 버전](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html)으로 바꿀 수 있습니다. 또는 제어 영역에서 실행 중인 Kubernetes 버전보다 최대 한 버전 이전이어야 합니다. 노드를 제어 영역과 동일한 버전으로 유지하는 것이 좋습니다. *amazon-linux-2*를 다른 AMI 유형으로 바꿀 수도 있습니다. 자세한 내용은 [권장 Amazon Linux AMI ID 검색](retrieve-ami-id.md) 섹션을 참조하세요.
**참고**  
Amazon EC2 Systems Manager 파라미터를 사용하면 AMI ID를 조회하고 지정하지 않아도 나중에 노드를 업데이트할 수 있습니다. AWS CloudFormation 스택에서 이 값을 사용 중이라면 모든 스택 업데이트는 지정된 Kubernetes 버전에 권장되는 최신 Amazon EKS 최적화 AMI를 항상 시작합니다. 템플릿에서 값을 변경하지 않은 경우에도 마찬가지입니다.
   +  **NodeImageId** – 고유한 사용자 지정 AMI를 사용하려면 사용할 AMI의 ID를 입력하세요.
**중요**  
이 값은 **NodeImageIdSSMParam**에 지정된 값을 재정의합니다. **NodeImageIdSSMParam** 값을 사용하려면 **NodeImageId**의 값이 비어 있는지 확인하세요.
   +  **DisableIMDSv1** - 기본적으로 각 노드는 인스턴스 메타데이터 서비스 버전 1(IMDSv1) 및 IMDSv2를 지원합니다. 그러나 IMDSv1을 사용 중지할 수 있습니다. 노드 그룹에서 예약된 노드 또는 포드가 IMDSv1을 사용하지 않도록 하려면 **true**를 선택합니다. IMDS에 대한 자세한 내용은 [인스턴스 메타데이터 서비스 구성](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)을 참조하세요. 서비스 계정에 대한 IAM 역할을 구현한 경우 AWS 서비스에 대한 액세스 권한이 필요한 모든 포드에 직접 필요한 권한을 할당합니다. 이렇게 하면 현재 AWS 리전 검색 등의 다른 이유로 클러스터의 포드가 IMDS에 액세스할 필요가 없습니다. 그런 다음 호스트 네트워킹을 사용하지 않는 포드에 대해 IMDSv2 액세스를 사용 중지할 수도 있습니다. 자세한 내용은 [작업자 노드에 할당된 인스턴스 프로필에 대한 액세스 제한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 부분을 참조하세요.

1. (선택사항) **옵션** 페이지에서 스택 리소스에 태그를 지정합니다. **다음**을 선택합니다.

1. **검토** 페이지에서 정보를 검토하고, 스택이 IAM 리소스를 생성할 수 있는지 확인한 다음, **스택 업데이트**를 선택합니다.
**참고**  
클러스터의 각 노드를 업데이트하는 데 몇 분 정도 걸립니다. 모든 노드의 업데이트가 완료될 때까지 기다린 후 다음 단계를 수행합니다.

1. 클러스터의 DNS 공급자가 `kube-dns`인 경우 `kube-dns` 배포를 복제본 한 개로 축소합니다.

   ```
   kubectl scale deployments/kube-dns --replicas=1 -n kube-system
   ```

1. (선택 사항) Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)를 사용하는 경우 배포를 다시 원하는 양의 복제본으로 조정합니다.

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=1 -n kube-system
   ```

1. (선택사항) 최신 버전의 [Kubernetes용 Amazon VPC CNI 플러그인](https://github.com/aws/amazon-vpc-cni-k8s)을 사용하고 있는지 확인합니다. 지원되는 최신 인스턴스 유형을 사용하려면 Kubernetes용 Amazon VPC CNI 플러그인 버전을 업데이트해야 할 수 있습니다. 자세한 내용은 [Amazon VPC CNI를 통해 포드에 IP 할당](managing-vpc-cni.md) 섹션을 참조하세요.

# AWS Fargate를 사용한 컴퓨팅 관리 간소화
<a name="fargate"></a>

이 주제에서는 AWS Fargate에서 Amazon EKS를 사용하여 Kubernetes 포드를 실행하는 방법을 설명합니다. Fargate는 [컨테이너](https://aws.amazon.com/what-are-containers)에 대한 적정 규모의 온디맨드 컴퓨팅 용량을 제공하는 기술입니다. Fargate를 사용하면 컨테이너를 실행하려면 직접 가상 머신 그룹을 프로비저닝, 구성 또는 크기를 조정할 필요가 없습니다. 따라서 서버 유형을 선택하거나, 노드 그룹을 조정할 시점을 결정하거나, 클러스터 패킹을 최적화할 필요가 없습니다.

Fargate에서 시작하는 포드와 [Fargate 프로필](fargate-profile.md)에서 실행되는 방법을 제어할 수 있습니다. Fargate 프로필은 Amazon EKS 클러스터의 일부로 정의됩니다. Amazon EKS는 Kubernetes에서 제공한 확장 가능한 업스트림 모델을 사용하여 AWS에서 빌드한 컨트롤러를 사용하여 Kubernetes를 Fargate와 통합합니다. 이러한 컨트롤러는 Amazon EKS 관리형 Kubernetes 컨트롤 플레인의 일부로 실행되며 Fargate에 기본 Kubernetes 포드를 예약합니다. Fargate 컨트롤러에는 여러 개의 변형 및 검증 승인 컨트롤러 외에도 기본 Kubernetes 스케줄러와 함께 실행되는 새 스케줄러가 포함되어 있습니다. Fargate에서 실행하기 위한 조건을 충족하는 포드를 시작하면 클러스터에서 실행되는 Fargate 컨트롤러가 해당 포드를 인식하고 업데이트하고 Fargate에 예약합니다.

이 주제에서는 Fargate에서 실행되는 포드의 여러 구성 요소에 대해 설명하고 Amazon EKS에서 Fargate를 사용하기 위한 특별한 고려 사항을 살펴봅니다.

## AWS Fargate 고려 사항
<a name="fargate-considerations"></a>

Amazon EKS에서 Fargate를 사용할 때 고려해야 할 몇 가지 사항이 있습니다.
+ Fargate에서 실행되는 각 포드에는 자체 컴퓨팅 경계가 있습니다. 기본 커널, CPU 리소스, 메모리 리소스 또는 탄력적 네트워크 인터페이스를 다른 포드와 공유하지 않습니다.
+ Network Load Balancer 및 Application Load Balancer(ALB)는 IP 대상을 통해서만 Fargate에서 사용할 수 있습니다. 자세한 내용은 [Network Load Balancer 생성](network-load-balancing.md#network-load-balancer) 및 [Application Load Balancer를 사용하여 애플리케이션 및 HTTP 트래픽 라우팅](alb-ingress.md) 섹션을 참조하세요.
+ Fargate 노출 서비스는 노드 IP 모드가 아닌 대상 유형 IP 모드에서만 실행됩니다. 관리형 노드에서 실행 중인 서비스와 Fargate에서 실행 중인 서비스의 연결을 확인하는 권장 방법은 서비스 이름을 통해 연결하는 것입니다.
+ 포드는 Fargate에서 실행되도록 예약된 시간에 Fargate 프로필과 일치해야 합니다. Fargate 프로필과 일치하지 않는 포드는 `Pending`과 같이 중단될 수 있습니다. 일치하는 Fargate 프로필이 있는 경우 사용자가 생성한 보류 중인 포드를 삭제하여 Fargate에 다시 예약할 수 있습니다.
+ DaemonSets는 Fargate에서 지원되지 않습니다. 애플리케이션에 대몬이 필요한 경우 포드에서 사이드카 컨테이너로 실행되도록 해당 대몬을 다시 구성합니다.
+ 권한 있는(Privileged) 컨테이너는 Fargate에서 지원되지 않습니다.
+ Fargate에서 실행되는 포드는 포드 매니페스트에서 `HostPort` 또는 `HostNetwork`를 지정할 수 없습니다.
+ Fargate 포드의 경우 기본 `nofile` 및 `nproc` 소프트 제한은 1,024이고 하드 제한은 6만 5,535입니다.
+ GPU는 현재 Fargate에서 사용할 수 없습니다.
+ Fargate에서 실행되는 포드는 인터넷 게이트웨이에 대한 직접 경로가 없고 AWS 서비스에 대한 NAT 게이트웨이 액세스 권한이 있는 프라이빗 서브넷에서만 지원되므로 클러스터의 VPC에 프라이빗 서브넷이 있어야 합니다. 아웃바운드 인터넷 액세스가 없는 클러스터의 경우 [인터넷 액세스가 제한된 프라이빗 클러스터 배포](private-clusters.md)을 참조하세요.
+ [Vertical Pod Autoscaler로 포드 리소스 조정](vertical-pod-autoscaler.md)을 사용하여 Fargate 포드의 초기 올바른 CPU 및 메모리 크기를 설정한 다음 [Horizontal Pod Autoscaler로 포드 배포 확장](horizontal-pod-autoscaler.md)을 사용하여 해당 포드의 규모를 조정할 수 있습니다. Vertical Pod Autoscaler가 더 큰 CPU 및 메모리 조합으로 포드를 Fargate에 자동으로 다시 배포하도록 하려면 Vertical Pod Autoscaler의 모드를 `Auto` 또는 `Recreate`로 설정하여 올바로 작동하게 해야 합니다. 자세한 내용은 GitHub에서 [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#quick-start) 문서를 참조하세요.
+ VPC에 대해 DNS 확인 및 DNS 호스트 이름을 활성화해야 합니다. 자세한 내용은 [VPC에 대한 DNS 지원 보기 및 업데이트](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-updating)를 참조하세요.
+ Amazon EKS Fargate는 가상 머신(VM) 내에서 각 포드를 격리하여 Kubernetes 애플리케이션에 대한 심층 방어 기능을 추가합니다. 이 VM 경계를 통해 컨테이너 이스케이프 시 다른 포드에서 사용하는 호스트 기반 리소스에 대한 액세스를 방지하는데, 이 방법은 컨테이너화된 애플리케이션을 공격하고 컨테이너 외부의 리소스에 대한 액세스 권한을 얻는 일반적인 방법입니다.

  Amazon EKS를 사용해도 [공동 책임 모델](security.md)에서 책임은 변경되지 않습니다. 클러스터 보안 및 거버넌스 제어의 구성을 신중하게 고려해야 합니다. 애플리케이션을 격리하는 가장 안전한 방법은 항상 별도의 클러스터에서 실행하는 것입니다.
+ Fargate 프로필은 VPC 보조 CIDR 블록의 서브넷 지정을 지원합니다. 보조 CIDR 블록을 지정할 수도 있습니다. 서브넷에서 사용 가능한 IP 주소의 수는 제한되어 있기 때문입니다. 따라서 클러스터에서 생성할 수 있는 포드의 수가 제한되어 있습니다. 포드에 다른 서브넷을 사용하여 사용 가능한 IP 주소의 수를 늘릴 수 있습니다. 자세한 내용은 [VPC에 IPv4 CIDR 블록 추가](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html#vpc-resize)를 참조하세요.
+ Amazon EC2 인스턴스 메타데이터 서비스(IMDS)는 Fargate 노드에 배포된 포드에는 사용할 수 없습니다. IAM 자격 증명이 필요한 포드를 Fargate에 배포한 경우 [서비스 계정용 IAM 역할](iam-roles-for-service-accounts.md)을 사용하여 포드에 할당합니다. 포드가 IMDS를 통해 제공되는 다른 정보에 액세스해야 할 경우 이 정보를 포드 사양에 하드 코딩해야 합니다. 여기에는 포드가 배포된 AWS 리전 또는 가용 영역이 포함됩니다.
+ Fargate 포드는 AWS Outposts, AWS Wavelength 또는 AWS 로컬 영역에 배포할 수 없습니다.
+ Amazon EKS는 정기적으로 Fargate 포드를 패치하여 보안을 유지해야 합니다. 영향을 줄이는 방식으로 업데이트를 시도하지만 포드가 성공적으로 제거되지 않으면 포드를 삭제해야 하는 경우가 있습니다. 중단을 최소화하기 위해 취할 수 있는 몇 가지 조치가 있습니다. 자세한 내용은 [AWS Fargate OS 패치 이벤트에 대한 작업 설정](fargate-pod-patching.md) 섹션을 참조하세요.
+ [Amazon EKS용 Amazon VPC CNI 플러그인](https://github.com/aws/amazon-vpc-cni-plugins)은 Fargate 노드에 설치됩니다. Fargate 노드가 있는 [Amazon EKS 클러스터에는 대체 CNI 플러그인](alternate-cni-plugins.md)을 사용할 수 없습니다.
+ Fargate에서 실행되는 포드는 수동 드라이버 설치 단계 없이 Amazon EFS 파일 시스템을 자동으로 탑재합니다. Fargate 노드에는 동적 영구 볼륨 프로비저닝을 사용할 수 없지만 고정적인 프로비저닝은 사용할 수 있습니다.
+ Amazon EKS는 Fargate 스팟을 지원하지 않습니다.
+ Amazon EBS 볼륨을 Fargate 포드에 탑재할 수 없습니다.
+ Amazon EBS CSI 컨트롤러는 Fargate 노드에서 실행할 수 있지만 Amazon EBS CSI 노드 DaemonSet은 Amazon EC2 인스턴스에서만 실행할 수 있습니다.
+ [Kubernetes 작업](https://kubernetes.io/docs/concepts/workloads/controllers/job/)이 `Completed` 또는 `Failed`로 표시된 후에도 작업이 생성하는 포드는 정상적으로 계속 존재합니다. 이 동작을 통해 로그와 결과를 볼 수 있지만 Fargate를 사용하는 경우 나중에 작업을 정리하지 않으면 비용이 발생합니다.

  작업이 완료되거나 실패한 후 관련 포드를 자동으로 삭제하려면 TTL(Time-to-Live) 컨트롤러를 사용하여 기간을 지정할 수 있습니다. 다음 예제에서는 작업 매니페스트에 `.spec.ttlSecondsAfterFinished`를 지정하는 방법을 보여줍니다.

  ```
  apiVersion: batch/v1
  kind: Job
  metadata:
    name: busybox
  spec:
    template:
      spec:
        containers:
        - name: busybox
          image: busybox
          command: ["/bin/sh", "-c", "sleep 10"]
        restartPolicy: Never
    ttlSecondsAfterFinished: 60 # <-- TTL controller
  ```

## Fargate 비교 테이블
<a name="_fargate_comparison_table"></a>


| 기준 |  AWS Fargate | 
| --- | --- | 
|  [AWS Outposts](https://docs.aws.amazon.com/outposts/latest/userguide/what-is-outposts.html)에 배포 가능   |  아니요  | 
|  [AWS Local Zones](local-zones.md)에 배포할 수 있습니다.  |  아니요  | 
|  Windows가 필요한 컨테이너를 실행할 수 있습니다.  |  아니요  | 
|  Linux가 필요한 컨테이너를 실행할 수 있습니다.  |  예  | 
|  Inferentia 칩이 필요한 워크로드를 실행할 수 있습니다.  |  아니요  | 
|  GPU가 필요한 워크로드를 실행할 수 있습니다.  |  아니요  | 
|  Arm 프로세서가 필요한 워크로드를 실행할 수 있습니다.  |  아니요  | 
|  AWS [Bottlerocket](https://aws.amazon.com/bottlerocket/)을 실행할 수 있습니다.  |  아니요  | 
|  포드가 커널 런타임 환경을 다른 포드와 공유합니다.  |  아니요 - 각 포드에는 전용 커널이 있습니다.  | 
|  포드가 CPU, 메모리, 스토리지 및 네트워크 리소스를 다른 포드와 공유합니다.  |  아니요 - 각 포드에는 전용 리소스가 있으며 독립적으로 크기를 조정하여 리소스 활용도를 극대화할 수 있습니다.  | 
|  포드가 포드 사양에서 요청한 것보다 더 많은 하드웨어 및 메모리를 사용할 수 있습니다.  |  아니요 - 더 큰 vCPU 및 메모리 구성을 사용하여 포드를 다시 배포할 수 있습니다.  | 
|  Amazon EC2 인스턴스를 배포하고 관리해야 합니다.  |  아니요  | 
|  Amazon EC2 인스턴스의 운영 체제를 보호, 유지 관리 및 패치해야 합니다.  |  아니요  | 
|  노드 배포 시 추가 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 인수와 같은 부트스트랩 인수를 제공할 수 있습니다.  |  아니요  | 
|  노드에 할당된 IP 주소와 다른 CIDR 블록의 포드에 IP 주소를 할당할 수 있습니다.  |  아니요  | 
|  노드에 SSH를 연결할 수 있습니다.  |  아니요 - SSH에 사용할 노드 호스트 운영 체제가 없습니다.  | 
|  사용자 지정 AMI 노드에 배포할 수 있습니다.  |  아니요  | 
|  사용자 지정 CNI 노드에 배포할 수 있습니다.  |  아니요  | 
|  노드 AMI를 직접 업데이트해야 합니다.  |  아니요  | 
|  노드 Kubernetes 버전을 직접 업데이트해야 합니다.  |  아니요 — 노드를 관리하지 않습니다.  | 
|  포드에 Amazon EBS 스토리지를 사용할 수 있습니다.  |  아니요  | 
|  포드에 Amazon EFS 스토리지를 사용할 수 있습니다.  |   [예](efs-csi.md)   | 
|  포드에 Amazon FSx for Lustre 스토리지를 사용할 수 있습니다.  |  아니요  | 
|  서비스에 Network Load Balancer를 사용할 수 있습니다.  |  예, [네트워크 로드 밸런서 생성](network-load-balancing.md#network-load-balancer) 사용 시   | 
|  포드가 퍼블릭 서브넷에서 실행될 수 있습니다.  |  아니요  | 
|  개별 포드에 서로 다른 VPC 보안 그룹을 할당할 수 있습니다.  |  예  | 
|  Kubernetes DaemonSet를 실행할 수 있습니다.  |  아니요  | 
|  포드 매니페스트에서 `HostPort` 및 `HostNetwork`를 지원할 수 있습니다.  |  아니요  | 
|   AWS 리전 가용성  |   [일부 Amazon EKS 지원 리전](https://docs.aws.amazon.com/general/latest/gr/eks.html)   | 
|  Amazon EC2 전용 호스트에서 컨테이너를 실행할 수 있습니다.  |  아니요  | 
|  요금  |  개별 Fargate 메모리 및 CPU 구성 비용입니다. 각 포드에는 자체 비용이 있습니다. 자세한 내용은 [AWS Fargate 요금](https://aws.amazon.com/fargate/pricing/)을 참조하세요.  | 

# 클러스터를 위한 AWS Fargate 시작하기
<a name="fargate-getting-started"></a>

이 주제에서는 Amazon EKS 클러스터를 사용하여 AWS Fargate에서 포드 실행을 시작하는 방법을 설명합니다.

CIDR 블록을 사용하여 클러스터의 퍼블릭 엔드포인트에 대한 액세스를 제한하는 경우 프라이빗 엔드포인트 액세스도 사용 설정하는 것이 좋습니다. 이렇게 하면 Fargate 포드가 클러스터와 통신할 수 있습니다. 프라이빗 엔드포인트를 활성화하지 않은 경우, 퍼블릭 액세스에 대해 지정하는 CIDR 블록에는 VPC의 아웃바운드 소스가 포함되어야 합니다. 자세한 내용은 [클러스터 API 서버 엔드포인트](cluster-endpoint.md) 섹션을 참조하세요.

**전제 조건**  
기존 클러스터가 있어야 합니다. Amazon EKS 클러스터가 아직 없는 경우 [Amazon EKS 시작하기](getting-started.md) 부분을 참조하세요.

## 1단계: 기존 노드가 Fargate 포드와 통신할 수 있는지 확인
<a name="fargate-gs-check-compatibility"></a>

노드가 없는 새 클러스터 또는 [관리형 노드 그룹을 사용한 노드 수명 주기 간소화](managed-node-groups.md) 관리형 노드 그룹만 있는 클러스터로 작업하는 경우 [2단계: Fargate 포드 실행 역할 생성](#fargate-sg-pod-execution-role)로 건너뛸 수 있습니다.

이미 연결된 노드가 있는 기존 클러스터로 작업하고 있다고 가정합니다. 이러한 노드의 포드가 Fargate에서 실행되는 포드와 자유롭게 통신할 수 있는지 확인합니다. Fargate에서 실행되는 포드는 연결된 클러스터에 대해 클러스터 보안 그룹을 사용하도록 자동으로 구성됩니다. 클러스터의 기존 노드가 클러스터 보안 그룹과 트래픽을 주고 받을 수 있는지 확인합니다. 관리형 노드 그룹은 클러스터 보안 그룹도 사용하도록 자동으로 구성되므로 이 호환성을 수정하거나 확인할 필요가 없습니다([관리형 노드 그룹을 사용한 노드 수명 주기 간소화](managed-node-groups.md) 참조).

`eksctl` 또는 Amazon EKS 관리형 AWS CloudFormation 템플릿을 사용하여 생성한 기존 노드 그룹의 경우 클러스터 보안 그룹을 노드에 수동으로 추가할 수 있습니다. 또는 노드 그룹에 대한 Auto Scaling 그룹 시작 템플릿을 수정하여 클러스터 보안 그룹을 인스턴스에 연결할 수 있습니다. 자세한 내용은 *Amazon VPC 사용 설명서*의 [인스턴스의 보안 그룹 변경](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#SG_Changing_Group_Membership) 부분을 참조하세요.

클러스터에 대한 **네트워킹** 섹션의 AWS Management Console에서 해당 클러스터에 대한 보안 그룹을 확인할 수 있습니다. 또는 다음 AWS CLI 명령을 사용하여 확인할 수 있습니다. 이 명령을 사용하는 경우 `<my-cluster>`를 클러스터의 이름으로 바꿉니다.

```
aws eks describe-cluster --name <my-cluster> --query cluster.resourcesVpcConfig.clusterSecurityGroupId
```

## 2단계: Fargate 포드 실행 역할 생성
<a name="fargate-sg-pod-execution-role"></a>

클러스터가 AWS Fargate에서 포드를 생성하는 경우 Fargate 인프라에서 실행되는 구성 요소는 사용자를 대신하여 AWS API를 직접적으로 직접 호출해야 합니다. Amazon EKS 포드 실행 역할은 이 작업을 수행할 수 있는 IAM 권한을 제공합니다. AWS Fargate 포드 실행 역할을 생성하려면 [Amazon EKS 포드 실행 IAM 역할](pod-execution-role.md) 섹션을 참조하세요.

**참고**  
`--fargate` 옵션을 사용하여 `eksctl`로 클러스터를 생성한 경우 클러스터에는 이미 패턴 `eksctl-my-cluster-FargatePodExecutionRole-ABCDEFGHIJKL`에서 IAM 콘솔을 찾을 수 있는 포드 실행 역할이 있습니다. 마찬가지로 `eksctl`을 사용하여 Fargate 프로필을 생성하는 경우 포드 실행 역할이 생성되지 않았으면 `eksctl`을 사용하여 포드 실행 역할을 생성합니다.

## 3단계: 클러스터에 대한 Fargate 프로필 생성
<a name="fargate-gs-create-profile"></a>

클러스터의 Fargate에서 실행되는 포드를 예약하려면 먼저 포드가 시작될 때 Fargate를 사용할 포드를 지정하는 Fargate 프로필을 정의해야 합니다. 자세한 내용은 [시작 시 AWS Fargate를 사용하는 포드 정의](fargate-profile.md) 섹션을 참조하세요.

**참고**  
`--fargate` 옵션을 사용하여 `eksctl`로 클러스터를 생성한 경우 `kube-system` 및 `default` 네임스페이스의 모든 포드에 대한 선택기를 사용하여 클러스터에 대한 Fargate 프로필이 이미 생성되어 있습니다. Fargate에서 사용할 다른 네임스페이스에 대한 Fargate 프로필을 생성하려면 다음 절차를 따르세요.

다음 도구 중 하나를 사용하여 Fargate 프로필을 생성할 수 있습니다.
+  [`eksctl`](#eksctl_fargate_profile_create) 
+  [AWS Management Console](#console_fargate_profile_create) 

### `eksctl`
<a name="eksctl_fargate_profile_create"></a>

이 절차에는 `eksctl` 버전 `0.215.0` 이상이 필요합니다. 버전은 다음 명령을 통해 확인할 수 있습니다.

```
eksctl version
```

`eksctl` 설치 또는 업데이트에 대한 지침은 `eksctl` 설명서의 [Installation](https://eksctl.io/installation)를 참조하세요.

 **을 사용하여 Fargate 프로필을 생성하려면`eksctl`** 

다음 `eksctl` 명령으로 Fargate 프로파일을 생성하고 모든 `<example value>`를 고유한 값으로 바꿉니다. 네임스페이스를 지정해야 합니다. 그러나 `--labels` 옵션은 필요하지 않습니다.

```
eksctl create fargateprofile \
    --cluster <my-cluster> \
    --name <my-fargate-profile> \
    --namespace <my-kubernetes-namespace> \
    --labels <key=value>
```

`<my-kubernetes-namespace>` 및 `<key=value>` 레이블에 특정 와일드카드를 사용할 수 있습니다. 자세한 내용은 [Fargate 프로필 와일드카드](fargate-profile.md#fargate-profile-wildcards) 섹션을 참조하세요.

### AWS Management Console
<a name="console_fargate_profile_create"></a>

 **을 사용하여 Fargate 프로필을 생성하려면AWS Management Console** 

1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)을 엽니다.

1. Fargate 프로필을 생성할 클러스터를 선택합니다.

1. **컴퓨팅** 탭을 선택합니다.

1. **Fargate 프로필**에서 **Fargate 프로필 추가**를 선택합니다.

1. **Fargate 프로필 구성** 페이지에서 다음을 수행합니다.

   1. **이름**에 Fargate 프로필의 이름을 입력합니다. 이름은 고유해야 합니다.

   1. **포드 실행 역할**에서 Fargate 프로필과 함께 사용할 포드 실행 역할을 선택합니다. `eks-fargate-pods.amazonaws.com` 서비스 보안 주체가 있는 IAM 역할만 표시됩니다. 나열된 역할이 표시되지 않으면 역할을 만들어야 합니다. 자세한 내용은 [Amazon EKS 포드 실행 IAM 역할](pod-execution-role.md) 섹션을 참조하세요.

   1. 선택한 **서브넷**을 필요에 따라 수정합니다.
**참고**  
Fargate에서 실행되는 포드에는 프라이빗 서브넷만 지원됩니다.

   1. **태그**의 경우, 선택적으로 Fargate 프로필에 태그를 지정할 수 있습니다. 이러한 태그는 프로필과 연결된 다른 리소스(예: 포드)에 전파되지 않습니다.

   1. **다음**을 선택합니다.

1. **포드 선택 구성** 페이지에서 다음을 수행합니다.

   1. **네임스페이스**에 포드에 대해 일치시킬 네임스페이스를 입력합니다.
      + `kube-system` 또는 `default`와 같은 특정 네임스페이스를 사용하여 일치시킬 수 있습니다.
      + 특정 와일드카드(예: `prod-*`)를 사용하여 여러 네임스페이스(예: `prod-deployment` 및 `prod-test`)를 일치시킬 수 있습니다. 자세한 내용은 [Fargate 프로필 와일드카드](fargate-profile.md#fargate-profile-wildcards) 섹션을 참조하세요.

   1. (선택 사항) 선택기에 Kubernetes 레이블을 추가합니다. 특히 지정된 네임스페이스의 포드가 일치해야 하는 포드에 추가합니다.
      + `infrastructure: fargate` 레이블도 있는 지정된 네임스페이스의 포드만 선택기와 일치하도록 `infrastructure: fargate` Kubernetes 레이블을 선택기에 추가할 수 있습니다.
      + 특정 와일드카드(예: `key?: value?`)를 사용하여 여러 네임스페이스(예: `keya: valuea` 및 `keyb: valueb`)를 일치시킬 수 있습니다. 자세한 내용은 [Fargate 프로필 와일드카드](fargate-profile.md#fargate-profile-wildcards) 섹션을 참조하세요.

   1. **다음**을 선택합니다.

1. **검토 및 생성** 페이지에서 Fargate 프로필에 대한 정보를 검토하고 **생성**을 선택합니다.

## 4단계: CoreDNS 업데이트
<a name="fargate-gs-coredns"></a>

기본적으로 CoreDNS는 Amazon EKS 클러스터의 Amazon EC2 인프라에서 실행되도록 구성됩니다. 클러스터의 Fargate에서*만* 포드를 실행하려면 다음 단계를 수행하세요.

**참고**  
`--fargate` 옵션을 사용하여 `eksctl`로 클러스터를 생성한 경우 [다음 단계](#fargate-gs-next-steps)로 건너뛸 수 있습니다.

1. 다음 명령을 사용하여 CoreDNS에 대한 Fargate 프로필을 삭제합니다. `<my-cluster>`를 클러스터 이름으로, `<111122223333>`을 계정 ID로, `<AmazonEKSFargatePodExecutionRole>`을 포드 실행 역할 이름으로, `<000000000000000a>`, `<000000000000000b>`, `<000000000000000c>`를 프라이빗 서브넷의 ID로 바꿉니다. 포드 실행 역할이 없는 경우 먼저 생성해야 합니다([2단계: Fargate 포드 실행 역할 생성](#fargate-sg-pod-execution-role) 참조).
**중요**  
역할 ARN에 `/` 이외의 [경로](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-friendly-names)를 포함할 수 없습니다. 예를 들어, 역할 이름이 `development/apps/AmazonEKSFargatePodExecutionRole`인 경우 역할에 대한 ARN을 지정할 때 역할 이름을 `AmazonEKSFargatePodExecutionRole`로 변경해야 합니다. 역할 ARN의 형식은 ` arn:aws:iam::<111122223333>:role/<AmazonEKSFargatePodExecutionRole>`이어야 합니다.

   ```
   aws eks create-fargate-profile \
       --fargate-profile-name coredns \
       --cluster-name <my-cluster> \
       --pod-execution-role-arn arn:aws:iam::<111122223333>:role/<AmazonEKSFargatePodExecutionRole> \
       --selectors namespace=kube-system,labels={k8s-app=kube-dns} \
       --subnets subnet-<000000000000000a> subnet-<000000000000000b> subnet-<000000000000000c>
   ```

1. `coredns` 배포의 롤아웃을 트리거합니다.

   ```
   kubectl rollout restart -n kube-system deployment coredns
   ```

## 다음 단계
<a name="fargate-gs-next-steps"></a>
+ 다음 워크플로를 사용하여 Fargate에서 실행할 기존 애플리케이션 마이그레이션을 시작할 수 있습니다.

  1.  애플리케이션의 Kubernetes 네임스페이스 및 Kubernetes 레이블과 일치하는 [Fargate 프로필 생성](fargate-profile.md#create-fargate-profile).

  1. Fargate에 예약되도록 기존 포드를 삭제하고 다시 생성합니다. `<namespace>`와 `<deployment-type>`을 수정하여 특정 포드를 업데이트합니다.

     ```
     kubectl rollout restart -n <namespace> deployment <deployment-type>
     ```
+ [Application Load Balancer를 사용하여 애플리케이션 및 HTTP 트래픽 라우팅](alb-ingress.md)를 배포하여 Fargate에서 실행되는 포드에 대해 수신 객체를 허용합니다.
+ [Vertical Pod Autoscaler를 사용하여 포드 리소스 조정](vertical-pod-autoscaler.md)를 사용하여 Fargate 포드의 올바른 초기 CPU 및 메모리 크기를 설정한 다음 [Horizontal Pod Autoscaler를 사용하여 포드 배포 확장](horizontal-pod-autoscaler.md)를 사용하여 해당 포드의 규모를 조정할 수 있습니다. Vertical Pod Autoscaler가 더 높은 CPU 및 메모리 조합으로 포드를 Fargate에 자동으로 다시 배포하도록 하려면 Vertical Pod Autoscaler의 모드를 `Auto` 또는 `Recreate`로 설정합니다. 이를 통해 기능을 올바르게 사용할 수 있습니다. 자세한 내용은 GitHub에서 [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#quick-start) 문서를 참조하세요.
+ [이러한 지침](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-EKS-otel.html)을 따라 애플리케이션을 모니터링하도록 [AWS Distro for OpenTelemetry(ADOT)](https://aws.amazon.com/otel) 컬렉터를 설정할 수 있습니다.

# 시작 시 AWS Fargate를 사용하는 포드 정의
<a name="fargate-profile"></a>

클러스터의 Fargate에 포드를 예약하기 전에 먼저 포드가 시작될 때 Fargate를 사용할 포드를 지정하는 Fargate 프로필을 하나 이상 정의해야 합니다.

관리자는 Fargate 프로필을 사용하여 Fargate에서 실행되는 포드를 선언할 수 있습니다. 프로필의 선택기를 통해 이 작업을 수행할 수 있습니다. 각 프로필에 최대 5개의 셀렉터를 추가할 수 있습니다. 각 셀렉터에 네임스페이스를 포함해야 합니다. 레이블도 셀렉터에 포함될 수 있습니다. 레이블 필드는 여러 개의 선택적 키-값 페어로 구성됩니다. 셀렉터와 일치하는 포드는 Fargate에 예약되어 있습니다. 포드는 선택기에 지정된 네임스페이스와 레이블을 사용하여 일치됩니다. 네임스페이스 선택기가 레이블 없이 정의되면 Amazon EKS는 프로필을 사용하여 해당 네임스페이스에서 실행되는 모든 포드를 Fargate에 예약하려고 시도합니다. 예약할 포드가 Fargate 프로필의 선택기와 일치하는 경우 해당 포드가 Fargate에 예약됩니다.

포드가 여러 Fargate 프로필과 일치하는 경우 포드 사양에 Kubernetes 레이블 `eks.amazonaws.com/fargate-profile: my-fargate-profile`을 추가하여 포드가 사용하는 프로필을 지정할 수 있습니다. 포드는 Fargate에 예약하기 위해 해당 프로필의 선택기와 일치해야 합니다. Kubernetes 선호도/반선호도 규칙은 Amazon EKS Fargate 포드에 적용되지 않으며 불필요합니다.

Fargate 프로필을 생성할 때 포드 실행 역할을 지정해야 합니다. 이 실행 역할은 프로필을 사용하여 Fargate 인프라에서 실행되는 Amazon EKS 구성 요소를 위한 것입니다. 이 역할은 권한 부여를 위해 클러스터의 Kubernetes [역할 기반 액세스 컨트롤](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)(RBAC)에 추가됩니다. 이렇게 하면 Fargate 인프라에서 실행되는 `kubelet`이 Amazon EKS 클러스터에 등록되어 클러스터에 노드로 표시될 수 있습니다. 또한 포드 실행 역할은 Amazon ECR 이미지 리포지토리에 대한 읽기 액세스를 허용하는 Fargate 인프라에 대한 IAM 권한을 제공합니다. 자세한 내용은 [Amazon EKS 포드 실행 IAM 역할](pod-execution-role.md) 단원을 참조하십시오.

Fargate 프로필은 변경할 수 없습니다. 그러나 업데이트된 프로필을 새로 생성하여 기존 프로필을 바꾼 다음 원본을 삭제할 수 있습니다.

**참고**  
Fargate 프로필을 사용하여 실행 중인 모든 포드는 중지되고 프로필이 삭제되면 보류 상태로 전환됩니다.

클러스터의 Fargate 프로필이 `DELETING` 상태인 경우 해당 클러스터에 다른 프로필을 생성하려면 Fargate 프로필이 삭제될 때까지 기다려야 합니다.

**참고**  
Fargate는 현재 Kubernetes [topologySpreadConstraints](https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/)를 지원하지 않습니다.

Amazon EKS 및 Fargate는 Fargate 프로필에 정의된 각 서브넷에 포드를 분산시킵니다. 그러나 고르게 분산되지 않을 수 있습니다. 고른 분산이 필요한 경우 Fargate 프로필을 2개 사용합니다. 복제본을 2개 배포하려고 하고 가동 중지를 원하지 않는 경우 고른 분산이 중요합니다. 각 프로필에는 서브넷이 하나만 있는 것이 좋습니다.

## Fargate 프로필 구성 요소
<a name="fargate-profile-components"></a>

다음 구성 요소는 Fargate 프로필에 포함되어 있습니다.

 **포드 실행 역할**   
클러스터가 AWS Fargate에서 포드를 생성하면, Fargate 인프라에서 실행 중인 `kubelet`가 사용자를 대신하여 AWS API를 직접적으로 호출해야 합니다. 예를 들어, Amazon ECR에서 컨테이너 이미지를 가져오기 위해 호출해야 합니다. Amazon EKS 포드 실행 역할은 이 작업을 수행할 수 있는 IAM 권한을 제공합니다.  
Fargate 프로필을 생성할 때 포드와 함께 사용할 포드 실행 역할을 지정해야 합니다. 이 역할은 권한 부여를 위해 클러스터의 Kubernetes [역할 기반 액세스 제어](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)(RBAC)에 추가됩니다. 이렇게 하면 Fargate 인프라에서 실행 중인 `kubelet`이 Amazon EKS 클러스터에 등록되어 클러스터에 노드로 표시될 수 있습니다. 자세한 내용은 [Amazon EKS 포드 실행 IAM 역할](pod-execution-role.md) 섹션을 참조하세요.

 **서브넷**   
이 프로필을 사용하는 포드를 시작할 서브넷의 ID입니다. 현재 Fargate에서 실행 중인 포드에는 퍼블릭 IP 주소가 할당되지 않습니다. 따라서 이 파라미터에 대해서는 인터넷 게이트웨이로 가는 직접 경로가 없는 프라이빗 서브넷만 허용됩니다.

 **선택기**   
포드가 이 Fargate 프로필을 사용하기 위해 일치시킬 선택기입니다. Fargate 프로필에 선택기를 최대 5개까지 지정할 수 있습니다. 셀렉터에는 다음 구성 요소가 있습니다.  
+  **네임스페이스** - 셀렉터에 대한 네임스페이스를 지정해야 합니다. 선택기는 이 네임스페이스에서 생성된 포드만 일치시킵니다. 그러나 여러 셀렉터를 생성하여 여러 네임스페이스를 대상으로 지정할 수 있습니다.
+  **레이블** - 선택적으로 선택기에 대해 일치시킬 Kubernetes 레이블을 지정할 수 있습니다. 선택기는 선택기에 지정된 모든 레이블이 있는 포드만 일치시킵니다.

## Fargate 프로필 와일드카드
<a name="fargate-profile-wildcards"></a>

Kubernetes에서 허용하는 문자 외에도 네임스페이스, 레이블 키 및 레이블 값에 대한 선택기 기준에 `*`와 `?`를 사용할 수 있습니다.
+  `*`는 없음, 하나 또는 여러 문자를 나타냅니다. 예를 들어, `prod*`는 `prod`와 `prod-metrics`를 나타낼 수 있습니다.
+  `?`는 단일 문자를 나타냅니다. 예를 들어, `value?`는 `valuea`를 나타낼 수 있습니다. 그러나 `?`는 정확히 하나의 문자만 나타낼 수 있기 때문에 `value`와 `value-a`를 나타낼 수는 없습니다.

이러한 와일드카드 문자는 모든 위치에서 조합하여 사용할 수 있습니다(예: `prod*`, `*dev` 및 `frontend*?`). 다른 와일드카드와 패턴 일치 형식(정규식 등)은 지원되지 않습니다.

포드 사양의 네임스페이스 및 레이블에 대해 일치하는 프로필이 여러 개 있는 경우 Fargate는 프로필 이름별 영숫자 정렬을 기준으로 프로필을 선택합니다. 예를 들어, 프로필 A(이름 `beta-workload`)와 프로필 B(이름 `prod-workload`)에 시작할 포드에 대해 일치하는 선택기가 있는 경우 Fargate는 포드에 대해 프로필 A(`beta-workload`)를 선택합니다. 포드에 프로필 A라는 레이블이 있습니다(예: `eks.amazonaws.com/fargate-profile=beta-workload`).

와일드카드를 사용하는 새 프로필로 기존 Fargate 포드를 마이그레이션하려는 경우 다음 두 가지 방법이 있습니다.
+ 일치하는 셀렉터로 새 프로파일을 생성한 다음 이전 프로파일을 삭제합니다. 이전 프로필로 레이블이 지정된 포드는 일치하는 새 프로필로 다시 예약됩니다.
+ 워크로드를 마이그레이션하고 싶지만 각 Fargate 포드에 어떤 Fargate 레이블이 있는지 확실하지 않은 경우 다음 방법을 사용할 수 있습니다. 동일한 클러스터의 프로파일 중에서 영숫자순으로 먼저 정렬되는 이름으로 새 프로파일을 생성합니다. 그런 다음 새 프로필로 마이그레이션해야 하는 Fargate 포드를 재활용합니다.

## Fargate 프로필 생성
<a name="create-fargate-profile"></a>

이 섹션에서는 Fargate 프로필을 생성하는 방법을 설명합니다. 또한 Fargate 프로필에 사용할 포드 실행 역할을 생성해야 합니다. 자세한 내용은 [Amazon EKS 포드 실행 IAM 역할](pod-execution-role.md) 단원을 참조하십시오. Fargate에서 실행되는 포드는 인터넷 게이트웨이에 대한 직접 경로가 없고 AWS 서비스에 대한 [NAT 게이트웨이](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) 액세스 권한이 있는 프라이빗 서브넷에서만 지원됩니다. 이를 위해서는 클러스터의 VPC에 사용 가능한 프라이빗 서브넷이 있어야 합니다.

다음을 사용하여 프로필을 만들 수 있습니다.
+  [`eksctl`](#eksctl_create_a_fargate_profile) 
+  [AWS Management Console](#console_create_a_fargate_profile) 

## `eksctl`
<a name="eksctl_create_a_fargate_profile"></a>

 **`eksctl`을 사용하여 Fargate 프로필을 생성하려면** 

다음 `eksctl` 명령으로 Fargate 프로필을 생성하고 모든 예제 값을 고유한 값으로 바꿉니다. 네임스페이스를 지정해야 합니다. 그러나 `--labels` 옵션은 필요하지 않습니다.

```
eksctl create fargateprofile \
    --cluster my-cluster \
    --name my-fargate-profile \
    --namespace my-kubernetes-namespace \
    --labels key=value
```

`my-kubernetes-namespace` 및 `key=value` 레이블에 특정 와일드카드를 사용할 수 있습니다. 자세한 내용은 [Fargate 프로필 와일드카드](#fargate-profile-wildcards) 단원을 참조하십시오.

## AWS Management Console
<a name="console_create_a_fargate_profile"></a>

 **AWS Management Console을 사용하여 Fargate 프로필을 생성하려면** 

1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)을 엽니다.

1. Fargate 프로필을 생성할 클러스터를 선택합니다.

1. **컴퓨팅** 탭을 선택합니다.

1. **Fargate 프로필**에서 **Fargate 프로필 추가**를 선택합니다.

1. **Fargate 프로파일 구성(Configure Fargate profile)** 페이지에서 다음을 수행합니다.

   1. **이름(Name)**에 Fargate 프로파일(예: `my-profile`)의 고유한 이름을 입력합니다.

   1. **포드 실행 역할**에서 Fargate 프로필과 함께 사용할 포드 실행 역할을 선택합니다. `eks-fargate-pods.amazonaws.com` 서비스 보안 주체가 있는 IAM 역할만 표시됩니다. 나열된 역할이 표시되지 않으면 역할을 만들어야 합니다. 자세한 내용은 [Amazon EKS 포드 실행 IAM 역할](pod-execution-role.md) 섹션을 참조하세요.

   1. 선택한 **서브넷**을 필요에 따라 수정합니다.
**참고**  
Fargate에서 실행되는 포드에는 프라이빗 서브넷만 지원됩니다.

   1. **태그**의 경우, 선택적으로 Fargate 프로필에 태그를 지정할 수 있습니다. 이러한 태그는 프로필과 연결된 다른 리소스(예: 포드)에 전파되지 않습니다.

   1. **Next**(다음)를 선택합니다.

1. **포드 선택 구성** 페이지에서 다음을 수행합니다.

   1. **네임스페이스**에 포드에 대해 일치시킬 네임스페이스를 입력합니다.
      + `kube-system` 또는 `default`와 같은 특정 네임스페이스를 사용하여 일치시킬 수 있습니다.
      + 특정 와일드카드(예: `prod-*`)를 사용하여 여러 네임스페이스(예: `prod-deployment` 및 `prod-test`)를 일치시킬 수 있습니다. 자세한 내용은 [Fargate 프로필 와일드카드](#fargate-profile-wildcards) 단원을 참조하십시오.

   1. (선택 사항) 선택기에 Kubernetes 레이블을 추가합니다. 특히 지정된 네임스페이스의 포드가 일치해야 하는 포드에 추가합니다.
      + `infrastructure: fargate` 레이블도 있는 지정된 네임스페이스의 포드만 선택기와 일치하도록 `infrastructure: fargate` Kubernetes 레이블을 선택기에 추가할 수 있습니다.
      + 특정 와일드카드(예: `key?: value?`)를 사용하여 여러 네임스페이스(예: `keya: valuea` 및 `keyb: valueb`)를 일치시킬 수 있습니다. 자세한 내용은 [Fargate 프로필 와일드카드](#fargate-profile-wildcards) 섹션을 참조하세요.

   1. **다음**을 선택합니다.

1. **검토 및 생성** 페이지에서 Fargate 프로필에 대한 정보를 검토하고 **생성**을 선택합니다.

# Fargate 프로필 삭제
<a name="delete-fargate-profile"></a>

이 주제에서는 Fargate 프로필을 삭제하는 방법을 설명합니다. Fargate 프로필을 삭제하면 해당 프로필을 사용하여 Fargate에 예약된 모든 포드가 삭제됩니다. 이러한 포드가 다른 Fargate 프로필과 일치하면 해당 프로필을 사용하여 Fargate에 예약됩니다. Fargate 프로필과 더이상 일치하지 않으면 Fargate에 예약되지 않고 보류 상태로 남아있을 수 있습니다.

클러스터의 Fargate 프로필은 한 번에 하나만 `DELETING` 상태가 될 수 있습니다. Fargate 프로필이 삭제될 때까지 기다려야 해당 클러스터에서 다른 프로필을 삭제할 수 있습니다.

다음 도구 중 하나를 사용하여 프로필을 삭제할 수 있습니다.
+  [`eksctl`](#eksctl_delete_a_fargate_profile) 
+  [AWS Management Console](#console_delete_a_fargate_profile) 
+  [AWS CLI](#awscli_delete_a_fargate_profile) 

## `eksctl`
<a name="eksctl_delete_a_fargate_profile"></a>

 **`eksctl`를 사용하여 Fargate 프로필 삭제** 

다음 명령을 사용하여 클러스터에서 프로필을 삭제합니다. 모든 *예제 값*을 자신의 값으로 바꾸세요.

```
eksctl delete fargateprofile  --name my-profile --cluster my-cluster
```

## AWS Management Console
<a name="console_delete_a_fargate_profile"></a>

 **AWS Management Console를 사용하여 Fargate 프로필 삭제** 

1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)을 엽니다.

1. 좌측 탐색 창에서 **클러스터**를 선택합니다. 목록 클러스터에서 Fargate 프로필을 삭제할 클러스터를 선택합니다.

1. **컴퓨팅** 탭을 선택합니다.

1. 삭제할 Fargate 프로필을 선택한 다음 **삭제**를 선택합니다.

1. **Fargate 프로필 삭제** 페이지에서 프로필 이름을 입력한 다음 **삭제**를 선택합니다.

## AWS CLI
<a name="awscli_delete_a_fargate_profile"></a>

 **AWS CLI를 사용하여 Fargate 프로필 삭제** 

다음 명령을 사용하여 클러스터에서 프로필을 삭제합니다. 모든 *예제 값*을 자신의 값으로 바꾸세요.

```
aws eks delete-fargate-profile --fargate-profile-name my-profile --cluster-name my-cluster
```

# Fargate 포드 구성 세부 정보 이해
<a name="fargate-pod-configuration"></a>

이 섹션에서는 AWS Fargate에서 Kubernetes 포드를 실행하기 위한 몇 가지 고유한 포드 구성 세부 정보에 대해 설명합니다.

## 포드 CPU 및 메모리
<a name="fargate-cpu-and-memory"></a>

Kubernetes를 사용하면 포드의 각 컨테이너에 할당되는 요청, 즉 최소량의 vCPU 및 메모리 리소스를 정의할 수 있습니다. 최소한 각 포드에 대해 요청된 리소스를 컴퓨팅 리소스에서 사용할 수 있도록 Kubernetes에서 포드를 예약합니다. 자세한 내용은 Kubernetes 설명서의 [컨테이너의 컴퓨팅 리소스 관리](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/)를 참조하십시오.

**참고**  
Amazon EKS Fargate는 노드당 하나의 포드만 실행하므로 리소스가 더 적은 경우 포드를 제거하는 시나리오가 발생하지 않습니다. 모든 Amazon EKS Fargate 포드는 보장된 우선순위로 실행되므로 요청된 CPU와 메모리는 모든 컨테이너의 한도와 같아야 합니다. 자세한 내용은 쿠버네티스 문서의 [Configure Quality of Service for Pods](https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/)를 참조하세요.

포드가 Fargate에 예약되면 포드 사양 내의 vCPU 및 메모리 예약에 따라 포드에 프로비저닝할 CPU 및 메모리 양이 결정됩니다.
+ Init 컨테이너의 최대 요청은 Init 요청 vCPU 및 메모리 요구 사항을 결정하는 데 사용됩니다.
+ 장기 실행 요청 vCPU 및 메모리 요구 사항을 결정하기 위해 모든 장기 실행 컨테이너에 대한 요청이 추가됩니다.
+ 포드에 사용할 vCPU 및 메모리 요청에 대해서는 이전의 두 값 중 큰 값이 선택됩니다.
+ Fargate는 필요한 Kubernetes 구성 요소(`kubelet`, `kube-proxy` 및 `containerd`)에 대한 각 포드의 메모리 예약에 256MB를 추가합니다.

Fargate는 포드가 실행해야 하는 리소스를 항상 보유하도록 vCPU 및 메모리 요청의 합계와 가장 일치하는 다음의 컴퓨팅 구성으로 올림 처리합니다.

vCPU 및 메모리 조합을 지정하지 않으면 사용 가능한 가장 작은 조합(.25 vCPU 및 0.5GB 메모리)이 사용됩니다.

아래 표에는 Fargate에서 실행되는 포드에 사용할 수 있는 vCPU 및 메모리 조합이 나와 있습니다.


| vCPU 값 | 메모리 값 | 
| --- | --- | 
|  .25 vCPU  |  0.5GB, 1GB, 2GB  | 
|  .5 vCPU  |  1GB, 2GB, 3GB, 4GB  | 
|  1 vCPU  |  2GB, 3GB, 4GB, 5GB, 6GB, 7GB, 8GB  | 
|  2 vCPU  |  4\$116GB(1GB 증분)  | 
|  4 vCPU  |  8\$130GB(1GB 증분)  | 
|  8 vCPU  |  16\$160GB(4GB 단위)  | 
|  16 vCPU  |  32\$1120GB(8GB 단위)  | 

Kubernetes 구성 요소에 예약된 추가 메모리로 인해 요청된 것보다 많은 vCPU를 사용하는 Fargate 태스크가 프로비저닝될 수 있습니다. 예를 들어 1개의 vCPU 및 8GB 메모리에 대한 요청의 경우 해당 메모리 요청에 256MB가 추가되며, vCPU 1개와 9GB 메모리를 사용하는 태스크가 없으므로 2개의 vCPU 및 9GB 메모리로 Fargate 태스크를 프로비저닝합니다.

Fargate에서 실행 중인 포드의 크기와 `kubectl get nodes`를 사용하여 Kubernetes가 보고하는 노드 크기 사이에는 상관 관계가 없습니다. 보고된 노드 크기는 대개 포드의 용량보다 큽니다. 다음 명령을 사용하여 포드 용량을 확인할 수 있습니다. *default*를 포드의 네임스페이스로, *pod-name*을 포드의 이름으로 바꿉니다.

```
kubectl describe pod --namespace default pod-name
```

예제 출력은 다음과 같습니다.

```
[...]
annotations:
    CapacityProvisioned: 0.25vCPU 0.5GB
[...]
```

`CapacityProvisioned` 주석은 적용된 포드 용량을 나타내며 Fargate에서 실행되는 포드의 비용을 결정합니다. 이러한 컴퓨팅 구성에 대한 요금 정보는 [AWS Fargate 요금](https://aws.amazon.com/fargate/pricing/)을 참조하세요.

## Fargate 스토리지
<a name="fargate-storage"></a>

Fargate에서 실행되는 포드는 수동 드라이버 설치 단계 없이 Amazon EFS 파일 시스템을 자동으로 탑재합니다. Fargate 노드에는 동적 영구 볼륨 프로비저닝을 사용할 수 없지만 고정적인 프로비저닝은 사용할 수 있습니다. 자세한 내용은 GitHub에서 [Amazon EFS CSI 드라이버](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/README.md)를 참조하세요.

프로비저닝이 완료되면 Fargate에서 실행되는 각 포드는 기본적으로 20GiB의 임시 스토리지를 받습니다. 이 유형의 스토리지는 포드가 중지된 후에 삭제됩니다. Fargate에서 시작된 새 포드에는 임시 스토리지 볼륨의 암호화가 기본적으로 활성화되어 있습니다. 임시 포드 스토리지는 AWS Fargate 관리형 키를 사용하여 AES-256 암호화 알고리즘으로 암호화됩니다.

**참고**  
Fargate에서 실행되는 Amazon EKS 포드의 기본 가용 스토리지는 20GiB 미만입니다. 이는 일부 공간을 `kubelet` 및 포드 내부에 로드되는 기타 Kubernetes 모듈에서 사용하기 때문입니다.

임시 스토리지의 총량은 최대 175GiB까지 높일 수 있습니다. Kubernetes를 사용하여 크기를 구성하려면 포드의 각 컨테이너에 대한 `ephemeral-storage` 리소스 요청을 지정합니다. Kubernetes 가 포드를 예약할 때 이는 각 포드에 대한 리소스 요청의 합계가 Fargate 태스크의 용량보다 작도록 보장합니다. 자세한 내용은 쿠버네티스 문서의 [포드 및 컨테이너 리소스 관리](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/)를 참조하세요.

Amazon EKS Fargate는 시스템 사용 목적으로 요청한 것보다 더 많은 임시 스토리지를 프로비저닝합니다. 예를 들어, 100GiB를 요청하면 Fargate 작업에 115GiB의 임시 스토리지가 프로비저닝됩니다.

# AWS Fargate OS 패치 이벤트에 대한 작업 설정
<a name="fargate-pod-patching"></a>

Amazon EKS는 AWSFargate 노드의 OS를 주기적으로 패치하여 보안을 유지합니다. 패치 적용 프로세스의 일부로 노드를 재활용하여 OS 패치를 설치합니다. 서비스에 미치는 영향이 가장 적은 방식으로 업데이트가 시도됩니다. 그러나 포드가 성공적으로 제거되지 않으면 포드를 삭제해야 할 때가 있습니다. 다음 작업은 중단 가능성을 최소화하기 위해 수행할 수 있는 작업입니다.
+ 적절한 포드 중단 예산(PDB)을 설정하여 동시에 중단되는 포드의 수를 제어한다.
+ 포드가 삭제되기 전에 실패한 제거를 처리하는 Amazon EventBridge 규칙을 생성합니다.
+ 수신한 알림에 게시된 제거 날짜 이전에 영향을 받는 포드를 수동으로 다시 시작합니다.
+ AWS 사용자 알림에서 알림 구성을 생성합니다.

Amazon EKS는 Kubernetes 커뮤니티와 밀접하게 협력하여 버그 수정 및 보안 패치를 최대한 빨리 사용할 수 있도록 합니다. 모든 Fargate 포드는 Kubernetes 패치의 최신 버전에서 시작됩니다. 이 버전은 클러스터의 Kubernetes 버전에 대한 Amazon EKS에서 사용할 수 있습니다. 이전 패치 버전의 포드가 있는 경우 Amazon EKS는 해당 포드를 재활용하여 최신 버전으로 업데이트할 수 있습니다. 이렇게 하면 포드에 최신 보안 업데이트가 설치됩니다. 그렇게 하면 중요한 [일반 취약성 및 노출](https://cve.mitre.org/)(CVE) 문제가 있는 경우, 최신 상태로 유지되어 보안 위험을 줄여줍니다.

AWS Fargate OS가 업데이트되면 Amazon EKS가 영향을 받는 리소스와 향후 포드 제거 날짜가 포함된 알림을 보냅니다. 제공된 제거 날짜가 불편한 경우 알림에 게시된 제거 날짜 이전에 영향을 받는 포드를 수동으로 다시 시작할 수 있습니다. 알림을 수신하기 전에 생성한 모든 포드는 제거 대상입니다. 포드를 수동으로 다시 시작하는 방법에 대한 자세한 지침은 [Kubernetes 설명서](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_rollout/kubectl_rollout_restart)를 참조하세요.

포드를 재활용할 때 한 번에 중단되는 포드 수를 제한하려면 포드 중단 예산(PDB)을 설정할 수 있습니다. PDB를 사용하여 각 애플리케이션의 요구 사항에 따라 최소 가용성을 정의하면서 계속 업데이트도 할 수 있습니다. PDB의 최소 가용성은 100% 미만이어야 합니다. 자세한 내용은 Kubernetes Documentation의 [Specifying a Disruption Budget for your Application](https://kubernetes.io/docs/tasks/run-application/configure-pdb/)을 참조하세요.

Amazon EKS가 [제거 API](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/#eviction-api)를 사용하여 애플리케이션에 대해 설정한 PDB를 준수하면서 포드를 안전하게 드레이닝합니다. 가용 영역에서 포드를 제거하여 영향을 최소화합니다. 제거가 성공하면 새 포드가 최신 패치를 받아 추가 작업이 필요하지 않습니다.

포드의 제거가 실패하면 Amazon EKS는 제거에 실패한 포드에 대한 세부 정보와 함께 이벤트를 계정에 전송합니다. 예약된 종료 시간 전에는 메시지에서 작업할 수 있습니다. 특정 시간은 패치의 긴급성에 따라 다릅니다. 시간이 되면 Amazon EKS는 포드를 다시 제거하려고 시도합니다. 그러나 이번에는 제거가 실패하면 새 이벤트가 전송되지 않습니다. 제거가 다시 실패하면 새 포드가 최신 패치를 받을 수 있도록 기존 포드가 정기적으로 삭제됩니다.

다음 이벤트는 포드 제거가 실패할 때 수신되는 샘플 이벤트입니다. 여기에는 클러스터, 포드 이름, 포드 네임스페이스, Fargate 프로필 및 예약된 종료 시간에 대한 세부 정보가 포함되어 있습니다.

```
{
    "version": "0",
    "id": "12345678-90ab-cdef-0123-4567890abcde",
    "detail-type": "EKS Fargate Pod Scheduled Termination",
    "source": "aws.eks",
    "account": "111122223333",
    "time": "2021-06-27T12:52:44Z",
    "region": "region-code",
    "resources": [
        "default/my-database-deployment"
    ],
    "detail": {
        "clusterName": "my-cluster",
        "fargateProfileName": "my-fargate-profile",
        "podName": "my-pod-name",
        "podNamespace": "default",
        "evictErrorMessage": "Cannot evict pod as it would violate the pod's disruption budget",
        "scheduledTerminationTime": "2021-06-30T12:52:44.832Z[UTC]"
    }
}
```

또한 여러 PDB가 포드에 연결되어 있으면 제거 실패 이벤트가 발생할 수 있습니다. 이 이벤트는 다음과 같은 오류 메시지를 반환합니다.

```
"evictErrorMessage": "This pod has multiple PodDisruptionBudget, which the eviction subresource does not support",
```

이 이벤트를 기반으로 원하는 작업을 생성할 수 있습니다. 예를 들어 포드 중단 예산(PDB)을 조정하여 포드가 제거되는 방식을 제어할 수 있습니다. 조금 더 구체적으로, 사용 가능한 포드의 대상 백분율을 지정하는 PDB로 시작한다고 가정합니다. 업그레이드 중에 포드가 강제 종료되기 전에 PDB를 다른 백분율의 포드로 조정할 수 있습니다. 이 이벤트를 수신하려면 클러스터가 속한 AWS 계정 및 AWS 리전에서 Amazon EventBridge 규칙을 생성해야 합니다. 규칙은 다음과 같은 **사용자 지정 패턴**을 사용해야 합니다. 자세한 내용을 알아보려면 *Amazon EventBridge 사용 설명서*의 [이벤트에 응답하는 Amazon EventBridge 규칙 생성](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html)을 참조하세요.

```
{
  "source": ["aws.eks"],
  "detail-type": ["EKS Fargate Pod Scheduled Termination"]
}
```

이벤트를 캡처하기 위해 적합한 대상을 설정할 수 있습니다. 사용 가능한 대상의 전체 목록은 *Amazon EventBridge 사용 설명서*의 [Amazon EventBridge 대상](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-targets.html)을 참조하세요. AWS 사용자 알림에서 알림 구성을 생성할 수도 있습니다. AWS Management Console를 사용하여 알림을 생성할 때, **이벤트 규칙**에서 **AWS 서비스 이름**에 **Elastic Kubernetes Service(EKS)**를 선택하고 **이벤트 유형**에 **EKS Fargate 포드 예약 종료**를 선택합니다. 자세한 내용은 AWS User Notifications User Guide의 [Getting started with AWS User Notifications](https://docs.aws.amazon.com/notifications/latest/userguide/getting-started.html)를 참조하세요.

EKS 포드 제거와 관련하여 자주 묻는 질문은 * AWS re:Post*의 [FAQ: Fargate 포드 제거 공지](https://repost.aws/knowledge-center/fargate-pod-eviction-notice)를 참조하세요.

# AWS Fargate 앱 및 사용량 지표 수집
<a name="monitoring-fargate-usage"></a>

시스템 지표 및 AWS Fargate의 CloudWatch 사용량 지표를 수집할 수 있습니다.

## 애플리케이션 지표
<a name="fargate-application-metrics"></a>

Amazon EKS 및 AWS Fargate에서 실행되는 애플리케이션의 경우 AWS Distro for OpenTelemetry(ADOT)를 사용할 수 있습니다. ADOT를 사용하면 시스템 지표를 수집하여 CloudWatch 컨테이너 인사이트 대시보드로 전송할 수 있습니다. Fargate에서 실행되는 애플리케이션용 ADOT로 시작하려면 ADOT 설명서의 [AWS Distro for OpenTelemetry를 통한 CloudWatch 컨테이너 인사이트 사용](https://aws-otel.github.io/docs/getting-started/container-insights)을 참조하세요.

## 사용량 지표
<a name="fargate-usage-metrics"></a>

CloudWatch 사용량 지표를 사용하여 계정의 리소스 사용량을 확인할 수 있습니다. 이러한 지표를 사용하여 CloudWatch 그래프 및 대시보드에서 현재 서비스 사용량을 시각화합니다.

 AWS Fargate 사용량 지표는 AWS 서비스 할당량에 해당합니다. 사용량이 서비스 할당량에 가까워지면 경고하는 경보를 구성할 수 있습니다. Fargate 서비스 할당량에 대한 자세한 정보는 [Amazon EKS 및 Fargate Service Quotas 보기 및 관리](service-quotas.md) 섹션을 참조하세요.

 AWS Fargate는 ` AWS/Usage` 네임스페이스에 다음 지표를 게시합니다.


| 지표 | 설명 | 
| --- | --- | 
|   `ResourceCount`   |  계정에서 실행 중인 지정된 리소스의 총 수입니다. 리소스는 지표와 연결된 차원으로 정의됩니다.  | 

다음 차원은 AWS Fargate에 의해 게시되는 사용량 지표를 구체화하는 데 사용됩니다.


| 차원 | 설명 | 
| --- | --- | 
|   `Service`   |  리소스가 포함된 AWS 서비스의 이름 AWS Fargate 사용량 지표의 경우 이 차원 값은 `Fargate`입니다.  | 
|   `Type`   |  보고되는 엔터티의 유형입니다. 현재 AWS Fargate 사용량 지표에 대한 유일한 유효 값은 `Resource`입니다.  | 
|   `Resource`   |  실행 중인 리소스의 유형입니다. 현재 AWS Fargate 는 Fargate 온디맨드 사용량에 대한 정보를 반환합니다. Fargate 온디맨드 사용량에 대한 리소스 값은 `OnDemand`입니다. [참고] ==== Fargate 온디맨드 사용량은 Fargate를 사용하는 Amazon EKS 포드, Fargate 시작 유형을 사용하는 Amazon ECS 태스크 및 `FARGATE` 용량 제공업체를 사용하는 Amazon ECS가 합쳐진 값입니다. ====  | 
|   `Class`   |  추적 중인 리소스의 클래스입니다. 현재 AWS Fargate에서는 클래스 차원을 사용하지 않습니다.  | 

### Fargate 리소스 사용량 지표 모니터링을 위한 CloudWatch 경보 생성
<a name="service-quota-alarm"></a>

 AWS Fargate는 Fargate 온디맨드 리소스 사용량에 대한 AWS 서비스 할당량에 해당하는 CloudWatch 사용량 지표를 제공합니다. Service Quotas 콘솔에서 사용량을 그래프로 시각화할 수 있습니다. 사용량이 서비스 할당량에 가까워지면 경고하는 경보를 구성할 수도 있습니다. 자세한 내용은 [AWS Fargate 앱 및 사용량 지표 수집](#monitoring-fargate-usage) 섹션을 참조하세요.

다음 단계를 사용하여 Fargate 리소스 사용량 지표에 기반하여 CloudWatch 경보를 생성합니다.

1. https://console.aws.amazon.com/servicequotas/에서 Service Quotas 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **AWS 서비스**를 선택합니다.

1. **AWS 서비스** 목록에서 ** AWS Fargate**를 검색하여 선택합니다.

1. **Service quotas** 목록에서 경보를 만들려는 Fargate 사용량 할당량을 선택합니다.

1. Amazon CloudWatch 경보 섹션에서 **생성**을 선택합니다.

1. **경보 임계값**에서 경보 값으로 설정할 적용된 할당량 값의 백분율을 선택합니다.

1. **경보 이름**에서 경보 이름을 입력한 다음 **생성**을 선택합니다.

# 클러스터에 대한 AWS Fargate 로깅 시작하기
<a name="fargate-logging"></a>

Amazon EKS on Fargate는 Fluent Bit를 기반으로 내장된 로그 라우터를 제공합니다. 즉, 사용자가 Fluent Bit 컨테이너를 사이드카로 명시적으로 실행하지는 않지만 Amazon이 자동으로 실행합니다. 로그 라우터를 구성하기만 하면 됩니다. 이 구성은 다음 기준을 충족해야 하는 전용 `ConfigMap`을 통해 이루어집니다.
+ `aws-logging`으로 이름 지정 
+ `aws-observability`라는 전용 네임스페이스에서 생성 
+ 5300자를 초과할 수 없습니다.

`ConfigMap`을 생성하고 나면 Fargate의 Amazon EKS가 자동으로 감지하고 로그 라우터를 구성합니다. Fargate는 AWS for Fluent Bit의 한 버전인 AWS 관리형 Fluent Bit의 업스트림 호환 배포판을 사용합니다. 자세한 내용은 GitHub에서 [AWS for Fluent Bit](https://github.com/aws/aws-for-fluent-bit)를 참조하세요.

로그 라우터를 사용하면 AWS에서 로그 분석 및 저장을 위한 다양한 서비스를 사용할 수 있습니다. Fargate에서 Amazon CloudWatch, Amazon OpenSearch Service로 로그를 직접 스트리밍할 수 있습니다. [Amazon S3](https://aws.amazon.com/s3/), [Amazon Kinesis Data Streams](https://aws.amazon.com/kinesis/data-streams/), [Amazon Data Firehose](https://aws.amazon.com/kinesis/data-firehose/)를 통한 파트너 도구 등의 대상으로 로그를 스트리밍할 수도 있습니다.
+ Fargate 포드를 배포할 기존 Kubernetes 네임스페이스를 지정하는 기존 Fargate 프로필. 자세한 내용은 [3단계: 클러스터에 대한 Fargate 프로필 생성](fargate-getting-started.md#fargate-gs-create-profile) 섹션을 참조하세요.
+ 기존 Fargate 포드 실행 역할. 자세한 내용은 [2단계: Fargate 포드 실행 역할 생성](fargate-getting-started.md#fargate-sg-pod-execution-role) 섹션을 참조하세요.

## 로그 라우터 구성
<a name="fargate-logging-log-router-configuration"></a>

**중요**  
로그가 성공적으로 게시되려면 클러스터가 있는 VPC에서 로그 대상으로 네트워크 액세스가 있어야 합니다. 이는 주로 VPC에 대한 송신 규칙을 사용자 지정하는 사용자와 관련이 있습니다. CloudWatch를 사용하는 예제는 *Amazon CloudWatch Logs 사용 설명서*의 [인터페이스 VPC 엔드포인트에서 CloudWatch Logs 사용](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html)을 참조하세요.

다음 단계에서 모든 *예제 값*을 고유한 값으로 바꿉니다.

1. `aws-observability`라는 전용 Kubernetes 네임스페이스를 생성합니다.

   1. 다음 콘텐츠를 컴퓨터에 `aws-observability-namespace.yaml`이라는 파일에 저장합니다. `name`의 값은 `aws-observability`여야 하며 `aws-observability: enabled` 레이블이 필요합니다.

      ```
      kind: Namespace
      apiVersion: v1
      metadata:
        name: aws-observability
        labels:
          aws-observability: enabled
      ```

   1. 네임스페이스를 생성합니다.

      ```
      kubectl apply -f aws-observability-namespace.yaml
      ```

1. `Fluent Conf` 데이터 값을 사용하여 `ConfigMap`을 생성함으로써 컨테이너 로그를 대상에 전달합니다. Fluent Conf는 Fluent Bit입니다. 이는 원하는 로그 대상에 컨테이너 로그를 라우팅하는 데 사용되는 빠르고 가벼운 로그 프로세서 구성 언어입니다. 자세한 내용은 Fluent Bit 문서의 [구성 파일(Configuration File)](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/configuration-file)을 참조하세요.
**중요**  
일반적인 `Fluent Conf`에 포함된 주요 단원은 `Service`, `Input`, `Filter`, `Output`입니다. 하지만 Fargate 로그 라우터는 다음 부분만 수락합니다.  
`Filter` 및`Output` 부분입니다.
`Parser` 부분.
기타 부분을 제공하는 경우 해당 부분은 거부됩니다.

   Fargate 로그 라우터에서는 `Service` 및`Input` 부분을 관리합니다. 여기에는 수정할 수 없고 `ConfigMap`에서 필요하지 않은 다음과 같은 `Input` 부분이 있습니다. 그러나 메모리 버퍼 제한과 로그에 적용된 태그와 같은 인사이트를 얻을 수 있습니다.

   ```
   [INPUT]
       Name tail
       Buffer_Max_Size 66KB
       DB /var/log/flb_kube.db
       Mem_Buf_Limit 45MB
       Path /var/log/containers/*.log
       Read_From_Head On
       Refresh_Interval 10
       Rotate_Wait 30
       Skip_Long_Lines On
       Tag kube.*
   ```

   `ConfigMap` 생성 시에는 Fargate가 필드를 검증하는 데 사용하는 다음 규칙을 고려하세요.
   +  `[FILTER]`, `[OUTPUT]`, `[PARSER]`는 각 해당 키 아래에 지정되어야 합니다. 예를 들어, `filters.conf`은 `[FILTER]`에 있어야 합니다. `filters.conf`에 하나 이상의 `[FILTER]`가 있을 수 있습니다. `[OUTPUT]` 및 `[PARSER]` 부분도 해당 키 아래에 있어야 합니다. 여러 개의 `[OUTPUT]` 부분을 지정하여 로그를 여러 대상으로 동시에 라우팅할 수 있습니다.
   + Fargate는 각 섹션에 필요한 키를 검증합니다 `Name` 및 `match`는 `[FILTER]` 및 `[OUTPUT]`에 각각 필요합니다. `Name` 및 `format`은 `[PARSER]`에 각각 필요합니다. 태그는 대/소문자를 구분합니다.
   + `${ENV_VAR}`과 같은 환경 변수는 `ConfigMap`에서 허용되지 않습니다.
   + 들여쓰기는 각 `filters.conf`, `output.conf`, `parsers.conf` 내의 지시문 또는 키 값 페어에 대해 동일해야합니다. 키 값 페어는 지시문보다 들여 써야 합니다.
   + Fargate는 `grep`, `parser`, `record_modifier`, `rewrite_tag`, `throttle`, `nest`, `modify`, `kubernetes` 등의 지원 필터에 대해 검증을 실시합니다.
   + Fargate는 다음과 같은 지원되는 출력에 대해 검증합니다. `es`, `firehose`, `kinesis_firehose`, `cloudwatch`, `cloudwatch_logs` 및 `kinesis`.
   + 로깅을 사용 설정하려면 `ConfigMap`에서 지원되는 `Output` 플러그 인이 1개 이상 제공되어야 합니다. `Filter` 및 `Parser`는 로깅을 사용 설정하는 데 필요하지 않습니다.

     검증에서 발생하는 문제를 해결하기 위해 원하는 구성을 사용하여 Amazon EC2 Fluent Bit를 실행할 수 있습니다. 다음 예 중 하나를 사용하여 `ConfigMap`을 생성합니다.
**중요**  
Amazon EKS Fargate 로깅은 `ConfigMap`의 동적 구성을 지원하지 않습니다. `ConfigMap`에 대한 모든 변경 사항은 새 포드에만 적용됩니다. 기존 포드에는 변경 사항이 적용되지 않습니다.

     원하는 로그 대상에 대한 예제를 사용하여 `ConfigMap`을 생성합니다.
**참고**  
로그 대상에 Amazon Kinesis Data Streams를 사용할 수도 있습니다. Kinesis Data Streams를 사용하는 경우 포드 실행 역할에 `kinesis:PutRecords` 권한이 부여되었는지 확인하세요. 자세한 내용은 *Fluent Bit: 공식 설명서*의 Amazon Kinesis Data Streams [권한](https://docs.fluentbit.io/manual/pipeline/outputs/kinesis#permissions)을 참조하세요.  
**Example**  

------
#### [ CloudWatch ]

   CloudWatch를 사용할 때는 다음 두 가지 출력 옵션이 있습니다.
   +  [C로 작성된 출력 플러그 인](https://docs.fluentbit.io/manual/v/1.5/pipeline/outputs/cloudwatch) 
   +  [Golang으로 작성된 출력 플러그 인](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit) 

   다음 예에서는 `cloudwatch_logs` 플러그 인을 사용하여 CloudWatch로 로그를 전송하는 방법을 보여줍니다.

   1. 다음 콘텐츠를 `aws-logging-cloudwatch-configmap.yaml`이라는 파일에 저장합니다. *region-code*를 클러스터가 있는 AWS 리전으로 바꿉니다. `[OUTPUT]` 아래의 파라미터는 필수입니다.

      ```
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: aws-logging
        namespace: aws-observability
      data:
        flb_log_cw: "false"  # Set to true to ship Fluent Bit process logs to CloudWatch.
        filters.conf: |
          [FILTER]
              Name parser
              Match *
              Key_name log
              Parser crio
          [FILTER]
              Name kubernetes
              Match kube.*
              Merge_Log On
              Keep_Log Off
              Buffer_Size 0
              Kube_Meta_Cache_TTL 300s
        output.conf: |
          [OUTPUT]
              Name cloudwatch_logs
              Match   kube.*
              region region-code
              log_group_name my-logs
              log_stream_prefix from-fluent-bit-
              log_retention_days 60
              auto_create_group true
        parsers.conf: |
          [PARSER]
              Name crio
              Format Regex
              Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>P|F) (?<log>.*)$
              Time_Key    time
              Time_Format %Y-%m-%dT%H:%M:%S.%L%z
      ```

   1. 매니페스트를 클러스터에 적용합니다.

      ```
      kubectl apply -f aws-logging-cloudwatch-configmap.yaml
      ```

------
#### [ Amazon OpenSearch Service ]

   Amazon OpenSearch Service에 로그를 전송하려면 C로 작성된 플러그인인 [es](https://docs.fluentbit.io/manual/v/1.5/pipeline/outputs/elasticsearch) 출력을 사용할 수 있습니다. 다음 예제에서는 이 플러그인을 사용하여 OpenSearch로 로그를 전송하는 방법을 보여줍니다.

   1. 다음 콘텐츠를 `aws-logging-opensearch-configmap.yaml`이라는 파일에 저장합니다. 모든 *예제 값*을 자신의 값으로 바꾸세요.

      ```
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: aws-logging
        namespace: aws-observability
      data:
        output.conf: |
          [OUTPUT]
            Name  es
            Match *
            Host  search-example-gjxdcilagiprbglqn42jsty66y.region-code.es.amazonaws.com
            Port  443
            Index example
            Type  example_type
            AWS_Auth On
            AWS_Region region-code
            tls   On
      ```

   1. 매니페스트를 클러스터에 적용합니다.

      ```
      kubectl apply -f aws-logging-opensearch-configmap.yaml
      ```

------
#### [ Firehose ]

   Firehose로 로그를 전송할 때는 다음과 같은 두 가지 출력 옵션이 있습니다.
   +  [kinesis\$1firehose](https://docs.fluentbit.io/manual/pipeline/outputs/firehose) – C로 작성된 출력 플러그인입니다.
   +  [firehose](https://github.com/aws/amazon-kinesis-firehose-for-fluent-bit) - Golang으로 작성된 출력 플러그인

     다음 예에서는 `kinesis_firehose` 플러그 인을 사용하여 Firehose로 로그를 전송하는 방법을 보여줍니다.

     1. 다음 콘텐츠를 `aws-logging-firehose-configmap.yaml`이라는 파일에 저장합니다. *region-code*를 클러스터가 있는 AWS 리전으로 바꿉니다.

        ```
        kind: ConfigMap
        apiVersion: v1
        metadata:
          name: aws-logging
          namespace: aws-observability
        data:
          output.conf: |
            [OUTPUT]
             Name  kinesis_firehose
             Match *
             region region-code
             delivery_stream my-stream-firehose
        ```

     1. 매니페스트를 클러스터에 적용합니다.

        ```
        kubectl apply -f aws-logging-firehose-configmap.yaml
        ```

------

1. Fargate Pod 실행 역할에 대한 권한을 설정하여 대상에 로그를 전송합니다.

   1. 대상의 IAM 정책을 컴퓨터에 다운로드합니다.  
**Example**  

------
#### [ CloudWatch ]

      CloudWatch IAM 정책을 컴퓨터에 다운로드합니다. GitHub에서 [정책](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json)을 볼 수도 있습니다.

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
      ```

------
#### [ Amazon OpenSearch Service ]

      OpenSearch IAM 정책을 컴퓨터에 다운로드합니다. GitHub에서 [정책](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json)을 볼 수도 있습니다.

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json
      ```

      OpenSearch Dashboard의 액세스 컨트롤이 제대로 구성되어 있는지 확인합니다. OpenSearch Dashboard의 `all_access role`에는 Fargate 포드 실행 역할과 IAM 역할이 매핑되어야 합니다. `security_manager` 역할에 대해서도 동일한 매핑이 수행되어야 합니다. 이전 매핑을 추가하려면 `Menu`, `Security`, `Roles`를 차례로 선택한 다음 해당 역할을 선택합니다. 자세한 내용은 [CloudWatch Logs가 내 Amazon ES 도메인으로 스트리밍되도록 문제를 해결하려면 어떻게 해야 하나요?](https://aws.amazon.com/tr/premiumsupport/knowledge-center/es-troubleshoot-cloudwatch-logs/) 부분을 참조하세요.

------
#### [ Firehose ]

      Firehose IAM 정책을 컴퓨터에 다운로드합니다. GitHub에서 [정책](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json)을 볼 수도 있습니다.

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
      ```

------

   1. 다운로드한 정책 파일에서 IAM 정책을 생성합니다.

      ```
      aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
      ```

   1. 다음 명령을 사용하여 Fargate 프로필에 대해 지정된 포드 실행 역할에 IAM 정책을 연결합니다. *111122223333*을 계정 ID로 바꿉니다. *AmazonEKSFargatePodExecutionRole*을 포드 실행 역할로 바꿉니다(자세한 내용은 [2단계: Fargate 포드 실행 역할 생성](fargate-getting-started.md#fargate-sg-pod-execution-role) 참조).

      ```
      aws iam attach-role-policy \
        --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
        --role-name AmazonEKSFargatePodExecutionRole
      ```

### Kubernetes 필터 지원
<a name="fargate-logging-kubernetes-filter"></a>

Fluent Bit Kubernetes 필터를 사용하면 로그 파일에 Kubernetes 메타데이터를 추가할 수 있습니다. 필터에 대한 자세한 내용은 Fluent Bit 설명서의 [Kubernetes](https://docs.fluentbit.io/manual/pipeline/filters/kubernetes)를 참조하세요. API 서버 엔드포인트를 사용하여 필터를 적용할 수 있습니다.

```
filters.conf: |
    [FILTER]
        Name             kubernetes
        Match            kube.*
        Merge_Log           On
        Buffer_Size         0
        Kube_Meta_Cache_TTL 300s
```

**중요**  
 `Kube_URL`, `Kube_CA_File`, `Kube_Token_Command` 및 `Kube_Token_File`은 서비스 소유 구성 파라미터이므로 지정하면 안 됩니다. Amazon EKS Fargate가 이러한 값을 채웁니다.
 `Kube_Meta_Cache_TTL`은 Fluent Bit가 최신 메타데이터에 대해 API 서버와 통신할 때까지 대기하는 시간입니다. `Kube_Meta_Cache_TTL`을 지정하지 않으면 Amazon EKS Fargate는 API 서버의 로드를 줄이기 위해 기본값 30분을 추가합니다.

### 계정에 Fluent-bit 프로세스 로그 전송
<a name="ship-fluent-bit-process-logs"></a>

원하는 경우 다음 `ConfigMap`을 사용하여 Fluent Bit 프로세스 로그를 Amazon CloudWatch로 전송할 수 있습니다. Fluent Bit 프로세스 로그를 CloudWatch로 전송하려면 추가 로그 수집 및 스토리지 비용이 필요합니다. *region-code*를 클러스터가 있는 AWS 리전으로 바꿉니다.

```
kind: ConfigMap
apiVersion: v1
metadata:
  name: aws-logging
  namespace: aws-observability
  labels:
data:
  # Configuration files: server, input, filters and output
  # ======================================================
  flb_log_cw: "true"  # Ships Fluent Bit process logs to CloudWatch.

  output.conf: |
    [OUTPUT]
        Name cloudwatch
        Match kube.*
        region region-code
        log_group_name fluent-bit-cloudwatch
        log_stream_prefix from-fluent-bit-
        auto_create_group true
```

로그는 클러스터와 동일한 AWS 리전의 CloudWatch에 있습니다. 로그 그룹 이름은 ` my-cluster-fluent-bit-logs`이고 Fluent Bit 로그스트림 이름은 `fluent-bit-podname-pod-namespace `입니다.

**참고**  
프로세스 로그는 Fluent Bit 프로세스가 성공적으로 시작된 경우에만 전송됩니다. Fluent Bit를 시작하는 동안 오류가 발생하면 프로세스 로그가 누락됩니다. CloudWatch에는 프로세스 로그만 전송할 수 있습니다.
계정으로 프로세스 로그 전송을 디버깅하려면 이전 `ConfigMap`을 적용하여 프로세스 로그를 얻습니다. Fluent Bit 시작에 실패하는 이유는 일반적으로 시작하는 동안 Fluent Bit에서 `ConfigMap`을 구문 분석하거나 수락하지 않기 때문입니다.

### Fluent Bit 프로세스 로그 전송 중지
<a name="stop-fluent-bit-process-logs"></a>

Fluent Bit 프로세스 로그를 CloudWatch로 전송하려면 추가 로그 수집 및 스토리지 비용이 필요합니다. 기존 `ConfigMap` 설정에서 프로세스 로그를 제외하려면 다음 단계를 수행하세요.

1. Fargate 로깅을 활성화한 후 Amazon EKS 클러스터의 Fluent Bit 프로세스 로그에 대해 자동으로 생성된 CloudWatch 로그 그룹을 찾습니다. 형식 ` my-cluster-fluent-bit-logs`을 따릅니다.

1. CloudWatch 로그 그룹에서 각 포드의 프로세스 로그에 대해 생성된 기존 CloudWatch 로그 스트림을 삭제합니다.

1. `ConfigMap`을 편집하고 `flb_log_cw: "false"`를 설정합니다.

1. 클러스터의 모든 포드를 클러스터의 포드에 대한 재시작합니다.

## 애플리케이션 테스트
<a name="fargate-logging-test-application"></a>

1. 샘플 포드를 배포합니다.

   1. 다음 콘텐츠를 컴퓨터에 `sample-app.yaml`이라는 파일에 저장합니다.

      ```
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sample-app
        namespace: same-namespace-as-your-fargate-profile
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
              - name: nginx
                image: nginx:latest
                ports:
                  - name: http
                    containerPort: 80
      ```

   1. 매니페스트를 클러스터에 적용합니다.

      ```
      kubectl apply -f sample-app.yaml
      ```

1. `ConfigMap`에서 구성한 대상을 사용하여 NGINX 로그를 봅니다.

## 크기 조정 고려 사항
<a name="fargate-logging-size-considerations"></a>

로그 라우터에 대해 최대 50MB의 메모리를 계획하는 것이 좋습니다. 애플리케이션에서 매우 높은 처리량으로 로그를 생성할 것으로 예상되는 경우 최대 100MB까지 계획해야 합니다.

## 문제 해결
<a name="fargate-logging-troubleshooting"></a>

잘못된 `ConfigMap`과 같은 원인으로 로깅 기능이 사용 또는 사용 중지되었는지 여부와 잘못된 이유를 확인하려면 `kubectl describe pod pod-name `을 사용하여 포드 이벤트를 살펴봅니다. 출력에는 다음 예제 출력과 같이 로깅의 사용 여부를 명확히 하는 포드 이벤트가 포함될 수 있습니다.

```
[...]
Annotations:          CapacityProvisioned: 0.25vCPU 0.5GB
                      Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND
[...]
Events:
  Type     Reason           Age        From                                                           Message
  ----     ------           ----       ----                                                           -------
  Warning  LoggingDisabled  <unknown>  fargate-scheduler                                              Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
```

포드 이벤트는 설정에 따라 기간이 정해진 일시적인 이벤트입니다. 또한 `kubectl describe pod pod-name `을 사용하여 포드의 주석을 볼 수 있습니다. 포드 주석에는 로깅 기능이 사용 또는 사용 중지되었는지 여부와 이유에 대한 정보가 있습니다.

# 최적의 Amazon EC2 노드 인스턴스 유형 선택
<a name="choosing-instance-type"></a>

Amazon EC2에서는 워커 노드에 대한 다양한 인스턴스 유형을 제공합니다. 인스턴스 유형마다 서로 다른 컴퓨팅, 메모리, 스토리지 및 네트워크 기능을 제공합니다. 또한 각 인스턴스는 이러한 기능에 따라 한 인스턴스 패밀리로 그룹화됩니다. 목록은 *Amazon EC2 사용 설명서*의 [사용 가능한 인스턴스 유형](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#AvailableInstanceTypes)을 참조하세요. Amazon EKS에서는 Amazon EC2 AMI의 여러 변형을 출시하여 지원을 사용 설정합니다. 선택한 인스턴스 유형이 Amazon EKS와 호환되는지 확인하려면 다음 기준을 고려하세요.
+ 일부 Amazon EKS AMI에서는 현재 `mac` 패밀리를 지원하지 않습니다.
+ Arm 및 가속화되지 않은 Amazon EKS AMI에서는 `g3`, `g4`, `inf` 및 `p` 패밀리를 지원하지 않습니다.
+ 가속화된 Amazon EKS AMI에서는 `a`, `c`, `hpc`, `m` 및 `t` 패밀리를 지원하지 않습니다.
+ ARM 기반 인스턴스에서 Amazon Linux 2023(AL2023)은 Graviton2 이상 프로세서를 사용하는 인스턴스 유형만 지원합니다. AL2023은 `A1` 인스턴스를 지원하지 않습니다.

Amazon EKS에서 지원하는 인스턴스 유형 중에서 선택하는 경우 각 유형의 다음 기능을 고려하세요.

 **노드 그룹의 인스턴스 수**   
특히 DaemonSet이 많은 경우 일반적으로 수는 적고 크기는 큰 인스턴스가 더 좋습니다. 각 인스턴스에는 API 서버에 대한 API 직접 호출이 필요하므로 인스턴스가 많을수록 API 서버에 더 많은 부하가 발생합니다.

 **운영 체제**   
[Linux](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html), [Windows](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/instance-types.html) 및 [Bottlerocket](https://aws.amazon.com/bottlerocket/faqs/)에 대해 지원되는 인스턴스 유형을 검토합니다. Windows 인스턴스를 생성하기 전에 [EKS 클러스터에 Windows 노드 배포](windows-support.md)를 검토합니다.

 **하드웨어 아키텍처**   
x86 또는 Arm이 필요하나요? Arm 인스턴스를 배포하기 전에 [Amazon EKS 최적화 Arm Amazon Linux AMI](eks-optimized-ami.md#arm-ami)를 검토합니다. Nitro 시스템( [Linux](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances) 또는 [Windows](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/instance-types.html#ec2-nitro-instances))에 구축된 인스턴스나 [가속](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/accelerated-computing-instances.html) 기능이 있는 인스턴스가 필요하신가요? 가속화된 기능이 필요한 경우 Amazon EKS에서 Linux만 사용할 수 있습니다.

 **최대 포드 수**   
각 포드에 고유한 IP 주소가 할당되므로 인스턴스 유형에서 지원하는 IP 주소 수는 인스턴스에서 실행할 수 있는 포드 수를 결정하는 요소입니다. 인스턴스 유형이 지원하는 포드의 수를 수동으로 확인하려면  섹션을 참조하세요.  
 [AWS Nitro 시스템(Nitro System)](https://aws.amazon.com/ec2/nitro/) 인스턴스 유형은 Nitro 시스템 이외의 인스턴스 유형보다 훨씬 많은 IP 주소를 선택적으로 지원합니다. 그러나 인스턴스에 할당된 일부 IP 주소만 포드에 사용할 수 있습니다. 훨씬 더 많은 수의 IP 주소를 인스턴스에 할당하려면 클러스터에 버전 `1.9.0` 이상의 Amazon VPC CNI 추가 기능이 설치되어 있고 적절하게 구성되어 있어야 합니다. 자세한 내용은 [접두사를 사용하여 Amazon EKS 노드에 추가 IP 주소 할당](cni-increase-ip-addresses.md) 섹션을 참조하세요. 인스턴스에 가장 많은 수의 IP 주소를 할당하려면 클러스터에 버전 `1.10.1` 이상의 Amazon VPC CNI 추가 기능이 설치되어 있어야 하며 `IPv6` 패밀리를 사용하여 클러스터를 배포해야 합니다.

 **IP 패밀리**   
클러스터가 포드와 서비스에 프라이빗 `IPv4` 주소를 할당하도록 허용하는 클러스터용 `IPv4` 패밀리를 사용하는 경우 지원되는 모든 인스턴스 유형을 사용할 수 있습니다. 하지만 클러스터에 대한 `IPv6` 패밀리를 사용하려는 경우 [AWS Nitro 시스템(Nitro System)](https://aws.amazon.com/ec2/nitro/) 인스턴스 유형 또는 베어 메탈 인스턴스 유형을 사용해야 합니다. Windows 인스턴스에는 `IPv4`만 지원됩니다. 클러스터에서 버전 `1.10.1` 이상의 Amazon VPC CNI 추가 기능을 실행하고 있어야 합니다. `IPv6` 사용에 관한 자세한 내용은 [클러스터, 포드 및 서비스에 대한 IPv6 주소에 대해 알아보기](cni-ipv6.md) 부분을 참조하세요.

 **실행 중인 Amazon VPC CNI 추가 기능의 버전**   
최신 버전의 [Kubernetes용 Amazon VPC CNI 플러그인](https://github.com/aws/amazon-vpc-cni-k8s)은 [다음 인스턴스 유형](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/pkg/vpc/vpc_ip_resource_limit.go)을 지원합니다. 지원되는 최신 인스턴스 유형을 활용하려면 Amazon VPC CNI 추가 기능 버전을 업데이트해야 할 수 있습니다. 자세한 내용은 [Amazon VPC CNI를 통해 포드에 IP 할당](managing-vpc-cni.md) 섹션을 참조하세요. 최신 버전은 Amazon EKS에서 사용할 최신 기능을 지원합니다. 이전 버전에서는 일부 기능을 지원하지 않습니다. GitHub의 [Changelog](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/CHANGELOG.md)에 있는 다양한 버전에서 지원하는 기능을 볼 수 있습니다.

 **노드를 생성하는 AWS 리전**   
AWS 리전에 따라 일부 인스턴스 유형은 사용할 수 없습니다.

 **포드에 보안 그룹 사용 여부**   
포드에 보안 그룹을 사용하는 경우 특정 인스턴스 유형만 지원됩니다. 자세한 내용은 [개별 포드에 보안 그룹 할당](security-groups-for-pods.md) 섹션을 참조하세요.

## maxPods 결정 방법
<a name="max-pods-precedence"></a>

노드에 적용되는 최종 `maxPods` 값은 특정 우선순위로 상호 작용하는 여러 구성 요소에 따라 달라집니다. 이 순서를 이해하면 `maxPods`를 사용자 지정할 때 예기치 않은 동작을 방지하는 데 도움이 됩니다.

 **우선순위(가장 높은 순서에서 낮은 순서):** 

1.  **관리형 노드 그룹 적용** - [사용자 지정 AMI](launch-templates.md#launch-template-custom-ami) 없이 관리형 노드 그룹을 사용하는 경우 Amazon EKS는 노드 사용자 데이터의 `maxPods`에 최대 한도를 적용합니다. vCPU가 30개 미만인 인스턴스의 경우 최대 한도는 `110` 입니다. vCPU가 30개를 초과하는 인스턴스의 경우 최대 한도는 `250`입니다. 이 값은 `maxPodsExpression`을 포함하여 다른 `maxPods` 구성보다 우선합니다.

1.  **kubelet `maxPods` 구성** - kubelet 구성에서 직접 `maxPods`를 설정하는 경우(예: 사용자 지정 AMI를 사용하는 시작 템플릿을 통해) 이 값이 `maxPodsExpression`보다 우선합니다.

1.  **nodeadm `maxPodsExpression`** - `NodeConfig`에서 [https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/examples/#defining-a-max-pods-expression](https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/examples/#defining-a-max-pods-expression)을 사용하는 경우 nodeadm은 표현식을 평가하여 `maxPods`를 계산합니다. 이 방법은 우선순위가 더 높은 소스에 의해 값이 아직 설정되지 않은 경우에만 유효합니다.

1.  **기본 ENI 기반 계산** - 다른 값이 설정되지 않은 경우 AMI는 인스턴스 유형에서 지원하는 탄력적 네트워크 인터페이스 및 IP 주소 수를 기반으로 `maxPods`를 계산합니다. 이는 `(number of ENIs × (IPs per ENI − 1)) + 2` 공식과 동일합니다. `+ 2`는 포드 IP 주소를 소비하지 않는 모든 노드에서 실행되는 Amazon VPC CNI 및 `kube-proxy`를 고려합니다.

**중요**  
관리형 노드 그룹을 사용하고 `NodeConfig`에서 `maxPodsExpression`을 설정하면 관리형 노드 그룹의 적용이 표현식을 재정의합니다. 관리형 노드 그룹에서 사용자 지정 `maxPods` 값을 사용하려면 시작 템플릿에서 사용자 지정 AMI를 지정하고 `maxPods`를 직접 설정해야 합니다. 자세한 내용은 [시작 템플릿을 사용한 관리형 노드 사용자 지정](launch-templates.md) 섹션을 참조하세요.

 **관리형 노드 그룹과 자체 관리형 노드 비교** 

사용자 지정 AMI 없이 관리형 노드 그룹을 사용하면 Amazon EKS가 노드의 부트스트랩 사용자 데이터에 `maxPods` 값을 주입합니다. 이는 다음을 의미합니다.
+ `maxPods` 값은 항상 인스턴스 크기에 따라 `110` 또는 `250`으로 제한됩니다.
+ 구성한 모든 `maxPodsExpression`은 이 주입된 값으로 재정의됩니다.
+ 다른 `maxPods` 값을 사용하려면 시작 템플릿에서 사용자 지정 AMI를 지정하고 `--use-max-pods false`를 `--kubelet-extra-args '--max-pods=my-value'`와 함께 `bootstrap.sh` 스크립트로 전달합니다. 예시는 [시작 템플릿을 사용한 관리형 노드 사용자 지정](launch-templates.md) 섹션을 참조하세요.

자체 관리형 노드를 사용하면 부트스트랩 프로세스를 완벽하게 제어할 수 있습니다. `NodeConfig`에서 `maxPodsExpression`을 사용하거나 `bootstrap.sh`에 `--max-pods`를 직접 전달할 수 있습니다.

## EKS Auto Mode 고려 사항
<a name="_considerations_for_eks_auto_mode"></a>

EKS Auto Mode는 노드의 포드 수를 다음 중 더 낮은 값으로 제한합니다.
+ 110 포드 하드 캡
+ 위에서 설명한 최대 포드 계산 결과입니다.

# 사전 빌드된 최적화 이미지를 사용한 노드 생성
<a name="eks-optimized-amis"></a>

관리형 노드 그룹이나 자체 관리형 노드를 사용하는 경우 사전 구축된 Amazon EKS 최적화 [Amazon Machine Image](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html)(AMI) 또는 사용자 지정 AMI를 사용하여 노드를 배포할 수 있습니다. 하이브리드 노드를 실행하는 경우 [하이브리드 노드용 운영 체제 준비](hybrid-nodes-os.md) 섹션을 참조하세요. Amazon EKS 최적화 AMI의 각 유형에 대한 자세한 내용은 다음 주제 중 하나를 참조하세요. 고유한 사용자 지정 AMI를 생성하는 방법에 대한 설명은 [사용자 지정 ECS 최적화 Amazon Linux AMI 빌드](eks-ami-build-scripts.md) 섹션을 참조하세요.

Amazon EKS Auto Mode를 사용하면 EKS가 AMI 선택 및 업데이트를 포함하여 EC2 인스턴스를 관리합니다.

**Topics**
+ [EKS AL2 및 AL2 가속 AMI 전환 기능 가이드](eks-ami-deprecation-faqs.md)
+ [최적화된 Amazon Linux AMI를 사용한 노드 생성](eks-optimized-ami.md)
+ [최적화된 Bottlerocket AMI를 사용한 노드 생성](eks-optimized-ami-bottlerocket.md)
+ [최적화된 Ubuntu Linux AMI를 사용한 노드 생성](eks-partner-amis.md)
+ [최적화된 Windows AMI를 사용한 노드 생성](eks-optimized-windows-ami.md)

# EKS AL2 및 AL2 가속 AMI 전환 기능 가이드
<a name="eks-ami-deprecation-faqs"></a>

**주의**  
Amazon EKS는 2025년 11월 26일 이후 더 이상 EKS 최적화 Amazon Linux 2(AL2) AMI 게시를 중지했습니다. Amazon EKS에 대한 AL2023 및 Bottlerocket 기반 AMI는 1.33 이상을 포함하여 지원되는 모든 Kubernetes 버전에서 사용할 수 있습니다.

 AWS는 AL2 최적화 및 AL2 가속 AMI에 대한 지원을 2025년 11월 26일부로 종료합니다. 지원 종료(EOS) 날짜(2025년 11월 26일) 이후에도 EKS AL2 AMI를 계속 사용할 수 있지만 EKS는 이 날짜 이후에 마이너 릴리스, 패치 및 버그 수정을 포함하여 AL2 AMI에 대한 새로운 Kubernetes 버전 또는 업데이트를 더 이상 릴리스하지 않습니다. Amazon Linux 2023(AL2023) 또는 Bottlerocket AMI로 업그레이드하는 것이 좋습니다.
+ AL2023은 사전 구성된 보안 정책, 허용 모드의 SELinux, 기본적으로 활성화된 IMDSv2 전용 모드, 최적화된 부팅 시간, 강화된 보안 및 성능을 위한 향상된 패키지 관리를 통해 secure-by-default 접근 방식을 지원하며, 직접 OS 수준 액세스 또는 광범위한 노드 변경과 같은 중요한 사용자 지정이 필요한 인프라에 적합합니다. 자세한 내용은 [AL2023 FAQs](https://aws.amazon.com/linux/amazon-linux-2023/faqs/)를 참조하거나 [Amazon Linux 2에서 Amazon Linux 2023으로 업그레이드](al2023.md)에서 자세한 마이그레이션 지침을 참조하세요.
+ Bottlerocket을 사용하면 특별히 구축된 컨테이너 최적화 설계로 보안 강화, 부팅 시간 단축, 공격 표면 축소를 통해 효율성을 개선할 수 있으며, 노드 사용자 지정이 최소한으로 필요해 컨테이너 네이티브 접근 방식에 적합합니다. 자세한 내용은 [Bottlerocket FAQs](https://aws.amazon.com/bottlerocket/faqs/)를 참조하거나 [최적화된 Bottlerocket AMI를 사용한 노드 생성](eks-optimized-ami-bottlerocket.md)에서 자세한 마이그레이션 지침을 참조하세요.

또는 EOS 날짜(2025년 11월 26일)까지 [사용자 지정 ECS 최적화 Amazon Linux AMI 빌드](eks-ami-build-scripts.md)를 수행할 수 있습니다. 또는 Amazon Linux 2 EOS 날짜(2026년 6월 30일)까지 Amazon Linux 2 기본 인스턴스로 사용자 지정 AMI를 빌드할 수 있습니다.

## 마이그레이션 및 지원 FAQ
<a name="_migration_and_support_faqs"></a>

### AL2에서 AL2023 AMI로 마이그레이션하려면 어떻게 해야 하나요?
<a name="_how_do_i_migrate_from_my_al2_to_an_al2023_ami"></a>

철저한 애플리케이션 워크로드 테스트 및 문서화된 롤백 절차를 포함하는 마이그레이션 계획을 작성 및 구현한 다음 EKS 공식 설명서의 [Amazon Linux 2에서 Amazon Linux 2023으로 업그레이드](https://docs.aws.amazon.com/eks/latest/userguide/al2023.html)의 단계별 지침을 따르는 것이 좋습니다.

### EKS 최적화 AL2 AMI의 EKS 지원 종료(EOS) 날짜 이후에 사용자 지정 AL2 AMI를 빌드할 수 있나요?
<a name="_can_i_build_a_custom_al2_ami_past_the_eks_end_of_support_eos_date_for_eks_optimized_al2_amis"></a>

공식적으로 지원 및 게시되는 AL2023 또는 Bottlerocket용 EKS 최적화 AMI로 전환하는 것이 좋지만, AL2 AMI EOS 날짜(2025년 11월 26일)까지는 사용자 지정 AL2 최적화 및 AL2 가속 AMI를 구축할 수 있습니다. 또는 Amazon Linux 2 EOS 날짜(2026년 6월 30일)까지 Amazon Linux 2 기본 인스턴스로 사용자 지정 AMI를 빌드할 수 있습니다. 사용자 지정 EKS AL2 최적화 및 AL2 가속 AMI를 빌드하기 위한 단계별 지침은 EKS 공식 설명서의 [사용자 지정 Amazon Linux AMI 빌드](https://docs.aws.amazon.com/eks/latest/userguide/eks-ami-build-scripts.html)를 참조하세요.

### EKS Kubernetes 버전 지원 정책은 Amazon Linux 배포에 적용되나요?
<a name="_does_the_eks_kubernetes_version_support_policy_apply_to_amazon_linux_distributions"></a>

아니요. EKS AL2 최적화 및 AL2 가속 AMI의 EOS 날짜는 EKS의 Kubernetes 버전에 대한 표준 및 확장 지원 타임라인과 독립적입니다. EKS 확장 지원을 사용하는 경우에도 AL2023 또는 Bottlerocket으로 마이그레이션해야 합니다.

### cgroupv1에서 cgroupv2로의 전환은 마이그레이션에 어떤 영향을 미치나요?
<a name="_how_does_the_shift_from_cgroupv1_to_cgroupv2_affect_my_migration"></a>

[Kubernetes 커뮤니티](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/4569-cgroup-v1-maintenance-mode/README.md)는 `cgroupv1` 지원(AL2에서 사용)을 유지 관리 모드로 전환했습니다. 즉, 새로운 기능이 추가되지 않고 중요한 보안 및 주요 버그 수정만 제공됩니다. Kubernetes에서 `cgroupv2`를 채택하려면 OS, 커널, 컨테이너 런타임, Kubernetes 구성 요소 간의 호환성을 보장해야 합니다. 여기에는 AL2023, Bottlerocket, Red Hat Enterprise Linux(RHEL) 9 이상, Ubuntu 22.04 이상 또는 Debian 11 이상과같이 기본적으로 `cgroupv2`를 활성화하는 Linux 배포가 필요합니다. 이러한 배포에는 커널 버전 5.8 이상이 함께 제공되며, 이는 Kubernetes의 `cgroupv2` 지원 최소 요구 사항입니다. 자세한 내용은 [cgroup v2 정보](https://kubernetes.io/docs/concepts/architecture/cgroups/)를 참조하세요.

### 사용자 지정 AL2 AMI에 Neuron이 필요한 경우 어떻게 해야 하나요?
<a name="_what_do_i_do_if_i_need_neuron_in_my_custom_al2_ami"></a>

AL2 기반 AMI에서는 기본적으로 전체 Neuron 기반 애플리케이션을 실행할 수 없습니다. AL2 AMI에서 AWS Neuron을 활용하려면 비 AL2 Linux 배포판(예: Ubuntu 22.04, Amazon Linux 2023 등)을 실행하는 Neuron 지원 컨테이너를 사용하여 애플리케이션을 컨테이너화한 다음 Neuron 드라이버(`aws-neuronx-dkms`)가 설치된 AL2 기반 AMI에 해당 컨테이너를 배포해야 합니다.

### EKS AL2 AMI EOS 날짜(2025년 11월 26일) 이후에 베어 Amazon Linux 2 기본 인스턴스로 전환해야 하나요?
<a name="_should_i_switch_to_a_bare_amazon_linux_2_base_instance_after_the_eks_al2_ami_eos_date_november_26_2025"></a>

베어 Amazon Linux 2 기본 인스턴스로 전환하면 공식 EKS AL2 최적화 및 AL2 가속 AMI에서 제공하는 특정 최적화, 컨테이너 런타임 구성 및 사용자 지정을 사용할 수 없습니다. 대신 AL2 기반 솔루션을 계속 사용해야 하는 경우 [사용자 지정 ECS 최적화 Amazon Linux AMI 빌드](eks-ami-build-scripts.md) 또는 [Amazon EKS AMI Build Specification](https://github.com/awslabs/amazon-eks-ami)에서 EKS AMI 레시피를 사용하여 사용자 지정 AMI를 빌드하는 것이 좋습니다. 이를 통해 기존 워크로드와의 호환성이 보장되고 Amazon Linux 2 EOS 날짜(2026년 6월 30일)까지 AL2 커널 업데이트가 포함됩니다.

### EKS AL2 AMI EOS 날짜(2025년 11월 26일) 이후에 EKS AMI GitHub 리포지토리를 사용하여 사용자 지정 AL2 AMI를 빌드할 때 amzn2-core 및 amzn2extra-docker와 같은 리포지토리의 패키지에 어떤 지원을 사용할 수 있나요?
<a name="_when_building_a_custom_al2_ami_using_the_eks_ami_github_repository_after_the_eks_al2_ami_eos_date_november_26_2025_what_support_is_available_for_packages_from_repositories_like_amzn2_core_and_amzn2extra_docker"></a>

[Amazon EKS AMI Build Specification](https://github.com/awslabs/amazon-eks-ami)의 EKS AMI 레시피는 [amzn2-core](https://docs.aws.amazon.com/linux/al2/ug/managing-software.html) 및 [amzn 2extra-docker](https://docs.aws.amazon.com/linux/al2/ug/managing-software.html)와 같은 표준 Amazon Linux 2 소프트웨어에서 YUM을 통해 패키지를 가져옵니다. EKS AL2 AMI EOS 날짜(2025년 11월 26일) 이후 이 소프트웨어는 더 광범위한 Amazon Linux 2 EOS 날짜(2026년 6월 30일)까지 계속 지원됩니다. 지원은 이 기간에 커널 업데이트로 제한되므로 보안 및 호환성을 유지하기 위해 다른 패키지 업데이트, 보안 패치 및 커널이 아닌 종속성을 수동으로 관리하고 적용해야 합니다.

### AL2023 기반의 Amazon EKS에서 이전 버전의 JDK8을 사용하는 Java 애플리케이션에서 메모리 부족(OOM) 예외 및 포드 다시 시작이 발생하는 이유는 무엇이며, 이를 해결하려면 어떻게 해야 하나요?
<a name="_why_might_java_applications_using_older_versions_of_jdk8_on_amazon_eks_with_al2023_experience_out_of_memory_oom_exceptions_and_pod_restarts_and_how_can_this_be_resolved"></a>

AL2023 기반의 Amazon EKS 노드에서 실행하는 경우 `jdk8u372` 이전 JDK 8 버전을 사용하는 Java 애플리케이션에서는 JVM이 `cgroupv2`와 호환되지 않기 때문에 OOM 예외 및 포드 다시 시작이 발생할 수 있습니다. 이 문제는 특히 JVM이 Amazon Linux 2023의 기본값(`cgroupv2`)을 사용하여 컨테이너 메모리 제한을 감지할 수 없기 때문에 발생합니다. 따라서 힙 할당은 포드의 정의된 제한이 아닌 노드의 총 메모리에 기반합니다. 이는 메모리 제한 데이터에 대한 스토리지 위치를 변경하는 `cgroupv2`에 기인하며, 이로 인해 이전 Java 버전에서 사용 가능한 메모리를 잘못 읽고 노드 수준 리소스를 수임합니다. 몇 가지 가능한 옵션은 다음과 같습니다.
+  **JDK 버전 업그레이드**: 전체 `cgroupv2` 지원을 통해 `jdk8u372` 이상 또는 최신 JDK 버전으로 업그레이드하면 이 문제를 해결할 수 있습니다. `cgroupv2`를 완전히 지원하는 호환되는 Java 버전 목록은 [About cgroup v2](https://kubernetes.io/docs/concepts/architecture/cgroups/)를 참조하세요.
+  **사용자 지정 AMI 빌드**: AL2 기반 솔루션을 계속 사용해야 하는 경우 [사용자 지정 ECS 최적화 Amazon Linux AMI 빌드](eks-ami-build-scripts.md) 또는 [Amazon EKS AMI Build Specification](https://github.com/awslabs/amazon-eks-ami)을 사용하여 사용자 지정 AL2 기반 AMI를 빌드할 수 있습니다(2025년 11월 26일까지). 예를 들어 AL2 기반 v1.33 AMI를 빌드할 수 있습니다(2025년 11월 26일까지). Amazon EKS는 EKS AL2 EOS 날짜(2025년 11월 26일)까지 EKS AL2 기반 AMI를 제공합니다. EOS 날짜(2025년 11월 26일) 이후 자체 AMI를 빌드해야 합니다.
+  **cgroupv1 활성화**: `cgroupv1`을 계속 사용해야 하는 경우 EKS AL2023 AMI에서 `cgroupv1`을 활성화할 수 있습니다. 활성화하려면 `sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"`을 실행하고 시스템(예: Amazon Linux 2023을 실행하는 EC2 인스턴스 또는 노드)을 재부팅합니다. 그러면 시스템의 부팅 파라미터가 수정되고(예: GRUB 구성에 커널 파라미터 'systemd.unified\$1cgroup\$1hierarchy=0' 추가, 이를 통해 레거시 `cgroupv1` 계층 구조를 사용하도록 systemd에 지시) `cgroupv1`이 활성화됩니다. 이 grubby 명령을 실행하면 `cgroupv1`은 활성화되고 `cgroupv2`는 비활성화된 상태로 커널이 시작되도록 재구성됩니다. 이러한 cgroup 버전 중 하나만 노드의 활성 리소스 관리에 사용됩니다. 이는 `cgroupv1` API에 대한 이전 버전과의 호환성을 지원하는 `cgroupv2`를 실행하는 경우와 같지 않습니다.

**주의**  
`cgroupv1`을 계속 사용하지 않는 것이 좋습니다. 대신 `cgroupv2`로 마이그레이션하는 것이 좋습니다. Kubernetes 커뮤니티는 `cgroupv1` 지원(AL2에서 사용)을 유지 관리 모드로 전환했습니다. 즉, 새로운 기능이나 업데이트가 추가되지 않고 중요한 보안 및 주요 버그 수정만 제공됩니다. `cgroupv1` 지원의 전체 제거는 향후 릴리스에서 예상되지만, 이 전체 제거에 대한 구체적인 날짜는 아직 공지되지 않았습니다. `cgroupv1`에 문제가 발생하면 AWS에서 지원을 제공할 수 없으며 `cgroupv2`로 업그레이드하는 것이 좋습니다.

## 호환성 및 버전
<a name="_compatibility_and_versions"></a>

### AL2 AMI에 지원되는 Kubernetes 버전
<a name="_supported_kubernetes_versions_for_al2_amis"></a>

Kubernetes 버전 1.32는 Amazon EKS가 AL2(Amazon Linux 2) AMI를 릴리스하는 마지막 버전입니다. [지원되는](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html) Kubernetes 버전 1.32 이하의 경우 EKS는 2025년 11월 26일까지 AL2 AMI(AL2\$1ARM\$164, AL2\$1x86\$164) 및 AL2 가속 AMI(AL2\$1x86\$164\$1GPU)를 계속 릴리스합니다. 이 날짜 이후에는 EKS가 모든 Kubernetes 버전에 대해 AL2 최적화 및 AL2 가속 AMI 릴리스를 중지합니다. EKS AL2 최적화 및 AL2 가속 AMI의 EOS 날짜는 EKS의 Kubernetes 버전에 대한 표준 및 확장 지원 타임라인과 독립적입니다.

### AL2, AL2023 및 Bottlerocket AMI에 지원되는 드라이버 및 Linux 커널 버전 비교
<a name="_supported_drivers_and_linux_kernel_versions_comparison_for_al2_al2023_and_bottlerocket_amis"></a>


| 구성 요소 | EKS AL2 AMI | EKS AL2023 AMI | EKS Bottlerocket AMI | 
| --- | --- | --- | --- | 
|  기본 OS 호환성  |  RHEL7/CentOS 7  |  Fedora/CentOS 9  |  해당 사항 없음  | 
|   [CUDA 사용자 모드 드라이버](https://docs.nvidia.com/deploy/cuda-compatibility/why-cuda-compatibility.html#why-cuda-compatibility)   |  12.x  |  12.x, 13.x  |  12.x, 13.x  | 
|  NVIDIA GPU 드라이버  |  R570  |  R580  |  R570, R580  | 
|   AWS Neuron 드라이버  |  2.20 이상  |  2.20 이상  |  2.20 이상  | 
|  Linux 커널  |  5.10  |  6.1, 6.12  |  6.1, 6.12  | 

NVIDIA 드라이버 및 CUDA 호환성에 대한 자세한 내용은 [NVIDIA 설명서](https://docs.nvidia.com/datacenter/tesla/drivers/index.html#supported-drivers-and-cuda-toolkit-versions)를 참조하세요.

### AWS Neuron과 AL2 AMI의 호환성
<a name="shared_aws_neuron_compatibility_with_al2_amis"></a>

[AWS Neuron 릴리스 2.20](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/release-notes/prev/rn.html#neuron-2-20-0-whatsnew)부터 EKS AL 기반 AMI에서 사용하는 Neuron 런타임(`aws-neuronx-runtime-lib`)은 더 이상 Amazon Linux 2(AL2)를 지원하지 않습니다. Neuron 드라이버(`aws-neuronx-dkms`)는 이제 Amazon Linux 2를 지원하는 유일한 AWS Neuron 패키지입니다. 즉, AL2 기반 AMI에서는 기본적으로 Neuron 기반 애플리케이션을 실행할 수 없습니다. AL2023 AMI에서 Neuron을 설정하려면 [AWS Neuron 설정](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/general/setup/index.html#setup-guide-index) 가이드를 참조하세요.

### Kubernetes와 AL2 AMI의 호환성
<a name="_kubernetes_compatibility_with_al2_amis"></a>

Kubernetes 커뮤니티는 `cgroupv1` 지원(AL2에서 사용)을 유지 관리 모드로 전환했습니다. 즉, 새로운 기능이 추가되지 않으며 중요한 보안 및 주요 버그 수정만 제공됩니다. MemoryQoS 및 향상된 리소스 격리와 같이 cgroupv2에 의존하는 모든 Kubernetes 기능은 AL2에서 사용할 수 없습니다. 또한 Amazon EKS Kubernetes 버전 1.32는 AL2 AMI를 지원하는 마지막 버전입니다. 최신 Kubernetes 버전과의 호환성을 유지하려면 `cgroupv2`가 기본적으로 활성화되는 AL2023 또는 Bottlerocket으로 마이그레이션하는 것이 좋습니다.

### Linux 버전과 AL2 AMI의 호환성
<a name="_linux_version_compatibility_with_al2_amis"></a>

Amazon Linux 2(AL2)는 AWS에서 지원 종료(EOS) 날짜인 2026년 6월 30일까지 지원합니다. 그러나 AL2가 노후화됨에 따라 새로운 애플리케이션 및 기능에 대한 보다 광범위한 Linux 커뮤니티의 지원은 더욱 제한되고 있습니다. AL2 AMI는 [Linux 커널 5.10](https://docs.aws.amazon.com/linux/al2/ug/kernel.html)을 기반으로 하는 반면, AL2023은 [Linux 커널 6.1](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2-kernel.html)을 사용합니다. AL2023과 달리, AL2는 보다 광범위한 Linux 커뮤니티의 지원이 제한적입니다. 즉, AL2의 이전 커널 버전에서 작동하려면 많은 업스트림 Linux 패키지 및 도구를 백포트해야 하고, 일부 최신 Linux 기능 및 보안 개선 사항은 이전 커널로 인해 사용할 수 없으며, 많은 오픈 소스 프로젝트는 5.10과 같은 이전 커널 버전에 대한 지원을 중단 또는 제한했습니다.

### AL2023에 포함되지 않은 더 이상 사용되지 않는 패키지
<a name="_deprecated_packages_not_included_in_al2023"></a>

AL2023에서 포함되지 않았거나 변경된 몇 가지 가장 일반적인 패키지는 다음과 같습니다.
+ [Amazon Linux 2의 일부 소스 바이너리 패키지](https://docs.aws.amazon.com/linux/al2023/release-notes/removed-AL2023.6-AL2.html)는 Amazon Linux 2023에서 더 이상 사용할 수 없습니다.
+ Amazon Linux가 AL2023에서 다양한 버전의 패키지(예: [amazon-linux-extras 시스템](https://repost.aws/questions/QUWGU3VFJMRSGf6MDPWn4tLg/how-to-resolve-amazon-linux-extras-in-al2023))를 지원하는 방법이 변경되었습니다.
+  [Extra Packages for Enterprise Linux(EPEL)](https://docs.aws.amazon.com/linux/al2023/ug/epel.html)는 AL2023에서 지원되지 않습니다.
+  [32비트 애플리케이션](https://docs.aws.amazon.com/linux/al2023/ug/deprecated-al2.html#deprecated-32bit-rpms)은 AL2023에서 지원되지 않습니다.

자세한 내용은 [AL2 및 AL2023 비교](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2.html)를 참조하세요.

### AL2, AL2023, Bottlerocket 간 FIPS 검증 비교
<a name="_fips_validation_comparison_across_al2_al2023_and_bottlerocket"></a>

Amazon Linux 2(AL2), Amazon Linux 2023(AL2023) 및 Bottlerocket은 FIPS(연방 정보 처리 표준) 규정 준수를 지원합니다.
+ AL2는 FIPS 140-2 인증을 획득했고 AL2023은 FIPS 140-3 인증을 획득했습니다. AL2023에서 FIPS 모드를 활성화하려면 Amazon EC2 인스턴스에 필요한 패키지를 설치하고 [AEnable FIPS Mode on AL2023](https://docs.aws.amazon.com/linux/al2023/ug/fips-mode.html)의 지침을 사용하여 구성 단계를 수행합니다. 자세한 내용은 [AL2023 FAQ](https://aws.amazon.com/linux/amazon-linux-2023/faqs)를 참조하세요.
+ Bottlerocket은 커널 및 사용자 공간 구성 요소가 FIPS 140-3 암호화 모듈 검증 프로그램에 제출된 암호화 모듈만 사용하도록 제한하는 FIPS 전용 변형을 제공합니다.

### EKS AMI 드라이버 및 버전 변경 로그
<a name="_eks_ami_driver_and_versions_changelog"></a>

모든 EKS AMI 구성 요소 및 해당 버전의 전체 목록은 GitHub의 [Amazon EKS AMI Release Notes](https://github.com/awslabs/amazon-eks-ami/releases)를 참조하세요.

# 최적화된 Amazon Linux AMI를 사용한 노드 생성
<a name="eks-optimized-ami"></a>

Amazon Elastic Kubernetes Service(Amazon EKS)는 Kubernetes 워커 노드 실행에 최적화된 특수 Amazon Machine Image(AMI)를 제공합니다. 이러한 EKS 최적화 Amazon Linux(AL) AMI는 클러스터 내에서 원활한 통합과 보안을 보장하기 위해 `kubelet`, AWS IAM Authenticator 및 `containerd`와 같은 필수 구성 요소로 사전 구성되어 있습니다. 이 가이드에서는 사용 가능한 AMI 버전을 자세히 설명하고 가속 컴퓨팅 및 Arm 기반 아키텍처에 대한 특수 옵션을 간략하게 설명합니다.

## 고려 사항
<a name="ami-considerations"></a>
+ 원하는 버전에 대한 탭을 선택하여 [Amazon Linux 보안 센터](https://alas.aws.amazon.com/)에서 Amazon Linux의 보안 또는 개인정보 보호 이벤트를 추적할 수 있습니다. 해당 RSS 피드를 구독할 수도 있습니다. 보안 및 프라이버시 이벤트에는 문제의 개요, 영향을 받는 패키지 및 인스턴스를 업데이트하여 문제를 해결하는 방법이 포함됩니다.
+ 가속 또는 Arm AMI를 배포하기 전에 [Amazon EKS 최적화 가속 Amazon Linux AMI](#gpu-ami) 및 [Amazon EKS 최적화 Arm Amazon Linux AMI](#arm-ami)의 정보를 검토하세요.
+ Amazon EC2 `P2` 인스턴스는 `NVIDIA` 드라이버 버전 470 이하가 필요하기 때문에 Amazon EKS에서 지원되지 않습니다.
+ 버전 `1.30` 이상의 클러스터부터 새로 생성되는 모든 관리형 노드 그룹은 자동으로 AL2023을 기본 노드 운영 체제로 사용합니다.

## Amazon EKS 최적화 가속 Amazon Linux AMI
<a name="gpu-ami"></a>

Amazon EKS 최적화 가속 Amazon Linux(AL) AMI는 표준 Amazon EKS 최적화 Amazon Linux AMI를 기반으로 빌드됩니다. 이는 GPU, [Inferentia](https://aws.amazon.com/machine-learning/inferentia/) 및 [Trainium](https://aws.amazon.com/machine-learning/trainium/) 기반 워크로드를 지원하기 위해 Amazon EKS 노드에 대한 선택적 이미지 역할을 하도록 구성되었습니다.

자세한 내용은 [GPU 인스턴스에 대해 EKS 최적화 가속 AMI 사용](ml-eks-optimized-ami.md) 섹션을 참조하세요.

## Amazon EKS 최적화 Arm Amazon Linux AMI
<a name="arm-ami"></a>

Arm 인스턴스는 웹 서버, 컨테이너식 마이크로서비스, 캐싱 플릿 및 분산 데이터 스토어와 같은 스케일 아웃 및 Arm 기반 애플리케이션에 상당한 비용 절감 효과를 제공합니다. 클러스터에 Arm 노드를 추가할 때 다음 고려 사항을 검토하세요.
+ 클러스터가 2020년 8월 17일 이전에 배포된 경우 중요한 클러스터 추가 기능 매니페스트의 일회성 업그레이드를 수행해야 합니다. 이는 Kubernetes가 클러스터에서 사용 중인 각 하드웨어 아키텍처에 대해 올바른 이미지를 가져올 수 있도록 하기 위한 것입니다. 클러스터 추가 기능을 업데이트하는 방법에 대한 자세한 내용은 [1단계: 업그레이드 준비](update-cluster.md#update-existing-cluster) 부분을 참조하세요. 2020년 8월 17일 또는 이후에 클러스터를 배포한 경우는 이미 CoreDNS, `kube-proxy` 및 Kubernetes용 Amazon VPC CNI 플러그인이 다중 아키텍처를 지원합니다.
+ Arm 노드에 배포된 애플리케이션은 Arm용으로 컴파일되어야 합니다.
+ 기존 클러스터에 배포된 DaemonSet이 있거나, Arm 노드도 배포할 새 클러스터에 DaemonSet을 배포하려는 경우 DaemonSet이 클러스터의 모든 하드웨어 아키텍처에서 실행될 수 있는지 확인합니다.
+ 동일한 클러스터에서 Arm 노드 그룹과 x86 노드 그룹을 실행할 수 있습니다. 이 경우에 다중 아키텍처 컨테이너 이미지를 Amazon Elastic Container Registry와 같은 컨테이너 리포지토리에 배포한 다음, 매니페스트에 노드 선택기를 추가하여 어떤 하드웨어에 포드를 배포할 수 있는지 Kubernetes가 알 수 있도록 해야 합니다. 자세한 내용은 *Amazon ECR 사용 설명서*의 [다중 아키텍처 이미지 푸시](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-multi-architecture-image.html) 및 [Amazon ECR용 다중 아키텍처 컨테이너 이미지 소개](https://aws.amazon.com/blogs/containers/introducing-multi-architecture-container-images-for-amazon-ecr) 블로그 게시물을 참조하세요.

## 추가 정보
<a name="linux-more-information"></a>

Amazon EKS 최적화 Amazon Linux AMI 사용에 대한 자세한 내용은 다음 섹션을 참조하세요.
+ 관리형 노드 그룹과 함께 Amazon Linux를 사용하려면 [관리형 노드 그룹을 사용한 노드 수명 주기 간소화](managed-node-groups.md) 섹션을 참조하세요.
+ 자체 관리형 Amazon Linux 노드를 시작하려면 [권장 Amazon Linux AMI ID 검색](retrieve-ami-id.md) 섹션을 참조하세요.
+ 버전 정보는 [Amazon Linux AMI 버전 정보 검색](eks-linux-ami-versions.md)를 참조하세요.
+ Amazon EKS 최적화 Amazon Linux AMI의 최신 ID를 검색하려면 [권장 Amazon Linux AMI ID 검색](retrieve-ami-id.md) 섹션을 참조하세요.
+ Amazon EKS 최적화 AMI를 빌드하는 데 사용되는 오픈 소스 스크립트는 [사용자 지정 ECS 최적화 Amazon Linux AMI 빌드](eks-ami-build-scripts.md) 섹션을 참조하세요.

# Amazon Linux 2에서 Amazon Linux 2023으로 업그레이드
<a name="al2023"></a>

**주의**  
Amazon EKS는 2025년 11월 26일 이후 더 이상 EKS 최적화 Amazon Linux 2(AL2) AMI 게시를 중지했습니다. Amazon EKS에 대한 AL2023 및 Bottlerocket 기반 AMI는 1.33 이상을 포함하여 지원되는 모든 Kubernetes 버전에서 사용할 수 있습니다.

AL2023은 클라우드 애플리케이션에 안전하고 안정적이면서 고성능의 환경을 제공하도록 설계된 Linux 기반 운영 체제입니다. Amazon Web Services의 차세대 Amazon Linux로, 지원되는 모든 Amazon EKS 버전에서 사용할 수 있습니다.

AL2023은 AL2에 비해 몇 가지 향상된 기능을 제공합니다. 전체 비교는 **Amazon Linux 2023 사용 설명서의 [AL2와 Amazon Linux 2023 비교](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2.html)를 참조하세요. AL2에서 여러 패키지가 추가, 업그레이드 및 제거되었습니다. 업그레이드하기 전에 AL2023 버전으로 애플리케이션을 테스트하는 것이 좋습니다. AL2023 패키지의 모든 변경 사항 목록은 **Amazon Linux 2023 릴리스 정보의 [Amazon Linux 2023의 패키지 변경 사항](https://docs.aws.amazon.com/linux/al2023/release-notes/compare-packages.html)을 참조하세요.

이러한 변경 사항 외에도 다음 사항을 숙지해야 합니다.
+ AL2023에 YAML 구성 스키마를 사용하는 새로운 노드 초기화 프로세스 `nodeadm`이 도입됩니다. 자체 관리형 노드 그룹 또는 시작 템플릿이 있는 AMI를 사용하는 경우 이제 새 노드 그룹을 생성할 때 추가 클러스터 메타데이터를 명시적으로 제공해야 합니다. 최소 필수 파라미터의 [예시](https://awslabs.github.io/amazon-eks-ami/nodeadm/)는 다음과 같으며, 여기에서 `apiServerEndpoint`, `certificateAuthority` 및 서비스 `cidr`가 필수입니다.

  ```
  ---
  apiVersion: node.eks.aws/v1alpha1
  kind: NodeConfig
  spec:
    cluster:
      name: my-cluster
      apiServerEndpoint: https://example.com
      certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
      cidr: 10.100.0.0/16
  ```

  AL2에서 이러한 파라미터의 메타데이터는 Amazon EKS `DescribeCluster` API 직접 호출에서 확인되었습니다. AL2023 버전에서는 대형 노드 스케일 업 도중 추가 API 직접 호출로 인해 제한이 발생할 위험이 있기 때문에 이러한 동작이 변경되었습니다. 시작 템플릿이 없는 관리형 노드 그룹을 사용하거나 Karpenter를 사용하는 경우 이 변경 사항이 영향을 미치지 않습니다. `certificateAuthority` 및 서비스 `cidr`에 대한 자세한 내용은 *Amazon EKS API 참조*의 [https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html](https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html)를 참조하세요.
+ AL2023의 경우 `nodeadm`은 각 노드에 대해 [https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/api/#nodeconfigspec](https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/api/#nodeconfigspec)을 사용하여 파라미터를 `kubelet`에 적용하도록 형식도 변경합니다. AL2에서는 `--kubelet-extra-args` 파라미터를 사용하여 이 작업을 수행했습니다. 이는 일반적으로 노드에 레이블과 테인트를 추가하는 데 사용됩니다. 아래 예제는 노드에 `maxPods` 및 `--node-labels`를 적용하는 방법을 보여줍니다.

  ```
  ---
  apiVersion: node.eks.aws/v1alpha1
  kind: NodeConfig
  spec:
    cluster:
      name: test-cluster
      apiServerEndpoint: https://example.com
      certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
      cidr: 10.100.0.0/16
    kubelet:
      config:
        maxPods: 110
      flags:
        - --node-labels=karpenter.sh/capacity-type=on-demand,karpenter.sh/nodepool=test
  ```
+ AL2023의 경우 Amazon VPC CNI 버전 `1.16.2` 이상이 필요합니다.
+ AL2023의 필수 기본값은 `IMDSv2`입니다. `IMDSv2`에는 보안 태세 개선에 도움이 되는 몇 가지 이점이 있습니다. 세션을 시작하려면 간단한 HTTP PUT 요청으로 비밀 토큰을 생성해야 하는 세션 지향 인증 방법을 사용합니다. 세션의 토큰은 1초에서 6시간 사이로 유효할 수 있습니다. `IMDSv1`에서 `IMDSv2`로 전환하는 방법에 대한 자세한 내용은 [인스턴스 메타데이터 서비스 버전 2 사용으로 전환](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-transition-to-version-2.html) 및 [Get the full benefits of IMDSv2 and disable IMDSv1 across your AWS infrastructure](https://aws.amazon.com/blogs/security/get-the-full-benefits-of-imdsv2-and-disable-imdsv1-across-your-aws-infrastructure)를 참조하세요. `IMDSv1`을 사용하려는 경우 인스턴스 메타데이터 옵션 시작 속성을 사용하여 설정을 수동으로 재정의하면 계속 사용할 수 있습니다.
**참고**  
AL2023을 사용하는 `IMDSv2`의 경우 관리형 노드 그룹의 기본 홉 수가 다를 수 있습니다.  
시작 템플릿을 사용하지 않을 때 기본값은 `1`로 설정됩니다. 따라서 컨테이너는 IMDS를 사용하여 노드의 자격 증명에 액세스할 수 없습니다. 노드의 자격 증명에 대한 컨테이너 액세스가 필요한 경우에도 [사용자 지정 Amazon EC2 시작 템플릿](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html)을 사용하면 가능합니다.
시작 템플릿에서 사용자 지정 AMI를 사용할 때 `HttpPutResponseHopLimit` 기본값은 `2`로 설정됩니다. 시작 템플릿에서 `HttpPutResponseHopLimit`를 수동으로 재정의할 수 있습니다.
또는 [Amazon EKS Pod Identity](pod-identities.md)를 사용하여 `IMDSv2` 대신 자격 증명을 제공할 수 있습니다.
+ AL2023에는 차세대 통합 제어 그룹 계층 구조(`cgroupv2`)가 있습니다. `cgroupv2`는 컨테이너 런타임을 구현하는 데 사용되며, `systemd`에 따라 사용됩니다. AL2023에 시스템이 `cgroupv1`을 사용하여 실행하도록 할 수 있는 코드가 포함되어 있지만 이 구성은 권장되거나 지원되지 않습니다. 이 구성은 Amazon Linux의 향후 메이저 릴리스에서 완전히 제거될 예정입니다.
+  `eksctl`이 AL2023을 지원하려면 `eksctl` 버전 `0.176.0` 이상이 필요합니다.

기존 관리형 노드 그룹의 경우 시작 템플릿을 사용하는 방식에 따라 인플레이스 업그레이드 또는 블루/그린 업그레이드를 수행할 수 있습니다.
+ 관리형 노드 그룹에서 사용자 지정 AMI를 사용하는 경우 시작 템플릿에서 AMI ID를 교체하여 인플레이스 업그레이드를 수행할 수 있습니다. 이 업그레이드 전략을 수행하기 전에 먼저 애플리케이션과 사용자 데이터가 AL2023으로 전송되는지 확인해야 합니다.
+ 표준 시작 템플릿 또는 AMI ID를 지정하지 않은 사용자 지정 시작 템플릿에서 관리형 노드 그룹을 사용하는 경우 블루/그린 전략을 사용하여 업그레이드해야 합니다. 블루/그린 업그레이드는 대체로 더 복잡하고 AMI 유형으로 AL2023을 지정하는 완전히 새로운 노드 그룹을 생성해야 합니다. 이후 AL2 노드 그룹의 모든 사용자 지정 데이터가 새 OS와 호환되도록 새 노드 그룹을 신중하게 구성해야 합니다. 애플리케이션에서 새 노드 그룹을 테스트하고 검증한 후에는 이전 노드 그룹에서 새 노드 그룹으로 포드를 마이그레이션할 수 있습니다. 마이그레이션이 완료되면 이전 노드 그룹을 삭제할 수 있습니다.

Karpenter를 사용 중이고 AL2023을 사용하려는 경우 `EC2NodeClass` `amiFamily` 필드를 AL2023으로 수정해야 합니다. 기본적으로 드리프트는 Karpenter에서 활성화됩니다. 따라서 `amiFamily` 필드가 변경되면 Karpenter에서 사용 가능할 때 워커 노드를 최신 AMI로 자동으로 업데이트합니다.

## nodeadm에 대한 추가 정보
<a name="_additional_information_about_nodeadm"></a>

EKS 최적화 Amazon Linux 2023 AMI를 사용하거나 공식 amazon-eks-ami GitHub 리포지토리에 제공된 Packer 스크립트를 통해 사용자 지정 EKS Amazon Linux 2023 AMI를 빌드하는 경우 EC2 사용자 데이터 내에서 또는 사용자 지정 AMI의 일부로 nodeadm init를 명시적으로 실행해서는 안 됩니다.

user-data에서 동적 NodeConfig를 생성하려면 해당 구성을 `/etc/eks/nodeadm.d`의 드롭인 yaml 또는 json 파일에 쓸 수 있습니다. 이러한 구성 파일은 nodeadm init가 부팅 프로세스의 후반부에서 자동으로 시작될 때 병합되어 노드에 적용됩니다. 예제:

```
cat > /etc/eks/nodeadm.d/additional-node-labels.yaml << EOF
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  kubelet:
    flags:
      - --node-labels=foo=bar
EOF
```

EKS 최적화 Amazon Linux 2023 AMI는 별도의 systemd 서비스를 통해 2단계로 nodeadm init를 자동으로 실행합니다(nodeadm-config는 사용자 데이터 실행 전에 실행되지만, nodeadm-run은 이후에 실행됨). nodeadm-config 서비스는 사용자 데이터가 실행되기 전에 Containered 및 kubelet에 대한 기준 구성을 설정합니다. nodeadm-run 서비스는 시스템 선택 대몬을 실행하고 사용자 데이터 실행 후 최종 구성을 완료합니다. nodeadm init 명령이 사용자 데이터 또는 사용자 지정 AMI를 통해 추가적으로 실행되는 경우 실행 순서에 대한 가정을 위반할 수 있으며 이로 인해 잘못 구성된 ENI와 같이 예상치 못한 결과로 이어질 수 있습니다.

# Amazon Linux AMI 버전 정보 검색
<a name="eks-linux-ami-versions"></a>

Amazon EKS 최적화 Amazon Linux AMI는 Kubernetes 버전과 AMI의 출시 날짜에 따라 다음 형식으로 버전이 지정됩니다.

```
k8s_major_version.k8s_minor_version.k8s_patch_version-release_date
```

각 AMI 릴리스에는 다양한 버전의 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/), Linux 커널 및 [containerd](https://containerd.io/).가 포함되어 있습니다. 가속 AMI에는 다양한 버전의 NVIDIA 드라이버도 포함되어 있습니다. 이 버전 정보는 GitHub의 [Changelog](https://github.com/awslabs/amazon-eks-ami/blob/main/CHANGELOG.md)에서 확인할 수 있습니다.

# 권장 Amazon Linux AMI ID 검색
<a name="retrieve-ami-id"></a>

노드를 배포할 때 사전 구축된 Amazon EKS 최적화 Amazon Machine Image(AMI)의 ID를 지정할 수 있습니다. 원하는 구성에 적합한 AMI ID를 검색하려면 AWS Systems Manager Parameter Store API를 쿼리합니다. 이 API를 사용하면 Amazon EKS 최적화 AMI ID를 수동으로 조회할 필요가 없습니다. 자세한 내용은 [GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html)를 참조하세요. Amazon EKS 최적화 AMI 메타데이터를 검색하려면 [IAM 보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)에 `ssm:GetParameter` IAM 권한이 있어야 합니다.

하위 파라미터 `image_id`를 사용하는 다음 명령을 사용하여 최신 권장 Amazon EKS에 최적화된 Amazon Linux AMI의 이미지 ID를 검색할 수 있습니다. 필요에 따라 명령을 다음과 같이 수정한 다음에 수정한 명령을 실행합니다.
+ `<kubernetes-version>`을 [Amazon EKS 지원 버전](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)으로 바꿉니다.
+ *ami-type*를 다음 옵션 중 하나로 변경합니다. Amazon EC2 인스턴스 유형에 대한 자세한 내용은 [Amazon EC2 인스턴스 유형](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)을 참조하세요.
  + Amazon Linux 2023(AL2023) `x86` 기반 인스턴스에는 *amazon-linux-2023/x86\$164/standard*를 사용합니다.
  + [AWS Graviton](https://aws.amazon.com/ec2/graviton/) 기반 인스턴스와 같은 AL2023 ARM 인스턴스에는 *amazon-linux-2023/arm64/standard*를 사용합니다.
  + 승인된 최신 AL2023 NVIDIA `x86` 기반 인스턴스에 *amazon-linux-2023/x86\$164/nvidia*를 사용합니다.
  + 승인된 최신 AL2023 NVIDIA `arm64` 기반 인스턴스에 *amazon-linux-2023/arm64/nvidia*를 사용합니다.
  + 최신 AL2023 [AWS Neuron](https://aws.amazon.com/machine-learning/neuron/) 인스턴스에는 *amazon-linux-2023/x86\$164/neuron*을 사용하세요.
+ `<region-code>`를 AMI ID를 원하는 [Amazon EKS 지원 AWS 리전](https://docs.aws.amazon.com/general/latest/gr/eks.html)으로 변경합니다.

```
aws ssm get-parameter --name /aws/service/eks/optimized-ami/<kubernetes-version>/<ami-type>/recommended/image_id \
    --region <region-code> --query "Parameter.Value" --output text
```

다음은 자리 표시자를 대체한 후의 명령 예제입니다.

```
aws ssm get-parameter --name /aws/service/eks/optimized-ami/1.31/amazon-linux-2023/x86_64/standard/recommended/image_id \
    --region us-west-2 --query "Parameter.Value" --output text
```

예제 출력은 다음과 같습니다.

```
ami-1234567890abcdef0
```

# 사용자 지정 ECS 최적화 Amazon Linux AMI 빌드
<a name="eks-ami-build-scripts"></a>

**주의**  
Amazon EKS는 2025년 11월 26일 이후 더 이상 EKS 최적화 Amazon Linux 2(AL2) AMI 게시를 중지했습니다. Amazon EKS에 대한 AL2023 및 Bottlerocket 기반 AMI는 1.33 이상을 포함하여 지원되는 모든 Kubernetes 버전에서 사용할 수 있습니다.

Amazon EKS는 `kubelet`에 대한 구성, AWS IAM Authenticator for Kubernetes를 보고 고유한 AL 기반 AMI를 처음부터 빌드하기 위해 사용할 수 있는 오픈 소스 빌드 스크립트를 [Amazon EKS AMI 빌드 사양](https://github.com/awslabs/amazon-eks-ami) 리포지토리에 제공합니다.

이 리포지토리에는 부팅 시 실행되는 특수 [AL2용 부트스트랩 스크립트](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh)와 [AL2023용 nodeadm 도구](https://awslabs.github.io/amazon-eks-ami/nodeadm/)가 포함되어 있습니다. 이러한 스크립트는 인스턴스의 인증서 데이터, 컨트롤 플레인 엔드포인트, 클러스터 이름 등을 구성합니다. 스크립트는 Amazon EKS 최적화 AMI 빌드의 신뢰할 수 있는 소스로 간주되므로 GitHub 리포지토리를 따라 AMI에 대한 변경을 모니터링할 수 있습니다.

EKS 최적화 AMI를 기반으로 사용자 지정 AMI를 빌드하는 경우 운영 체제 업그레이드(즉, `dnf upgrade`)를 실행하거나 EKS 최적화 AMI에 포함된 Kubernetes 또는 GPU 패키지를 업그레이드하는 것이 지원되지 않거나 권장되지 않습니다. 이 경우 구성 요소 호환성을 위반할 위험이 있기 때문입니다. EKS 최적화 AMI에 포함된 운영 체제 또는 패키지를 업그레이드하는 경우 프로덕션에 배포하기 전에 개발 또는 스테이징 환경에서 철저히 테스트하는 것이 좋습니다.

GPU 인스턴스에 대한 사용자 지정 AMI를 빌드하는 경우 실행할 각 인스턴스 유형 생성 및 패밀리에 대해 별도의 사용자 지정 AMI를 빌드하는 것이 좋습니다. EKS 최적화 가속 AMI는 기본 인스턴스 유형 생성 및 패밀리를 기반으로 런타임에 드라이버와 패키지를 선택적으로 설치합니다. 자세한 내용은 EKS AMI 스크립트에서 [installation](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2023/provisioners/install-nvidia-driver.sh) 및 [runtime](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2023/runtime/gpu/nvidia-kmod-load.sh)을 참조하세요.

## 사전 조건
<a name="_prerequisites"></a>
+  [AWS CLI 설치](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) 
+  [HashiCorp Packer v1.9.4\$1 설치](https://developer.hashicorp.com/packer/downloads) 
+  [GNU Make 설치](https://www.gnu.org/software/make/) 

## 빠른 시작
<a name="_quickstart"></a>

이 빠른 시작에서는 AWS 계정에서 사용자 지정 AMI를 생성하는 명령을 보여줍니다. AMI를 사용자 지정하는 데 사용할 수 있는 구성에 대한 자세한 내용은 [Amazon Linux 2023](https://awslabs.github.io/amazon-eks-ami/usage/al2023/) 페이지의 템플릿 변수를 참조하세요.

### 사전 조건
<a name="_prerequisites_2"></a>

필요한 [Amazon 플러그인](https://developer.hashicorp.com/packer/integrations/hashicorp/amazon)을 설치합니다. 예제:

```
packer plugins install github.com/hashicorp/amazon
```

### 1단계. 환경 설정
<a name="_step_1_setup_your_environment"></a>

공식 Amazon EKS AMI 리포지토리를 복제하거나 포크합니다. 예제:

```
git clone https://github.com/awslabs/amazon-eks-ami.git
cd amazon-eks-ami
```

Packer가 설치되어 있는지 확인합니다.

```
packer --version
```

### 2단계. 사용자 지정 AMI를 생성
<a name="_step_2_create_a_custom_ami"></a>

다음은 다양한 사용자 지정 AMI에 대한 명령의 예입니다.

 **기본 NVIDIA AL2 AMI:** 

```
make k8s=1.31 os_distro=al2 \
  enable_accelerator=nvidia \
  nvidia_driver_major_version=560 \
  enable_efa=true
```

 **기본 NVIDIA AL2023 AMI:** 

```
make k8s=1.31 os_distro=al2023 \
  enable_accelerator=nvidia \
  nvidia_driver_major_version=560 \
  enable_efa=true
```

 **STIG 준수 Neuron AL2023 AMI:** 

```
make k8s=1.31 os_distro=al2023 \
  enable_accelerator=neuron \
  enable_fips=true \
  source_ami_id=ami-0abcd1234efgh5678 \
  kms_key_id=alias/aws-stig
```

이러한 명령을 실행하면 Packer가 다음을 수행합니다. \$1 임시 Amazon EC2 인스턴스를 시작합니다. \$1 Kubernetes 구성 요소, 드라이버 및 구성을 설치합니다. \$1 AWS 계정에서 AMI를 생성합니다.

예상되는 출력은 다음과 같아야 합니다.

```
==> Wait completed after 8 minutes 42 seconds

==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
us-west-2: ami-0e139a4b1a7a9a3e9

--> amazon-ebs: AMIs were created:
us-west-2: ami-0e139a4b1a7a9a3e9

--> amazon-ebs: AMIs were created:
us-west-2: ami-0e139a4b1a7a9a3e9
```

### 3단계. 기본값 보기
<a name="_step_3_view_default_values"></a>

기본값과 추가 옵션을 보려면 다음 명령을 실행합니다.

```
make help
```

# 최적화된 Bottlerocket AMI를 사용한 노드 생성
<a name="eks-optimized-ami-bottlerocket"></a>

 [Bottlerocket](https://aws.amazon.com/bottlerocket/)은 AWS에서 후원하고 지원하는 오픈 소스 Linux 배포판입니다. Bottlerocket은 컨테이너 워크로드 호스팅용으로 특별히 설계되었습니다. Bottlerocket을 사용하면 컨테이너 인프라 업데이트를 자동화하여 컨테이너화된 배포의 가용성을 개선하고 운영 비용을 절감할 수 있습니다. Bottlerocket에는 컨테이너를 실행하는 데 필수적인 소프트웨어만 포함되어 있어 리소스 사용량이 개선되고 보안 위협과 관리 오버헤드가 감소합니다. Bottlerocket AMI에는 `containerd`, `kubelet` 및 AWS IAM 인증자가 포함됩니다. Bottlerocket은 관리형 노드 그룹과 자체 관리형 노드 외에도 [Karpenter](https://karpenter.sh/)에서 지원됩니다.

## 장점
<a name="bottlerocket-advantages"></a>

Amazon EKS 클러스터와 함께 Bottlerocket을 사용하면 다음과 같은 이점이 있습니다.
+  **낮은 운영 비용과 낮은 관리 복잡성으로 가동 시간 향상** - Bottlerocket은 다른 Linux 배포판보다 리소스 사용량이 적고 부팅 시간이 짧으며 보안 위협에 덜 취약합니다. Bottlerocket은 사용량이 적어 스토리지, 컴퓨팅 및 네트워킹 리소스를 덜 사용하므로 비용을 절감하는 데 도움이 됩니다.
+  **자동 OS 업데이트로 보안 강화** – Bottlerocket 업데이트는 필요한 경우 롤백할 수 있는 단일 단위로 적용됩니다. 이렇게 하면 시스템을 사용 불가 상태로 둘 수 있는 손상되거나 실패한 업데이트의 위험이 제거됩니다. Bottlerocket을 사용하면 보안 업데이트를 사용할 수 있는 즉시 중단을 최소화하는 방식으로 자동 적용하고 장애 발생 시 롤백할 수 있습니다.
+  **프리미엄 지원** – AWS에서 제공하는 Amazon EC2 기반 Bottlerocket 빌드에는 Amazon EC2, Amazon EKS, Amazon ECR 등의 AWS 서비스에도 적용되는 동일한 AWS Support 플랜이 적용됩니다.

## 고려 사항
<a name="bottlerocket-considerations"></a>

AMI 유형에 Bottlerocket을 사용할 때 다음 사항을 고려하세요.
+ Bottlerocket은 `x86_64` 및 `arm64` 프로세서가 있는 Amazon EC2 인스턴스를 지원합니다.
+ Bottlerocket은 GPU가 있는 Amazon EC2 인스턴스를 지원합니다. 자세한 내용은 [GPU 인스턴스에 대해 EKS 최적화 가속 AMI 사용](ml-eks-optimized-ami.md) 섹션을 참조하세요.
+ Bottlerocket 이미지에는 SSH 서버 또는 쉘이 포함되지 않습니다. 대역 외 액세스 방법을 사용하여 SSH를 허용할 수 있습니다. 이 접근 방식을 통해 관리 컨테이너를 활성화하고 사용자 데이터와 함께 일부 부트스트래핑 구성 단계를 전달할 수 있습니다. 자세한 내용은 GitHub의 [Bottlerocket OS](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md)에서 다음 섹션을 참조하세요.
  +  [탐색](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md#exploration) 
  +  [관리자 컨테이너](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md#admin-container) 
  +  [Kubernetes 설정](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md#kubernetes-settings) 
+ Bottlerocket은 다음과 같은 여러 컨테이너 유형을 사용합니다.
  + 기본적으로 [제어 컨테이너](https://github.com/bottlerocket-os/bottlerocket-control-container)는 활성화되어 있습니다. 이 컨테이너는 Amazon EC2 Bottlerocket 인스턴스에서 명령을 실행하거나 쉘 세션을 시작하는 데 사용할 수 있는 [AWS Systems Manager 에이전트](https://github.com/aws/amazon-ssm-agent)를 실행합니다. 자세한 내용은 *AWS 사용 설명서*의 [세션 관리자 설정](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started.html)을 참조하세요.
  + 노드 그룹을 생성할 때 SSH 키가 제공되는 경우 관리 컨테이너가 활성화됩니다. 개발 및 테스트 시나리오에만 관리 컨테이너를 사용하는 것이 좋습니다. 프로덕션 환경에서는 이를 사용하지 않는 것이 좋습니다. 자세한 내용은 GitHub의 [Admin container](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md#admin-container)를 참조하세요.

## 추가 정보
<a name="bottlerocket-more-information"></a>

Amazon EKS 최적화 Bottlerocket AMI 사용에 대한 자세한 내용은 다음 섹션을 참조하세요.
+ Bottlerocket에 대한 자세한 내용은 [Bottlerocket 설명서](https://bottlerocket.dev/en/)를 참조하세요.
+ 버전 정보 리소스는 [Bottlerocket AMI 버전 정보 검색](eks-ami-versions-bottlerocket.md) 섹션을 참조하세요.
+ 관리형 노드 그룹과 함께 Bottlerocket을 사용하려면 [관리형 노드 그룹을 사용한 노드 수명 주기 간소화](managed-node-groups.md) 섹션을 참조하세요.
+ 자체 관리형 Bottlerocket 노드를 시작하려면 [자체 관리형 Bottlerocket 노드 생성](launch-node-bottlerocket.md) 섹션을 참조하세요.
+ Amazon EKS 최적화 Bottlerocket AMI의 최신 ID를 검색하려면 [권장 Bottlerocket AMI ID 검색](retrieve-ami-id-bottlerocket.md) 섹션을 참조하세요.
+ 규정 준수 지원에 대한 자세한 내용은 [Bottlerocket으로 규정 준수 요구 사항 충족](bottlerocket-compliance-support.md) 섹션을 참조하세요.

# Bottlerocket AMI 버전 정보 검색
<a name="eks-ami-versions-bottlerocket"></a>

각 Bottlerocket AMI 릴리스에는 다양한 버전의 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/), Bottlerocket 커널, [containerd](https://containerd.io/)가 포함되어 있습니다. 가속화 AMI 변형에는 다양한 버전의 NVIDIA 드라이버가 포함되어 있습니다. 이 버전 정보는 *Bottlerocket 설명서*의 [OS](https://bottlerocket.dev/en/os/) 주제에서 확인할 수 있습니다. 이 페이지에서 해당 **버전 정보 하위 주제로 이동합니다.

*Bottlerocket 설명서*가 GitHub에서 제공되는 버전보다 뒤처지는 경우가 있습니다. 최신 버전에 대한 변경 사항 목록은 GitHub의 [releases](https://github.com/bottlerocket-os/bottlerocket/releases)에서 확인할 수 있습니다.

# 권장 Bottlerocket AMI ID 검색
<a name="retrieve-ami-id-bottlerocket"></a>

노드를 배포할 때 사전 구축된 Amazon EKS 최적화 Amazon Machine Image(AMI)의 ID를 지정할 수 있습니다. 원하는 구성에 적합한 AMI ID를 검색하려면 AWS Systems Manager Parameter Store API를 쿼리합니다. 이 API를 사용하면 Amazon EKS 최적화 AMI ID를 수동으로 조회할 필요가 없습니다. 자세한 내용은 [GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html)를 참조하세요. Amazon EKS 최적화 AMI 메타데이터를 검색하려면 [IAM 보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)에 `ssm:GetParameter` IAM 권한이 있어야 합니다.

하위 파라미터 `image_id`를 사용하는 다음 AWS CLI 명령을 사용하여 최신 권장 Amazon EKS 최적화 Bottlerocket AMI의 이미지 ID를 검색할 수 있습니다. 필요에 따라 명령을 다음과 같이 수정한 다음에 수정한 명령을 실행합니다.
+ [kubernetes-version](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html)을 지원되는 *플랫폼 버전*으로 바꿉니다.
+ *-flavor*를 다음 옵션 중 하나로 변경합니다.
  + GPU가 없는 변형의 경우 *-flavor*를 제거합니다.
  + GPU 지원 변형에 *-nvidia*를 사용합니다.
  + FIPS 지원 변형에 *-fips*를 사용합니다.
+ *아키텍처*를 다음 옵션 중 하나로 변경합니다.
  + *x86\$164*를 `x86` 기반 인스턴스에 사용합니다.
  + *arm64*를 ARM 인스턴스에 사용합니다.
+ *region-code*를 AMI ID를 원하는 [Amazon EKS 지원 AWS 리전](https://docs.aws.amazon.com/general/latest/gr/eks.html)으로 바꿉니다.

```
aws ssm get-parameter --name /aws/service/bottlerocket/aws-k8s-kubernetes-version-flavor/architecture/latest/image_id \
    --region region-code --query "Parameter.Value" --output text
```

다음은 자리 표시자를 대체한 후의 명령 예제입니다.

```
aws ssm get-parameter --name /aws/service/bottlerocket/aws-k8s-1.31/x86_64/latest/image_id \
    --region us-west-2 --query "Parameter.Value" --output text
```

예제 출력은 다음과 같습니다.

```
ami-1234567890abcdef0
```

# Bottlerocket으로 규정 준수 요구 사항 충족
<a name="bottlerocket-compliance-support"></a>

Bottlerocket은 다양한 조직에서 정의한 권장 사항을 준수합니다.
+ Bottlerocket에 대해 정의된 [CIS Benchmark](https://www.cisecurity.org/benchmark/bottlerocket)가 있습니다. 기본 구성에서 Bottlerocket 이미지에는 CIS 레벨 1 구성 프로필에 필요한 대부분의 컨트롤이 있습니다. CIS 레벨 2 구성 프로필에 필요한 컨트롤을 구현할 수 있습니다. 자세한 내용은 AWS 블로그의 [CIS Benchmark에 대해 Amazon EKS 최적화 Bottlerocket AMI 검증](https://aws.amazon.com/blogs/containers/validating-amazon-eks-optimized-bottlerocket-ami-against-the-cis-benchmark)을 참조하세요.
+ 최적화된 기능 세트와 감소된 공격 표면은 Bottlerocket 인스턴스가 PCI DSS 요구 사항을 충족하는 데 필요한 구성이 더 적다는 것을 의미합니다. [Bottlerocket용 CIS Benchmark](https://www.cisecurity.org/benchmark/bottlerocket)는 지침 강화를 위한 훌륭한 리소스이며 PCI DSS 요구 사항 2.2에 따른 보안 구성 표준에 대한 요구 사항을 지원합니다. 또한 [Fluent Bit](https://opensearch.org/blog/technical-post/2022/07/bottlerocket-k8s-fluent-bit/)를 활용하여 PCI DSS 요구 사항 10.2에 따라 운영 체제 수준 감사 로깅에 대한 요구 사항을 지원할 수 있습니다. AWS는 PCI DSS 요구 사항 6.2(v3.2.1의 경우) 및 요구 사항 6.3.3(v4.0의 경우)을 충족할 수 있도록 새로운(패치된) Bottlerocket 인스턴스를 주기적으로 게시합니다.
+ Bottlerocket은 Amazon EC2 및 Amazon EKS 모두에 대해 규제된 워크로드와 함께 사용하도록 승인된 HIPAA 적격 기능입니다. 자세한 내용은 [HIPAA 적격 서비스 참조](https://aws.amazon.com/compliance/hipaa-eligible-services-reference/)에서 확인하세요.
+ FIPS 140-3 검증 암호화 모듈을 사용하도록 사전 구성된 Bottlerocket AMI를 사용할 수 있습니다. 여기에는 Amazon Linux 2023 Kernel Crypto API 암호화 모듈과 AWS-LC 암호화 모듈이 포함됩니다. 자세한 내용은 [Bottlerocket FIPS AMI로 워커 노드의 FIPS 지원 제공](bottlerocket-fips-amis.md) 섹션을 참조하세요.

# Bottlerocket FIPS AMI로 워커 노드의 FIPS 지원 제공
<a name="bottlerocket-fips-amis"></a>

FIPS(Federal Information Processing Standard) Publication 140-3은 미국 및 캐나다 정부 보안 표준으로, 기밀 정보를 보호하는 암호 모듈의 보안 요건을 규정하고 있습니다. Bottlerocket은 FIPS 커널이 포함된 AMI를 제공하여 FIPS를 보다 쉽게 준수할 수 있도록 합니다.

이러한 AMI는 FIPS 140-3 검증 암호화 모듈을 사용하도록 사전 구성되어 있습니다. 여기에는 Amazon Linux 2023 Kernel Crypto API 암호화 모듈과 AWS-LC 암호화 모듈이 포함됩니다.

Bottlerocket FIPS AMI를 사용하면 워커 노드가 ‘FIPS 지원’ 상태가 되지만 자동으로 ‘FIPS 준수’ 상태가 되는 것은 아닙니다. 자세한 내용은 [FIPS(Federal Information Processing Standard) 140-3](https://aws.amazon.com/compliance/fips/)을 참조하세요.

## 고려 사항
<a name="_considerations"></a>
+ 클러스터에서 격리된 서브넷을 사용하는 경우 Amazon ECR FIPS 엔드포인트에 액세스하지 못해 노드 부트스트랩이 실패할 수 있습니다. 네트워크 구성이 필요한 FIPS 엔드포인트에 대한 액세스를 허용하는지 확인합니다. 자세한 내용은 * AWS PrivateLink 가이드*의 [Access a resource through a resource VPC endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/use-resource-endpoint.html)를 참조하세요.
+ 클러스터에서 [PrivateLink](vpc-interface-endpoints.md)가 있는 서브넷을 사용하는 경우 PrivateLink를 통해 Amazon ECR FIPS 엔드포인트를 사용할 수 없으므로 이미지 풀이 실패합니다.

## Bottlerocket FIPS AMI로 관리형 노드 그룹 생성
<a name="_create_a_managed_node_group_with_a_bottlerocket_fips_ami"></a>

Bottlerocket FIPS AMI는 워크로드를 지원하기 위해 4개의 변형으로 제공됩니다.
+  `BOTTLEROCKET_x86_64_FIPS` 
+  `BOTTLEROCKET_ARM_64_FIPS` 
+  `BOTTLEROCKET_x86_64_NVIDIA_FIPS` 
+  `BOTTLEROCKET_ARM_64_NVIDIA_FIPS` 

Bottlerocket FIPS AMI로 관리형 노드 그룹을 생성하려면 생성 프로세스 중 해당 AMI 유형을 선택합니다. 자세한 내용은 [클러스터에 대한 관리형 노드 그룹 생성](create-managed-node-group.md) 섹션을 참조하세요.

FIPS 지원 변형 선택에 대한 자세한 내용은 [권장 Bottlerocket AMI ID 검색](retrieve-ami-id-bottlerocket.md) 섹션을 참조하세요.

## 지원되지 않는 AWS 리전에 대해 FIPS 엔드포인트 비활성화
<a name="disable_the_fips_endpoint_for_non_supported_shared_aws_regions"></a>

Bottlerocket FIPS AMI는 AWS GovCloud(미국) 리전을 포함하여 미국에서 직접 지원됩니다. AMI를 사용할 수 있지만 직접 지원되지 않는 AWS 리전의 경우 시작 템플릿으로 관리형 노드 그룹을 생성하여 AMI를 계속 사용할 수 있습니다.

Bottlerocket FIPS AMI는 부트스트랩 중에 일반적으로 미국 이외 리전에서는 사용할 수 없는 Amazon ECR FIPS 엔드포인트를 사용합니다. Amazon ECR FIPS 엔드포인트를 사용할 수 없는 AWS 리전에서 FIPS 커널에 AMI를 사용하려면 다음 단계를 수행하여 FIPS 엔드포인트를 비활성화하세요.

1. 다음 콘텐츠로 새 구성 파일을 생성하거나 기존 구성 파일에 콘텐츠를 통합합니다.

```
[default]
use_fips_endpoint=false
```

1. 파일 콘텐츠를 Base64 형식으로 인코딩합니다.

1. 시작 템플릿의 `UserData`에 TOML 형식을 사용하여 인코딩된 다음 문자열을 추가합니다.

```
[settings.aws]
config = "<your-base64-encoded-string>"
```

기타 설정은 GitHub의 Bottlerocket [설정 설명](https://github.com/bottlerocket-os/bottlerocket?tab=readme-ov-file#description-of-settings)을 참조하세요.

다음은 시작 템플릿의 `UserData` 예입니다.

```
[settings]
motd = "Hello from eksctl!"
[settings.aws]
config = "W2RlZmF1bHRdCnVzZV9maXBzX2VuZHBvaW50PWZhbHNlCg==" # Base64-encoded string.
[settings.kubernetes]
api-server = "<api-server-endpoint>"
cluster-certificate = "<cluster-certificate-authority>"
cluster-name = "<cluster-name>"
...<other-settings>
```

사용자 데이터로 시작 템플릿을 만드는 방법에 대한 자세한 내용은 [시작 템플릿을 사용한 관리형 노드 사용자 지정](launch-templates.md) 섹션을 참조하세요.

# 최적화된 Ubuntu Linux AMI를 사용한 노드 생성
<a name="eks-partner-amis"></a>

Canonical은 Amazon EKS와 협력하여 클러스터에서 사용할 수 있는 노드 AMI를 만들었습니다.

 [Canonical](https://www.canonical.com/)은 특별히 구축된 Kubernetes Node OS 이미지를 제공합니다. 이 최소화된 Ubuntu 이미지는 Amazon EKS에 최적화되어 있으며 AWS와 공동 개발한 사용자 지정 AWS 커널을 포함합니다. 자세한 내용은 [Amazon Elastic Kubernetes Service(EKS)의 Ubuntu](https://cloud-images.ubuntu.com/aws-eks/) 및 [자체 관리형 Ubuntu Linux 노드 생성](launch-node-ubuntu.md) 섹션을 참조하세요. 지원에 대한 자세한 내용은 * AWS 프리미엄 서포트 FAQ*의 [서드 파티 소프트웨어](https://aws.amazon.com/premiumsupport/faqs/#Third-party_software) 섹션을 참조하세요.

# 최적화된 Windows AMI를 사용한 노드 생성
<a name="eks-optimized-windows-ami"></a>

Windows Amazon EKS 최적화 AMI는 Windows Server 2019, Windows Server 2022, Windows Server 2025를 기반으로 빌드되었습니다. Amazon EKS 노드의 기본 이미지 역할을 하도록 구성되었습니다. 기본적으로 AMI에는 다음 구성 요소가 포함됩니다.
+  [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 
+  [kube-proxy](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/) 
+  [AWS Kubernetes용 IAM 인증자](https://github.com/kubernetes-sigs/aws-iam-authenticator) 
+  [csi-proxy](https://github.com/kubernetes-csi/csi-proxy) 
+  [containerd](https://containerd.io/) 

**참고**  
[Microsoft 보안 업데이트 설명서](https://portal.msrc.microsoft.com/en-us/security-guidance)를 사용하여 Windows Server의 보안 또는 개인 정보 보호 이벤트를 추적할 수 있습니다.

Amazon ECS는 Windows 컨테이너에 최적화된 AMI를 다음 변형된 형태로 제공합니다.
+ Amazon EKS 최적화 Windows Server 2019 Core AMI
+ Amazon EKS 최적화 Windows Server 2019 Full AMI
+ Amazon EKS 최적화 Windows Server 2022 Core AMI
+ Amazon EKS 최적화 Windows Server 2022 Full AMI
+ Amazon EKS 최적화 Windows Server 2025 Core AMI
+ Amazon EKS 최적화 Windows Server 2025 Full AMI

**중요**  
Amazon ECS 최적화 Windows Server 20H2 Core AMI는 사용되지 않습니다. 이 AMI의 새 버전은 릴리스되지 않습니다.
항상 최신 보안 업데이트를 기본으로 유지할 수 있도록 Amazon EKS는 지난 4개월 동안 최적화 Windows AMI를 유지합니다. 각각의 새 AMI는 최초 릴리스 시점부터 4개월 동안 사용할 수 있습니다. 이 기간이 지나면 오래된 AMI는 프라이빗으로 전환되어 더 이상 액세스할 수 없습니다. 보안 취약성을 방지하고 지원 수명이 다한 오래된 AMI에 대한 액세스를 상실하지 않도록 최신 AMI를 사용하는 것이 좋습니다. 프라이빗으로 설정된 AMI에 대한 액세스 제공을 보장할 수는 없지만 AWS Support에 티켓을 제출하여 액세스를 요청할 수 있습니다.

## 출시 일정
<a name="windows-ami-release-calendar"></a>

다음 표에는 Amazon EKS의 Windows 버전 릴리스 및 지원 종료 날짜가 나와 있습니다. 종료 날짜가 비어 있으면 버전이 계속 지원되는 것입니다.


| Windows 버전 | Amazon EKS 릴리스 | Amazon EKS 지원 종료 | 
| --- | --- | --- | 
|  Windows Server 2025 Core  |  2026년 1월 27일  |  | 
|  Windows Server 2025 Full  |  2026년 1월 27일  |  | 
|  Windows Server 2022 Core  |  10/17/2022  |  | 
|  Windows Server 2022 Full  |  10/17/2022  |  | 
|  Windows Server 20H2 Core  |  2021년 8월 12일  |  2022년 8월 9일  | 
|  Windows Server 2004 Core  |  8/19/2020  |  12/14/2021  | 
|  Windows Server 2019 Core  |  10/7/2019  |  | 
|  Windows Server 2019 Full  |  10/7/2019  |  | 
|  Windows Server 1909 Core  |  10/7/2019  |  12/8/2020  | 

## 부트스트랩 스크립트 구성 파라미터
<a name="bootstrap-script-configuration-parameters"></a>

Windows 노드를 생성할 때 노드에 다양한 파라미터를 구성할 수 있는 스크립트가 있습니다. 설정에 따라 이 스크립트는 `C:\Program Files\Amazon\EKS\Start-EKSBootstrap.ps1`과 유사한 위치의 노드에서 찾을 수 있습니다. 사용자 지정 파라미터 값을 부트스트랩 스크립트의 인수로 지정하여 설정할 수 있습니다. 예를 들어, 시작 템플릿에서 사용자 데이터를 업데이트할 수 있습니다. 자세한 내용은 [Amazon EC2 사용자 데이터](launch-templates.md#launch-template-user-data) 섹션을 참조하세요.

이 스크립트에는 다음 명령줄 파라미터가 포함되어 있습니다.
+  `-EKSClusterName` - 조인할 이 작업자 노드의 Amazon EKS 클러스터 이름을 지정합니다.
+  `-KubeletExtraArgs` - `kubelet`에 대한 추가 인수를 지정합니다(선택사항).
+  `-KubeProxyExtraArgs` - `kube-proxy`에 대한 추가 인수를 지정합니다(선택사항).
+  `-APIServerEndpoint` - Amazon EKS 클러스터 API 서버 엔드포인트를 지정합니다(선택사항). `-Base64ClusterCA`와 함께 사용하는 경우에만 유효합니다. `Get-EKSCluster`.
+  `-Base64ClusterCA` - base64로 인코딩된 클러스터 CA 콘텐츠를 지정합니다(선택사항). `-APIServerEndpoint`와 함께 사용하는 경우에만 유효합니다. `Get-EKSCluster` 직접 호출을 무시합니다.
+  `-DNSClusterIP` - 클러스터 내의 DNS 쿼리에 사용할 IP 주소를 재정의합니다(선택사항). 기본 인터페이스의 IP 주소에 따라 기본값은 `10.100.0.10` 또는 `172.20.0.10`입니다.
+  `-ServiceCIDR` – 클러스터 서비스가 처리되는 Kubernetes 서비스 IP 주소 범위를 재정의합니다. 기본 인터페이스의 IP 주소에 따라 기본값은 `172.20.0.0/16` 또는 `10.100.0.0/16`입니다.
+  `-ExcludedSnatCIDRs` – SNAT(Source Network Address Translation)에서 제외할 `IPv4` CIDR 목록입니다. 즉, VPC 주소 지정이 가능한 포드 프라이빗 IP는 아웃바운드 트래픽에 대한 인스턴스 ENI의 기본 `IPv4` 주소의 IP 주소로 변환되지 않습니다. 기본적으로 Amazon EKS Windows 노드에 대한 VPC의 `IPv4` CIDR이 추가됩니다. 이 파라미터에 CIDR을 지정하면 지정된 CIDR도 추가로 제외됩니다. 자세한 내용은 [포드에 대한 아웃바운드 인터넷 액세스 활성화](external-snat.md) 섹션을 참조하세요.

명령줄 파라미터 외에도 일부 환경 변수 파라미터를 지정할 수도 있습니다. 명령줄 파라미터를 지정하는 경우 해당 파라미터가 해당 환경 변수보다 우선시됩니다. 부트스트랩 스크립트는 컴퓨터 범위 변수만 읽으므로 환경 변수는 컴퓨터(또는 시스템) 범위로 정의해야 합니다.

이 스크립트는 다음과 같은 환경 변수를 고려합니다.
+  `SERVICE_IPV4_CIDR`— 정의는 `ServiceCIDR` 명령줄 파라미터를 참조하세요.
+  `EXCLUDED_SNAT_CIDRS`— 쉼표로 구분된 문자열이어야 합니다. 정의는 `ExcludedSnatCIDRs` 명령줄 파라미터를 참조하세요.

### gMSA 인증 지원
<a name="ad-and-gmsa-support"></a>

Amazon EKS Windows 포드는 다양한 유형의 그룹 관리형 서비스 계정(gMSA) 인증을 허용합니다.
+ Amazon EKS는 인증을 위해 Active Directory 도메인 ID를 지원합니다. 도메인 조인 gMSA에 대한 자세한 내용은 AWS 블로그에서 [Amazon EKS Windowspods의 Windows 인증](https://aws.amazon.com/blogs/containers/windows-authentication-on-amazon-eks-windows-pods)을 참조하세요.
+ Amazon EKS는 도메인에 가입되지 않은 Windows 노드가 이식 가능한 사용자 ID로 gMSA ID를 검색할 수 있도록 하는 플러그인을 제공합니다. 도메인이 없는 gMSA에 대한 자세한 내용은 AWS 블로그에서 [Amazon EKS Windowspod용 도메인이 없는 Windows 인증](https://aws.amazon.com/blogs/containers/domainless-windows-authentication-for-amazon-eks-windows-pods)을 참조하세요.

## 캐시된 컨테이너 이미지
<a name="windows-cached-container-images"></a>

Amazon EKS Windows 최적화 AMI에는 `containerd` 런타임에 대해 캐시된 특정 컨테이너 이미지가 있습니다. 컨테이너 이미지는 Amazon 관리형 빌드 구성 요소를 사용하여 사용자 지정 AMI를 빌드할 때 캐시됩니다. 자세한 내용은 [Amazon 관리형 빌드 구성 요소 사용](eks-custom-ami-windows.md#custom-windows-ami-build-component) 섹션을 참조하세요.

다음 캐시된 컨테이너 이미지는 `containerd` 런타임용입니다.
+  `amazonaws.com/eks/pause-windows` 
+  `mcr.microsoft.com/windows/nanoserver` 
+  `mcr.microsoft.com/windows/servercore` 

## 추가 정보
<a name="windows-more-information"></a>

Amazon EKS 최적화 Windows AMI 사용에 대한 자세한 내용은 다음 섹션을 참조하세요.
+ Amazon EKS 최적화 가속 Windows AMI에서 워크로드를 실행하는 방법에 대한 자세한 내용은 [GPU 가속 컨테이너 실행(Windows on EC2 G-Series)](ml-eks-windows-optimized-ami.md) 섹션을 참조하세요.
+ 관리형 노드 그룹과 함께 Windows를 사용하려면 [관리형 노드 그룹을 사용한 노드 수명 주기 간소화](managed-node-groups.md) 섹션을 참조하세요.
+ 자체 관리형 Windows 노드를 시작하려면 [자체 관리형 Microsoft Windows 노드 생성](launch-windows-workers.md) 섹션을 참조하세요.
+ 버전 정보는 [Windows AMI 버전 정보 검색](eks-ami-versions-windows.md)를 참조하세요.
+ Amazon EKS 최적화 Windows AMI의 최신 ID를 검색하려면 [권장 Microsoft Windows AMI ID 검색](retrieve-windows-ami-id.md) 섹션을 참조하세요.
+ Amazon EC2 Image Builder를 사용하여 사용자 지정 Amazon EKS 최적화 Windows AMI를 생성하려면 [Image Builder를 사용한 사용자 지정 Windows AMI 구축](eks-custom-ami-windows.md) 섹션을 참조하세요.
+ 모범 사례는 *EKS 모범 사례 가이드*에서 [Amazon EKS에 최적화된 Windows AMI 관리](https://aws.github.io/aws-eks-best-practices/windows/docs/ami/)를 참조하세요.

# `eksctl`을 사용한 자체 관리형 Windows Server 2022 노드 생성
<a name="self-managed-windows-server-2022"></a>

자체 관리형 Windows Server 2022 노드를 생성하기 위한 참조로 다음 `test-windows-2022.yaml`을 사용할 수 있습니다. 모든 *예제 값*을 자신의 값으로 바꾸세요.

**참고**  
자체 관리형 Windows Server 2022 노드를 실행하려면 `eksctl` 버전 [0.116.0](https://github.com/weaveworks/eksctl/releases/tag/v0.116.0) 이상을 사용해야 합니다.

```
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: windows-2022-cluster
  region: region-code
  version: '1.35'

nodeGroups:
  - name: windows-ng
    instanceType: m5.2xlarge
    amiFamily: WindowsServer2022FullContainer
    volumeSize: 100
    minSize: 2
    maxSize: 3
  - name: linux-ng
    amiFamily: AmazonLinux2
    minSize: 2
    maxSize: 3
```

그러면 다음 명령을 사용하여 노드 그룹을 생성할 수 있습니다.

```
eksctl create cluster -f test-windows-2022.yaml
```

# Windows AMI 버전 정보 검색
<a name="eks-ami-versions-windows"></a>

이 주제에서는 Amazon EKS 최적화 Windows AMI의 버전과 해당하는 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/), [containerd](https://containerd.io/) 및 [csi-proxy](https://github.com/kubernetes-csi/csi-proxy)의 버전을 보여줍니다.

AMI ID를 포함하여 각 변형에 대한 Amazon EKS 최적화 AMI 메타데이터를 프로그래밍 방식으로 가져올 수 있습니다. 자세한 내용은 [권장 Microsoft Windows AMI ID 검색](retrieve-windows-ami-id.md) 섹션을 참조하세요.

AMI는 Kubernetes 버전과 AMI의 출시 날짜에 따라 다음 형식으로 버전이 지정됩니다.

```
k8s_major_version.k8s_minor_version-release_date
```

**참고**  
Amazon EKS 관리형 노드 그룹에서는 Windows AMI의 2022년 11월 및 이후 릴리스를 지원합니다.

이 특정 설명서 페이지의 모든 소스 파일 변경 사항에 대한 알림을 받으려면 RSS 리더를 사용하여 다음 URL을 구독하세요.

```
https://github.com/awsdocs/amazon-eks-user-guide/commits/mainline/latest/ug/nodes/eks-ami-versions-windows.adoc.atom
```

## Amazon EKS 최적화 Windows Server 2025 Core AMI
<a name="eks-ami-versions-windows-2025-core"></a>

다음 표에는 Amazon EKS 최적화 Windows Server 2025 Core AMI의 현재 및 이전 버전이 나와 있습니다.

**Example**  


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 

## Amazon EKS 최적화 Windows Server 2025 Full AMI
<a name="eks-ami-versions-windows-2025-full"></a>

다음 표에는 Amazon EKS 최적화 Windows Server 2025 Full AMI의 현재 및 이전 버전이 나와 있습니다.

**Example**  


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 

## Amazon EKS 최적화 Windows Server 2022 Core AMI
<a name="eks-ami-versions-windows-2022-core"></a>

다음 표에는 Amazon EKS 최적화 Windows Server 2022 Core AMI의 현재 및 이전 버전이 나와 있습니다.

**Example**  


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.34-2026.02.13`   |   `1.34.3`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.34-2026.01.22`   |   `1.34.2`   |   `2.1.6`   |   `1.2.1`   |  `containerd`를 `2.1.6`로 업그레이드했습니다.  | 
|   `1.34-2025.12.15`   |   `1.34.2`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.11.14`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.10.18`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.09.13`   |   `1.34.0`   |   `2.1.4`   |   `1.2.1`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.33-2026.02.13`   |   `1.33.7`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.33-2026.01.22`   |   `1.33.5`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.33-2025.12.15`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.11.14`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.10.18`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.09.13`   |   `1.33.4`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.33-2025.08.18`   |   `1.33.3`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.07.16`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.06.13`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.05.17`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.32-2026.02.13`   |   `1.32.11`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.32-2026.01.22`   |   `1.32.9`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.32-2025.12.15`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.11.14`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.10.18`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.09.13`   |   `1.32.8`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.32-2025.08.18`   |   `1.32.7`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.07.16`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.06.13`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.32-2025.05.17`   |   `1.32.5`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.32-2025.04.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.03.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.02.18`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.01.15`   |   `1.32.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.31-2026.02.13`   |   `1.31.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.31-2026.01.22`   |   `1.31.13`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.31-2025.12.15`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.11.14`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.10.18`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.09.13`   |   `1.31.12`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.31-2025.08.18`   |   `1.31.11`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.07.16`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.06.13`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.31-2025.05.17`   |   `1.31.9`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.31-2025.04.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.03.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.02.15`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.15`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.01`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.31-2024.12.13`   |   `1.31.3`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.11.12`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.08`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.01`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.09.10`   |   `1.31.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.30-2026.02.13`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.30-2026.01.22`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.30-2025.12.15`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.11.21`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.10.18`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.09.13`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.30-2025.08.18`   |   `1.30.14`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.07.16`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.06.13`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.30-2025.05.17`   |   `1.30.13`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.30-2025.04.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.30-2025.03.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  `containerd`를 `1.7.20`로 업그레이드했습니다.  | 
|   `1.30-2025.02.15`   |   `1.30.9`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.15`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.01`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.30-2024.12.11`   |   `1.30.7`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.11.12`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.10.08`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.09.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.08.13`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.07.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.2`   |  `CVE-2024-5321`에 대한 패치 포함.  | 
|   `1.30-2024.06.17`   |   `1.30.0`   |   `1.7.14`   |   `1.1.2`   |  `containerd`를 `1.7.14`로 업그레이드했습니다.  | 
|   `1.30-2024.05.15`   |   `1.30.0`   |   `1.6.28`   |   `1.1.2`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.29-2026.02.13`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.29-2026.01.22`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.29-2025.12.15`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.11.14`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.10.18`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.09.13`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.29-2025.08.18`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.07.16`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.06.13`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.29-2025.05.17`   |   `1.29.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.29-2025.04.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.29-2025.03.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  `containerd`를 `1.7.20`로 업그레이드했습니다.  | 
|   `1.29-2025.02.15`   |   `1.29.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.15`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.01`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.29-2024.12.11`   |   `1.29.10`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.11.12`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.10.08`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.09.10`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.08.13`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.07.10`   |   `1.29.6`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321`에 대한 패치 포함.  | 
|   `1.29-2024.06.17`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  | 
|   `1.29-2024.05.15`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  `containerd`를 `1.7.11`로 업그레이드했습니다. `kubelet`를 `1.29.3`로 업그레이드했습니다.  | 
|   `1.29-2024.04.09`   |   `1.29.0`   |   `1.6.28`   |   `1.1.2`   |  `containerd`를 `1.6.28`로 업그레이드했습니다. `golang 1.22.1`을 사용하여 CNI 및 `csi-proxy`를 재구축했습니다.  | 
|   `1.29-2024.03.12`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.06`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  `kubelet` 가비지 수집 프로세스에서 일시 중지 이미지가 잘못 삭제되는 버그를 수정했습니다.  | 
|   `1.29-2024.01.11`   |   `1.29.0`   |   `1.6.18`   |   `1.1.2`   |  Windows Server 2022 Core AMI에서 독립 실행형 Windows 업데이트 [KB5034439](https://support.microsoft.com/en-au/topic/kb5034439-windows-recovery-environment-update-for-azure-stack-hci-version-22h2-and-windows-server-2022-january-9-2024-6f9d26e6-784c-4503-a3c6-0beedda443ca)가 제외되었습니다. KB는 Amazon EKS 최적화 Windows AMI에 포함되지 않은 별도의 WinRE 파티션이 있는 Windows 설치에만 적용됩니다.  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.28-2025.11.14`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.10.18`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.09.13`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.28-2025.08.18`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.07.16`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.06.13`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.28-2025.05.17`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.28-2025.04.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.28-2025.03.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  `containerd`를 `1.7.20`로 업그레이드했습니다.  | 
|   `1.28-2025.02.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025.01.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-01`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.28-2024.12.11`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.11.12`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.10.08`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.09.10`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.08.13`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.07.10`   |   `1.28.11`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321`에 대한 패치 포함.  | 
|   `1.28-2024.06.17`   |   `1.28.8`   |   `1.7.11`   |   `1.1.2`   |  `containerd`를 `1.7.11`로 업그레이드했습니다.  | 
|   `1.28-2024.05.14`   |   `1.28.8`   |   `1.6.28`   |   `1.1.2`   |  `containerd`를 `1.6.28`로 업그레이드했습니다. `kubelet`를 `1.28.8`로 업그레이드했습니다.  | 
|   `1.28-2024.04.09`   |   `1.28.5`   |   `1.6.25`   |   `1.1.2`   |  `containerd`를 `1.6.25`로 업그레이드했습니다. `golang 1.22.1`을 사용하여 CNI 및 `csi-proxy`를 재구축했습니다.  | 
|   `1.28-2024.03.12`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.02.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.01.11`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  Windows Server 2022 Core AMI에서 독립 실행형 Windows 업데이트 [KB5034439](https://support.microsoft.com/en-au/topic/kb5034439-windows-recovery-environment-update-for-azure-stack-hci-version-22h2-and-windows-server-2022-january-9-2024-6f9d26e6-784c-4503-a3c6-0beedda443ca)가 제외되었습니다. KB는 Amazon EKS 최적화 Windows AMI에 포함되지 않은 별도의 WinRE 파티션이 있는 Windows 설치에만 적용됩니다.  | 
|   `1.28-2023.12.12`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.11.14`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  `CVE-2023-5528`에 대한 패치 포함.  | 
|   `1.28-2023.10.19`   |   `1.28.2`   |   `1.6.18`   |   `1.1.2`   |  `containerd`를 `1.6.18`로 업그레이드했습니다. 새 [부트스트랩 스크립트 환경 변수](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters)(`SERVICE_IPV4_CIDR` 및 `EXCLUDED_SNAT_CIDRS`)가 추가되었습니다.  | 
|   `1.28-2023-09.27`   |   `1.28.2`   |   `1.6.6`   |   `1.1.2`   |  `kubelet`에서 [보안 권고](https://github.com/advisories/GHSA-6xv5-86q9-7xr8)를 수정했습니다.  | 
|   `1.28-2023.09.12`   |   `1.28.1`   |   `1.6.6`   |   `1.1.2`   |  | 

## Amazon EKS 최적화 Windows Server 2022 Full AMI
<a name="eks-ami-versions-windows-2022-full"></a>

다음 표에는 Amazon EKS 최적화 Windows Server 2022 Full AMI의 현재 및 이전 버전이 나와 있습니다.

**Example**  


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.34-2026.02.13`   |   `1.34.3`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.34-2026.01.22`   |   `1.34.2`   |   `2.1.6`   |   `1.2.1`   |  `containerd`를 `2.1.6`로 업그레이드했습니다.  | 
|   `1.34-2025.12.15`   |   `1.34.2`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.11.14`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.10.18`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.09.13`   |   `1.34.0`   |   `2.1.4`   |   `1.2.1`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.33-2026.02.13`   |   `1.33.7`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.33-2026.01.22`   |   `1.33.5`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.33-2025.12.15`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.11.14`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.10.18`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.09.13`   |   `1.33.4`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.33-2025.08.18`   |   `1.33.3`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.07.16`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.06.13`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.05.17`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.32-2026.02.13`   |   `1.32.11`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.32-2026.01.22`   |   `1.32.9`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.32-2025.12.15`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.11.14`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.10.18`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.09.13`   |   `1.32.8`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.32-2025.08.18`   |   `1.32.7`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.07.16`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.06.13`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  `containrd`가 `1.7.27`로 업그레이드되었습니다.  | 
|   `1.32-2025.05.17`   |   `1.32.5`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.32-2025.04.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.03.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.02.18`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.01.01`   |   `1.32.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.31-2026.02.13`   |   `1.31.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.31-2026.01.22`   |   `1.31.13`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.31-2025.12.15`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.11.14`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.10.18`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.09.13`   |   `1.31.12`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.31-2025.08.18`   |   `1.31.11`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.07.16`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.06.13`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.31-2025.05.17`   |   `1.31.9`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.31-2025.04.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.03.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.02.15`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.15`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.01`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.31-2024.12.13`   |   `1.31.3`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.11.12`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.08`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.01`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.09.10`   |   `1.31.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.30-2026.02.13`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.30-2026.01.22`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.30-2025.12.15`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.11.21`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.10.18`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.09.13`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.30-2025.08.18`   |   `1.30.14`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.07.16`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.06.13`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.30-2025.05.17`   |   `1.30.13`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.30-2025.04.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.30-2025.03.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  `contianerd`를 `1.7.20`로 업그레이드했습니다.  | 
|   `1.30-2025.02.15`   |   `1.30.9`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.15`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.01`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.30-2024.12.11`   |   `1.30.7`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.11.12`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.10.08`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.09.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.08.13`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.07.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.2`   |  `CVE-2024-5321`에 대한 패치 포함.  | 
|   `1.30-2024.06.17`   |   `1.30.0`   |   `1.7.14`   |   `1.1.2`   |  `containerd`를 `1.7.14`로 업그레이드했습니다.  | 
|   `1.30-2024.05.15`   |   `1.30.0`   |   `1.6.28`   |   `1.1.2`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.29-2026.02.13`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.29-2026.01.22`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.29-2025.12.15`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.11.14`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.10.18`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.09.13`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.29-2025.08.18`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.07.16`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.06.13`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.29-2025.05.17`   |   `1.29.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.29-2025.04.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.29-2025.03.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  `containerd`를 `1.7.20`로 업그레이드했습니다.  | 
|   `1.29-2025.02.15`   |   `1.29.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.15`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.01`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.29-2024.12.11`   |   `1.29.10`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.11.12`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.10.08`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.09.10`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.08.13`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.07.10`   |   `1.29.6`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321`에 대한 패치 포함.  | 
|   `1.29-2024.06.17`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  | 
|   `1.29-2024.05.15`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  `containerd`를 `1.7.11`로 업그레이드했습니다. `kubelet`를 `1.29.3`로 업그레이드했습니다.  | 
|   `1.29-2024.04.09`   |   `1.29.0`   |   `1.6.28`   |   `1.1.2`   |  `containerd`를 `1.6.28`로 업그레이드했습니다. `golang 1.22.1`을 사용하여 CNI 및 `csi-proxy`를 재구축했습니다.  | 
|   `1.29-2024.03.12`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.06`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  `kubelet` 가비지 수집 프로세스에서 일시 중지 이미지가 잘못 삭제되는 버그를 수정했습니다.  | 
|   `1.29-2024.01.09`   |   `1.29.0`   |   `1.6.18`   |   `1.1.2`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.28-2025.11.14`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.10.18`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.09.13`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.28-2025.08.18`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.07.16`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.06.13`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.28-2025.05.17`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.28-2025.04.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.28-2025.03.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  `containerd`를 `1.7.20`로 업그레이드했습니다.  | 
|   `1.28-2025.02.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025.01.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025.01.01`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.28-2024.12.11`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.11.12`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.10.08`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.09.10`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.08.13`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.07.10`   |   `1.28.11`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321`에 대한 패치 포함.  | 
|   `1.28-2024.06.17`   |   `1.28.8`   |   `1.7.11`   |   `1.1.2`   |  `containerd`를 `1.7.11`로 업그레이드했습니다.  | 
|   `1.28-2024.05.14`   |   `1.28.8`   |   `1.6.28`   |   `1.1.2`   |  `containerd`를 `1.6.28`로 업그레이드했습니다. `kubelet`를 `1.28.8`로 업그레이드했습니다.  | 
|   `1.28-2024.04.09`   |   `1.28.5`   |   `1.6.25`   |   `1.1.2`   |  `containerd`를 `1.6.25`로 업그레이드했습니다. `golang 1.22.1`을 사용하여 CNI 및 `csi-proxy`를 재구축했습니다.  | 
|   `1.28-2024.03.12`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.02.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.01.09`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.12.12`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.11.14`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  `CVE-2023-5528`에 대한 패치 포함.  | 
|   `1.28-2023.10.19`   |   `1.28.2`   |   `1.6.18`   |   `1.1.2`   |  `containerd`를 `1.6.18`로 업그레이드했습니다. 새 [부트스트랩 스크립트 환경 변수](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters)(`SERVICE_IPV4_CIDR` 및 `EXCLUDED_SNAT_CIDRS`)가 추가되었습니다.  | 
|   `1.28-2023-09.27`   |   `1.28.2`   |   `1.6.6`   |   `1.1.2`   |  `kubelet`에서 [보안 권고](https://github.com/advisories/GHSA-6xv5-86q9-7xr8)를 수정했습니다.  | 
|   `1.28-2023.09.12`   |   `1.28.1`   |   `1.6.6`   |   `1.1.2`   |  | 

## Amazon EKS 최적화 Windows Server 2019 Core AMI
<a name="eks-ami-versions-windows-2019-core"></a>

다음 표에는 Amazon EKS 최적화 Windows Server 2019 Core AMI의 현재 및 이전 버전이 나와 있습니다.

**Example**  


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.34-2026.02.13`   |   `1.34.3`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.34-2026.01.22`   |   `1.34.2`   |   `2.1.6`   |   `1.2.1`   |  `containerd`를 `2.1.6`로 업그레이드했습니다.  | 
|   `1.34-2025.12.15`   |   `1.34.2`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.11.14`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.10.18`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.09.13`   |   `1.34.0`   |   `2.1.4`   |   `1.2.1`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.33-2026.02.13`   |   `1.33.7`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.33-2026.01.22`   |   `1.33.5`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.33-2025.12.15`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.11.14`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.10.18`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.09.13`   |   `1.33.4`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.33-2025.08.18`   |   `1.33.3`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.07.16`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.06.13`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.05.17`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.32-2026.02.13`   |   `1.32.11`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.32-2026.01.22`   |   `1.32.9`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.32-2025.12.15`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.11.14`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.10.18`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.09.13`   |   `1.32.8`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.32-2025.08.18`   |   `1.32.7`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.07.16`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.06.13`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.32-2025.05.17`   |   `1.32.5`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.32-2025.04.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.03.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.02.18`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.01.15`   |   `1.32.4`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.31-2026.02.13`   |   `1.31.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.31-2026.01.22`   |   `1.31.13`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.31-2025.12.15`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.11.14`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.10.18`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.09.13`   |   `1.31.12`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.31-2025.08.18`   |   `1.31.11`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.07.16`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.06.13`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.31-2025.05.17`   |   `1.31.9`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.31-2025.04.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.03.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.02.15`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.15`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.01`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.31-2024.12.13`   |   `1.31.3`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.11.12`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.08`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.01`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.09.10`   |   `1.31.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.30-2026.02.13`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.30-2026.01.22`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.30-2025.12.15`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.11.21`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.10.18`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.09.13`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.30-2025.08.18`   |   `1.30.14`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.07.16`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.06.13`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.30-2025.05.17`   |   `1.30.13`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.30-2025.04.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.30-2025.03.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  `containerd`를 `1.7.20`로 업그레이드했습니다.  | 
|   `1.30-2025-02-15`   |   `1.30.9`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.15`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.01`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.30-2024.12.11`   |   `1.30.7`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.11.12`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.10.08`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.09.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.08.13`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.07.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.2`   |  `CVE-2024-5321`에 대한 패치 포함.  | 
|   `1.30-2024.06.17`   |   `1.30.0`   |   `1.7.14`   |   `1.1.2`   |  `containerd`를 `1.7.14`로 업그레이드했습니다.  | 
|   `1.30-2024.05.15`   |   `1.30.0`   |   `1.6.28`   |   `1.1.2`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.29-2026.02.13`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.29-2026.01.22`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.29-2025.12.15`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.11.14`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.10.18`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.09.13`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.29-2025.08.18`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.07.16`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.06.13`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.29-2025.05.17`   |   `1.29.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.29-2025.04.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.29-2025.03.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  `containerd`를 `1.7.20`로 업그레이드했습니다.  | 
|   `1.29-2025.02.15`   |   `1.29.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.15`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.01`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.29-2024.12.11`   |   `1.29.10`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.11.12`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.10.08`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.09.10`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.08.13`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.07.10`   |   `1.29.6`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321`에 대한 패치 포함.  | 
|   `1.29-2024.06.17`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  | 
|   `1.29-2024.05.15`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  `containerd`를 `1.7.11`로 업그레이드했습니다. `kubelet`를 `1.29.3`로 업그레이드했습니다.  | 
|   `1.29-2024.04.09`   |   `1.29.0`   |   `1.6.28`   |   `1.1.2`   |  `containerd`를 `1.6.28`로 업그레이드했습니다. `golang 1.22.1`을 사용하여 CNI 및 `csi-proxy`를 재구축했습니다.  | 
|   `1.29-2024.03.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.06`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  `kubelet` 가비지 수집 프로세스에서 일시 중지 이미지가 잘못 삭제되는 버그를 수정했습니다.  | 
|   `1.29-2024.01.09`   |   `1.29.0`   |   `1.6.18`   |   `1.1.2`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.28-2025.11.14`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.10.18`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.09.13`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.28-2025.08.18`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.07.16`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.06.13`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.28-2025.05.17`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.28-2025.04.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.28-2025.03.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  `containerd`를 `1.7.20`로 업그레이드했습니다.  | 
|   `1.28-2025.02.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-01`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.28-2024.12.11`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.11.12`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.10.08`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.09.10`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.08.13`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.07.10`   |   `1.28.11`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321`에 대한 패치 포함.  | 
|   `1.28-2024.06.17`   |   `1.28.8`   |   `1.7.11`   |   `1.1.2`   |  `containerd`를 `1.7.11`로 업그레이드했습니다.  | 
|   `1.28-2024.05.14`   |   `1.28.8`   |   `1.6.28`   |   `1.1.2`   |  `containerd`를 `1.6.28`로 업그레이드했습니다. `kubelet`를 `1.28.8`로 업그레이드했습니다.  | 
|   `1.28-2024.04.09`   |   `1.28.5`   |   `1.6.25`   |   `1.1.2`   |  `containerd`를 `1.6.25`로 업그레이드했습니다. `golang 1.22.1`을 사용하여 CNI 및 `csi-proxy`를 재구축했습니다.  | 
|   `1.28-2024.03.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.02.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.01.09`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.12.12`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.11.14`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  `CVE-2023-5528`에 대한 패치 포함.  | 
|   `1.28-2023.10.19`   |   `1.28.2`   |   `1.6.18`   |   `1.1.2`   |  `containerd`를 `1.6.18`로 업그레이드했습니다. 새 [부트스트랩 스크립트 환경 변수](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters)(`SERVICE_IPV4_CIDR` 및 `EXCLUDED_SNAT_CIDRS`)가 추가되었습니다.  | 
|   `1.28-2023-09.27`   |   `1.28.2`   |   `1.6.6`   |   `1.1.2`   |  `kubelet`에서 [보안 권고](https://github.com/advisories/GHSA-6xv5-86q9-7xr8)를 수정했습니다.  | 
|   `1.28-2023.09.12`   |   `1.28.1`   |   `1.6.6`   |   `1.1.2`   |  | 

## Amazon EKS 최적화 Windows Server 2019 Full AMI
<a name="eks-ami-versions-windows-2019-full"></a>

다음 표에는 Amazon EKS 최적화 Windows Server 2019 Full AMI의 현재 및 이전 버전이 나와 있습니다.

**Example**  


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.34-2026.02.13`   |   `1.34.3`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.34-2026.01.22`   |   `1.34.2`   |   `2.1.6`   |   `1.2.1`   |  `containerd`를 `2.1.6`로 업그레이드했습니다.  | 
|   `1.34-2025.12.15`   |   `1.34.2`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.11.14`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.10.18`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.09.13`   |   `1.34.0`   |   `2.1.4`   |   `1.2.1`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.33-2026.02.13`   |   `1.33.7`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.33-2026.01.22`   |   `1.33.5`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.33-2025.12.15`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.11.14`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.10.18`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.09.13`   |   `1.33.4`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.33-2025.08.18`   |   `1.33.3`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.07.16`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.06.13`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.05.17`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.32-2026.02.13`   |   `1.32.11`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.32-2026.01.22`   |   `1.32.9`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.32-2025.12.15`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.11.14`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.10.18`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.09.13`   |   `1.32.8`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.32-2025.08.18`   |   `1.32.7`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.07.16`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.06.13`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.32-2025.05.17`   |   `1.32.5`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.32-2025.04.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.03.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.02.18`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.01.15`   |   `1.32.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.31-2026.02.13`   |   `1.31.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.31-2026.01.22`   |   `1.31.13`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.31-2025.12.15`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.11.14`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.10.18`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.09.13`   |   `1.31.12`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.31-2025.08.18`   |   `1.31.11`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.07.16`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.06.13`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.31-2025.05.17`   |   `1.31.9`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.31-2025.04.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.03.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.02.15`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.15`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.01`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.31-2024.12.13`   |   `1.31.3`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.11.12`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.08`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.01`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.09.10`   |   `1.31.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.30-2026.02.13`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.30-2026.01.22`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.30-2025.12.15`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.11.21`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.10.18`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.09.13`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.30-2025.08.18`   |   `1.30.14`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.07.16`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.06.13`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.30-2025.05.17`   |   `1.30.13`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.30-2025.04.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.30-2025.03.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  `containerd`를 `1.7.20`로 업그레이드했습니다.  | 
|   `1.30-2025.02.15`   |   `1.30.9`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.15`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.01`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.30-2024.12.11`   |   `1.30.7`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.11.12`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.10.08`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.09.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.08.13`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.07.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.2`   |  `CVE-2024-5321`에 대한 패치 포함.  | 
|   `1.30-2024.06.17`   |   `1.30.0`   |   `1.7.14`   |   `1.1.2`   |  `containerd`를 `1.7.14`로 업그레이드했습니다.  | 
|   `1.30-2024.05.15`   |   `1.30.0`   |   `1.6.28`   |   `1.1.2`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.29-2026.02.13`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.29-2026.01.22`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  `containerd`를 `1.7.30`로 업그레이드했습니다.  | 
|   `1.29-2025.12.15`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.11.14`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.10.18`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.09.13`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.29-2025.08.18`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.07.16`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.06.13`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.29-2025.05.17`   |   `1.29.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.29-2025.04.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.29-2025.03.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  `containerd`를 `1.7.20`로 업그레이드했습니다.  | 
|   `1.29-2025.02.15`   |   `1.29.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.15`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.01`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.29-2024.12.11`   |   `1.29.10`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.11.12`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.10.08`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.09.10`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.08.13`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.07.10`   |   `1.29.6`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321`에 대한 패치 포함.  | 
|   `1.29-2024.06.17`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  | 
|   `1.29-2024.05.15`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  `containerd`를 `1.7.11`로 업그레이드했습니다. `kubelet`를 `1.29.3`로 업그레이드했습니다.  | 
|   `1.29-2024.04.09`   |   `1.29.0`   |   `1.6.28`   |   `1.1.2`   |  `containerd`를 `1.6.28`로 업그레이드했습니다. `golang 1.22.1`을 사용하여 CNI 및 `csi-proxy`를 재구축했습니다.  | 
|   `1.29-2024.03.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.06`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  `kubelet` 가비지 수집 프로세스에서 일시 중지 이미지가 잘못 삭제되는 버그를 수정했습니다.  | 
|   `1.29-2024.01.09`   |   `1.29.0`   |   `1.6.18`   |   `1.1.2`   |  | 


| AMI 버전 | kubelet 버전 | 컨테이너 버전 | csi-프록시 버전 | 릴리스 노트 | 
| --- | --- | --- | --- | --- | 
|   `1.28-2025.11.14`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.10.18`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.09.13`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  GMSA 플러그인 로그를 Windows 이벤트로 변경함  | 
|   `1.28-2025.08.18`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.07.16`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.06.13`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  `containerd`를 `1.7.27`로 업그레이드했습니다.  | 
|   `1.28-2025.05.17`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.28-2025.04.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.28-2025.03.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  `containerd`를 `1.7.20`로 업그레이드했습니다.  | 
|   `1.28-2025.02.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-01`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  `CVE-2024-9042`에 대한 패치 포함.  | 
|   `1.28-2024.12.11`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.11.12`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.10.08`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.09.10`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.08.13`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.07.10`   |   `1.28.11`   |   `1.7.11`   |   `1.1.2`   |  `CVE-2024-5321`에 대한 패치 포함.  | 
|   `1.28-2024.06.17`   |   `1.28.8`   |   `1.7.11`   |   `1.1.2`   |  `containerd`를 `1.7.11`로 업그레이드했습니다.  | 
|   `1.28-2024.05.14`   |   `1.28.8`   |   `1.6.28`   |   `1.1.2`   |  `containerd`를 `1.6.28`로 업그레이드했습니다. `kubelet`를 `1.28.8`로 업그레이드했습니다.  | 
|   `1.28-2024.04.09`   |   `1.28.5`   |   `1.6.25`   |   `1.1.2`   |  `containerd`를 `1.6.25`로 업그레이드했습니다. `golang 1.22.1`을 사용하여 CNI 및 `csi-proxy`를 재구축했습니다.  | 
|   `1.28-2024.03.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.02.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.01.09`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.12.12`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.11.14`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  `CVE-2023-5528`에 대한 패치 포함.  | 
|   `1.28-2023.10.19`   |   `1.28.2`   |   `1.6.18`   |   `1.1.2`   |  `containerd`를 `1.6.18`로 업그레이드했습니다. 새 [부트스트랩 스크립트 환경 변수](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters)(`SERVICE_IPV4_CIDR` 및 `EXCLUDED_SNAT_CIDRS`)가 추가되었습니다.  | 
|   `1.28-2023-09.27`   |   `1.28.2`   |   `1.6.6`   |   `1.1.2`   |  `kubelet`에서 [보안 권고](https://github.com/advisories/GHSA-6xv5-86q9-7xr8)를 수정했습니다.  | 
|   `1.28-2023.09.12`   |   `1.28.1`   |   `1.6.6`   |   `1.1.2`   |  | 

# 권장 Microsoft Windows AMI ID 검색
<a name="retrieve-windows-ami-id"></a>

노드를 배포할 때 사전 구축된 Amazon EKS 최적화 Amazon Machine Image(AMI)의 ID를 지정할 수 있습니다. 원하는 구성에 적합한 AMI ID를 검색하려면 AWS Systems Manager Parameter Store API를 쿼리합니다. 이 API를 사용하면 Amazon EKS 최적화 AMI ID를 수동으로 조회할 필요가 없습니다. 자세한 내용은 [GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html)를 참조하세요. Amazon EKS 최적화 AMI 메타데이터를 검색하려면 [IAM 보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)에 `ssm:GetParameter` IAM 권한이 있어야 합니다.

하위 파라미터 `image_id`를 사용하는 다음 명령을 사용하여 최신 권장 Amazon EKS 최적화 Windows AMI의 이미지 ID를 검색할 수 있습니다. 필요에 따라 명령을 다음과 같이 수정한 다음에 수정한 명령을 실행합니다.
+ *release*를 다음 옵션 중 하나로 변경합니다.
  + Windows Server 2025의 경우 *2025*를 사용합니다.
  + Windows Server 2022의 경우 *2022*를 사용합니다.
  + Windows Server 2019의 경우 *2019*를 사용합니다.
+ *설치 옵션*을 다음 옵션 중 하나로 바꿉니다. 자세한 내용은 [Windows Server의 Server Core 설치 옵션이란 무엇인가요](https://learn.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core)를 참조하세요.
  + *Core*를 공격 표면이 더 작은 최소한의 설치에 사용합니다.
  + Windows 데스크톱 환경을 포함하려면 *전체*를 사용합니다.
+ [kubernetes-version](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html)을 지원되는 *플랫폼 버전*으로 바꿉니다.
+ *region-code*를 AMI ID를 원하는 [Amazon EKS 지원 AWS 리전](https://docs.aws.amazon.com/general/latest/gr/eks.html)으로 바꿉니다.

```
aws ssm get-parameter --name /aws/service/ami-windows-latest/Windows_Server-release-English-installation-option-EKS_Optimized-kubernetes-version/image_id \
    --region region-code --query "Parameter.Value" --output text
```

다음은 자리 표시자를 대체한 후의 명령 예제입니다.

```
aws ssm get-parameter --name /aws/service/ami-windows-latest/Windows_Server-2022-English-Core-EKS_Optimized-k8s-n-2/image_id \
    --region us-west-2 --query "Parameter.Value" --output text
```

예제 출력은 다음과 같습니다.

```
ami-1234567890abcdef0
```

# Image Builder를 사용한 사용자 지정 Windows AMI 구축
<a name="eks-custom-ami-windows"></a>

EC2 Image Builder를 사용하여 다음 옵션 중 하나로 사용자 지정 Amazon EKS 최적화 Windows AMI를 생성할 수 있습니다.
+  [Amazon EKS 최적화 Windows AMI를 기반으로 사용](#custom-windows-ami-as-base) 
+  [Amazon 관리형 빌드 구성 요소 사용](#custom-windows-ami-build-component) 

두 방법 모두 고유한 Image Builder 레시피를 만들어야 합니다. 자세한 내용은 Image Builder 사용 설명서의 [이미지 레시피의 새 버전 생성](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-image-recipes.html)을 참조하세요.

**중요**  
`eks`에 대한 다음 **Amazon 관리형** 구성 요소에는 `CVE-2024-5321`에 대한 패치가 포함됩니다.  
 `1.28.2` 이상
 `1.29.2` 이상
 `1.30.1` 이상
Kubernetes 1.31 이상의 모든 버전

## Amazon EKS 최적화 Windows AMI를 기반으로 사용
<a name="custom-windows-ami-as-base"></a>

이 옵션은 사용자 지정 Windows AMI를 구축하는 데 권장되는 방법입니다. AWS에서 제공하는 Amazon EKS 최적화 Windows AMI는 Amazon 관리형 빌드 구성 요소보다 더 자주 업데이트됩니다.

1. 새 Image Builder 레시피를 시작합니다.

   1. https://console.aws.amazon.com/imagebuilder에서 EC2 Image Builder 콘솔을 엽니다.

   1. 왼쪽 탐색 창에서 **이미지 레시피**를 선택합니다.

   1. **이미지 레시피 생성**을 선택합니다.

1. **레시피 세부 정보** 섹션에서 **이름**과 **버전**을 입력합니다.

1. **기본 이미지** 섹션에서 Amazon EKS 최적화 Windows AMI의 ID를 지정합니다.

   1. **사용자 지정 AMI ID 입력**을 선택합니다.

   1. 필요한 Windows OS 버전의 AMI ID를 검색합니다. 자세한 내용은 [권장 Microsoft Windows AMI ID 검색](retrieve-windows-ami-id.md) 섹션을 참조하세요.

   1. 사용자 지정 **AMI ID**를 입력합니다. AMI ID를 찾을 수 없는 경우 AMI ID의 AWS 리전이 콘솔의 오른쪽 상단에 표시된 AWS 리전과 일치하는지 확인합니다.

1. (선택사항) 최신 보안 업데이트를 받으려면 **빌드 구성 요소 - ** 섹션에서 `update-windows` 구성 요소를 추가합니다.

   1. **이름으로 구성 요소 찾기** 검색 상자 오른쪽의 드롭다운 목록에서 **Amazon 관리형**을 선택합니다.

   1. **이름으로 구성 요소 찾기** 상자에 `update-windows`를 입력합니다.

   1. ** `update-windows` ** 검색 결과의 확인란을 선택합니다. 이 구성 요소에는 운영 체제의 최신 Windows 패치가 포함되어 있습니다.

1. 나머지 이미지 레시피 입력을 필요한 구성으로 완료합니다. 자세한 내용은 Image Builder 사용 설명서의 [새 이미지 레시피 버전 생성(콘솔)](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-image-recipes.html#create-image-recipe-version-console)을 참조하세요.

1. **레시피 생성**을 선택합니다.

1. 신규 또는 기존 이미지 파이프라인에서 새 이미지 레시피를 사용합니다. 이미지 파이프라인이 성공적으로 실행되면 사용자 지정 AMI가 출력 이미지로 나열되고 사용할 준비가 됩니다. 자세한 내용은 [EC2 Image Builder 콘솔 마법사를 사용하여 이미지 파이프라인 생성](https://docs.aws.amazon.com/imagebuilder/latest/userguide/start-build-image-pipeline.html)을 참조하세요.

## Amazon 관리형 빌드 구성 요소 사용
<a name="custom-windows-ami-build-component"></a>

Amazon EKS 최적화 Windows AMI를 기반으로 사용할 수 없는 경우 Amazon 관리형 빌드 구성 요소를 대신 사용할 수 있습니다. 이 옵션은 지원되는 최신 Kubernetes 버전보다 뒤처질 수 있습니다.

1. 새 Image Builder 레시피를 시작합니다.

   1. https://console.aws.amazon.com/imagebuilder에서 EC2 Image Builder 콘솔을 엽니다.

   1. 왼쪽 탐색 창에서 **이미지 레시피**를 선택합니다.

   1. **이미지 레시피 생성**을 선택합니다.

1. **레시피 세부 정보** 섹션에서 **이름**과 **버전**을 입력합니다.

1. **기본 이미지** 섹션에서 사용자 지정 AMI를 생성하는 데 사용할 옵션을 결정합니다.
   +  **관리형 이미지 선택** - **이미지 운영 체제(OS)**에서 **Windows**를 선택합니다. 그리고 나서 **이미지 오리진**에 대해 다음 옵션 중 하나를 선택합니다.
     +  **빠른 시작(Amazon 관리형)** - **이미지 이름** 드롭다운에서 Amazon EKS 지원 Windows Server 버전을 선택합니다. 자세한 내용은 [최적화된 Windows AMI를 사용한 노드 생성](eks-optimized-windows-ami.md) 섹션을 참조하세요.
     +  **내가 소유한 이미지** - **이미지 이름**으로 자체 라이선스가 있는 이미지의 ARN을 선택합니다. 제공하는 이미지에 Amazon EKS 구성 요소가 이미 설치되어 있을 수 없습니다.
   +  **사용자 지정 AMI ID 입력** - AMI ID에 자체 라이선스가 있는 AMI의 ID를 입력합니다. 제공하는 이미지에 Amazon EKS 구성 요소가 이미 설치되어 있을 수 없습니다.

1. **빌드 구성 요소 - Windows** 섹션에서 다음을 수행합니다.

   1. **이름으로 구성 요소 찾기** 검색 상자 오른쪽의 드롭다운 목록에서 **Amazon 관리형**을 선택합니다.

   1. **이름으로 구성 요소 찾기** 상자에 `eks`를 입력합니다.

   1. 반환되는 결과가 원하는 버전이 아닐 수도 있지만, ** `eks-optimized-ami-windows` ** 검색 결과의 확인란을 선택합니다.

   1. **이름으로 구성 요소 찾기** 상자에 `update-windows`를 입력합니다.

   1. **update-windows** 검색 결과의 확인란을 선택합니다. 이 구성 요소에는 운영 체제의 최신 Windows 패치가 포함되어 있습니다.

1. **선택한 구성 요소** 섹션에서 다음을 수행합니다.

   1. ** `eks-optimized-ami-windows` **의 **버전 관리 옵션**을 선택합니다.

   1. **구성 요소 버전 지정**을 선택합니다.

   1. **구성 요소 버전** 필드에 *version.x*를 입력합니다. 이때 *버전*을 지원되는 Kubernetes 버전으로 바꿉니다. 버전 번호의 일부로 *x*를 입력하면 사용자가 명시적으로 정의하는 버전 부분과도 일치하는 최신 구성 요소 버전을 사용한다는 의미입니다. 콘솔 출력에서 원하는 버전을 관리형 구성 요소로 사용할 수 있는지 여부를 알려주므로 유의하세요. 최신 Kubernetes 버전은 빌드 구성 요소에 사용하지 못할 수 있습니다. 사용 가능한 버전에 대한 자세한 내용은 [`eks-optimized-ami-windows` 구성 요소 버전에 대한 정보 검색](#custom-windows-ami-component-versions) 섹션을 참조하세요.

1. 나머지 이미지 레시피 입력을 필요한 구성으로 완료합니다. 자세한 내용은 Image Builder 사용 설명서의 [새 이미지 레시피 버전 생성(콘솔)](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-image-recipes.html#create-image-recipe-version-console)을 참조하세요.

1. **레시피 생성**을 선택합니다.

1. 신규 또는 기존 이미지 파이프라인에서 새 이미지 레시피를 사용합니다. 이미지 파이프라인이 성공적으로 실행되면 사용자 지정 AMI가 출력 이미지로 나열되고 사용할 준비가 됩니다. 자세한 내용은 [EC2 Image Builder 콘솔 마법사를 사용하여 이미지 파이프라인 생성](https://docs.aws.amazon.com/imagebuilder/latest/userguide/start-build-image-pipeline.html)을 참조하세요.

## `eks-optimized-ami-windows` 구성 요소 버전에 대한 정보 검색
<a name="custom-windows-ami-component-versions"></a>

각 구성 요소와 함께 설치되는 항목에 대한 특정 정보를 검색할 수 있습니다. 예를 들어, 설치된 `kubelet` 버전을 확인할 수 있습니다. 구성 요소는 Amazon EKS 지원 Windows 운영 체제 버전에 대한 기능 테스트를 거칩니다. 자세한 내용은 [출시 일정](eks-optimized-windows-ami.md#windows-ami-release-calendar) 섹션을 참조하세요. 지원되는 것으로 나열되지 않았거나 지원이 종료된 다른 Windows OS 버전은 구성 요소와 호환되지 않을 수 있습니다.

1. https://console.aws.amazon.com/imagebuilder에서 EC2 Image Builder 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **구성 요소**를 선택합니다.

1. **이름으로 구성 요소 찾기** 검색 상자 오른쪽의 드롭다운 목록에서 **내 소유**를 **빠른 시작(Amazon 관리형)**으로 변경합니다.

1. **이름으로 구성 요소 찾기** 상자에 `eks`를 입력합니다.

1. (선택사항) 최신 버전을 사용하는 경우, **버전** 열을 두 번 선택하여 내림차순으로 정렬합니다.

1. 원하는 버전의 ** `eks-optimized-ami-windows` ** 링크를 선택합니다.

결과 페이지의 **설명**에 특정 정보가 표시됩니다.

# 노드 상태 문제 감지 및 노드 자동 복구 활성화
<a name="node-health"></a>

노드 상태는 워크로드를 효과적으로 실행하기 위한 Kubernetes 노드의 기능 및 운영 상태를 나타냅니다. 정상 노드는 예상 네트워크 연결을 유지하고, 컴퓨팅 및 스토리지 리소스가 충분하며, 중단 없이 워크로드를 성공적으로 실행할 수 있습니다.

Amazon EKS는 정상 노드를 유지하는 데 도움이 되도록 *노드 모니터링 에이전트* 및 *노드 자동 복구*를 제공합니다. 이러한 기능은 EKS Auto Mode 컴퓨팅에서 자동으로 활성화됩니다. 또한 EKS 관리형 노드 그룹 및 Karpenter에서 자동 노드 복구를 사용할 수 있으며, AWS Fargate를 제외한 모든 EKS 컴퓨팅 유형에서 EKS 노드 모니터링 에이전트를 사용할 수 있습니다. EKS 노드 모니터링 에이전트와 자동 노드 복구는 함께 사용할 때 가장 효과적이지만, EKS 클러스터에서 개별적으로 사용할 수도 있습니다.

**중요**  
*노드 모니터링 에이전트* 및 *노드 자동 복구*는 Linux에서만 사용할 수 있습니다. Windows에서는 이러한 기능을 사용할 수 없습니다.

## 노드 모니터링 에이전트
<a name="node-monitoring-agent"></a>

EKS 노드 모니터링 에이전트는 노드 로그를 읽어 상태 문제를 감지합니다. 로그를 구문 분석하여 장애를 감지하고 노드의 상태에 대한 상태 정보를 표시합니다. 감지된 각 문제 카테고리에 대해 에이전트는 워커 노드에 전용 `NodeCondition`을 적용합니다. EKS 노드 모니터링 에이전트에서 감지한 노드 상태 문제에 대한 자세한 내용은 [EKS 노드 모니터링 에이전트에서 노드 상태 문제 감지](node-health-nma.md) 섹션을 참조하세요.

EKS Auto Mode에는 노드 모니터링 에이전트가 포함되어 있습니다. 다른 EKS 컴퓨팅 유형의 경우 노드 모니터링 에이전트를 EKS 추가 기능으로 추가하거나 헬름과 같은 Kubernetes 도구를 사용하여 관리할 수 있습니다. 자세한 내용은 [노드 모니터링 에이전트 구성](node-health-nma.md#node-monitoring-agent-configure) 섹션을 참조하세요.

EKS 노드 모니터링 에이전트를 사용하면 노드 상태 문제에 대한 다음과 같은 카테고리가 노드 조건으로 표시됩니다. `Ready`, `DiskPressure` 및 `MemoryPressure`는 EKS 노드 모니터링 에이전트 없이도 표시되는 표준 Kubernetes 노드 조건입니다.


| 노드 조건 | 설명 | 
| --- | --- | 
|  AcceleratedHardwareReady  |  AcceleratedHardwareReady는 노드의 가속 하드웨어(GPU, Neuron)가 올바르게 작동하는지를 나타냅니다.  | 
|  ContainerRuntimeReady  |  ContainerRuntimeReady는 컨테이너 런타임(Containered 등)이 올바르게 작동하고 컨테이너를 실행할 수 있는지를 나타냅니다.  | 
|  DiskPressure  |  DiskPressure는 노드에서 디스크 압력(디스크 공간 부족 또는 높은 I/O)이 발생하고 있음을 나타내는 표준 Kubernetes 조건입니다.  | 
|  KernelReady  |  KernelReady는 커널이 심각한 오류, 패닉 또는 리소스 소진 없이 올바르게 작동하는지를 나타냅니다.  | 
|  MemoryPressure  |  MemoryPressure는 노드에서 메모리 압력(사용 가능한 메모리 부족)이 발생하고 있음을 나타내는 표준 Kubernetes 조건입니다.  | 
|  NetworkingReady  |  NetworkingReady는 노드의 네트워킹 스택이 올바르게 작동하는지(인터페이스, 라우팅, 연결)를 나타냅니다.  | 
|  StorageReady  |  StorageReady는 노드의 스토리지 하위 시스템이 올바르게 작동하는지(디스크, 파일 시스템, I/O)를 나타냅니다.  | 
|  준비됨  |  Ready는 노드가 정상이고 포드를 수락할 준비가 되었음을 나타내는 표준 Kubernetes 조건입니다.  | 

## 자동 노드 복구
<a name="node-auto-repair"></a>

EKS 자동 노드 복구는 노드 상태를 지속적으로 모니터링하고 감지된 문제에 대응하며 가능하면 노드를 교체하거나 재부팅합니다. 이를 통해 수동 개입을 최소화하면서 클러스터 신뢰성을 개선하고 애플리케이션 가동 중지 시간을 줄일 수 있습니다.

EKS 자동 노드 복구는 자체적으로 kubelet, 수동으로 삭제된 노드 객체 및 클러스터에 조인하지 못한 EKS 관리형 노드 그룹 인스턴스의 `Ready` 조건에 대응합니다. 노드 모니터링 에이전트가 설치된 상태에서 EKS 자동 노드 복구가 활성화되면 EKS 자동 노드 복구는 `AcceleratedHardwareReady`, `ContainerRuntimeReady`, `KernelReady`, `NetworkingReady`, `StorageReady`와 같은 추가 노드 조건에 대응합니다.

EKS 자동 노드 복구는 표준 Kubernetes `DiskPressure`, `MemoryPressure` 또는 `PIDPressure` 노드 조건에 대응하지 않습니다. 이러한 조건은 종종 노드 수준 장애가 아닌 애플리케이션 동작, 워크로드 구성 또는 리소스 제한 관련 문제를 나타내기 때문에 적절한 기본 복구 작업을 결정하기가 어렵습니다. 이러한 시나리오에서 워크로드는 Kubernetes [노드 압력 제거 동작](https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction)을 따릅니다.

EKS 자동 노드 복구에 대한 자세한 내용은 [EKS 클러스터에서 노드 자동 복구](node-repair.md) 섹션을 참조하세요.

**Topics**

# EKS 노드 모니터링 에이전트에서 노드 상태 문제 감지
<a name="node-health-nma"></a>

이 주제에서는 EKS 노드 모니터링 에이전트에서 감지한 노드 상태 문제, 이러한 문제가 노드 조건 또는 이벤트로 표시되는 방법, 노드 모니터링 에이전트를 구성하는 방법을 자세히 설명합니다.

EKS 노드 모니터링 에이전트는 EKS 자동 노드 복구와 함께 또는 이 기능 없이도 사용할 수 있습니다. EKS 자동 노드 복구에 대한 자세한 내용은 [EKS 클러스터에서 노드 자동 복구](node-repair.md) 섹션을 참조하세요.

EKS 노드 모니터링 에이전트의 소스 코드는 GitHub의 [aws/eks-node-monitoring-agent](https://github.com/aws/eks-node-monitoring-agent) 리포지토리에 게시되어 있습니다.

## 노드 상태 문제
<a name="node-health-issues"></a>

다음 표에서는 노드 모니터링 에이전트가 감지할 수 있는 노드 상태 문제를 설명합니다. 두 가지 문제가 있습니다.
+ 조건-인스턴스 교체 또는 재부팅과 같은 문제 해결 작업이 필요한 터미널 문제입니다. 자동 복구가 활성화되면 Amazon EKS는 노드 교체 또는 재부팅으로 복구 작업을 수행합니다. 자세한 내용은 [노드 조건](learn-status-conditions.md#status-node-conditions) 섹션을 참조하세요.
+ 이벤트-일시적인 문제 또는 최적이 아닌 노드 구성입니다. 자동 복구 작업은 수행되지 않습니다. 자세한 내용은 [노드 이벤트](learn-status-conditions.md#status-node-events) 섹션을 참조하세요.

## AcceleratedHardware 노드 상태 문제
<a name="node-health-AcceleratedHardware"></a>

다음 표에서 심각도가 '조건'인 문제에 대한 모니터링 조건은 `AcceleratedHardwareReady`입니다. 아래 표의 이벤트 및 조건은 NVIDIA 및 Neuron 관련 노드 상태 문제에 대한 항목입니다.


| 이름 | 심각도 | 설명 | 복구 작업 | 
| --- | --- | --- | --- | 
|  DCGMDiagnosticFailure  |  조건  |  DCGM 활성 진단 테스트 제품군의 테스트 사례가 실패했습니다.  |  없음  | 
|  DCGMError  |  조건  |  DCGM 호스트 프로세스에 대한 연결이 끊어졌거나 해당 연결을 설정할 수 없습니다.  |  없음  | 
|  DCGMFieldError[Code]  |  Event  |  DCGM이 필드 식별자를 통해 GPU 성능 저하를 감지했습니다.  |  없음  | 
|  DCGMHealthCode[Code]  |  Event  |  DCGM 상태 확인이 치명적이지 않은 방식으로 실패했습니다.  |  없음  | 
|  DCGMHealthCode[Code]  |  조건  |  DCGM 상태 확인이 치명적인 방식으로 실패했습니다.  |  없음  | 
|  NeuronDMAError  |  조건  |  DMA 엔진에서 복구할 수 없는 오류가 발생했습니다.  |  Replace  | 
|  NeuronHBMUncorrectableError  |  조건  |  HBM에서 수정할 수 없는 오류가 발생하여 잘못된 결과가 발생했습니다.  |  Replace  | 
|  NeuronNCUncorrectableError  |  조건  |  Neuron Core의 수정 불가능한 메모리 오류가 감지되었습니다.  |  Replace  | 
|  NeuronSRAMUncorrectableError  |  조건  |  온칩 SRAM에 패리티 오류가 발생하여 잘못된 결과가 발생했습니다.  |  Replace  | 
|  NvidiaDeviceCountMismatch  |  Event  |  NVML을 통해 표시되는 GPU 수가 파일 시스템의 NVIDIA 디바이스 수와 일치하지 않습니다.  |  없음  | 
|  NvidiaDoubleBitError  |  조건  |  GPU 드라이버에서 더블 비트 오류가 발생했습니다.  |  Replace  | 
|  NvidiaNCCLError  |  Event  |  NVIDIA Collective Communications 라이브러리(`libnccl`)에서 segfault가 발생했습니다.  |  없음  | 
|  NvidiaNVLinkError  |  조건  |  GPU 드라이버에서 NVLink 오류가 보고되었습니다.  |  Replace  | 
|  NvidiaPCIeError  |  Event  |  전송 오류를 복구하기 위해 PCIe 재생이 트리거되었습니다.  |  없음  | 
|  NvidiaPageRetirement  |  Event  |  GPU 드라이버가 사용 중지를 위해 메모리 페이지를 표시했습니다. 동일한 주소에 단일 더블 비트 오류가 있거나 두 개의 단일 비트 오류가 발생하는 경우 이 문제가 발생할 수 있습니다.  |  없음  | 
|  NvidiaPowerError  |  Event  |  GPU의 전력 사용률이 허용된 임계치를 위반했습니다.  |  없음  | 
|  NvidiaThermalError  |  Event  |  GPU의 열 상태가 허용된 임계치를 위반했습니다.  |  없음  | 
|  NvidiaXID[Code]Error  |  조건  |  심각한 GPU 오류가 발생했습니다.  |  교체 또는 재부팅  | 
|  NvidiaXID[Code]Warning  |  Event  |  심각하지 않은 GPU 오류가 발생했습니다.  |  없음  | 

## NVIDIA XID 오류 코드
<a name="nvidia-xid-codes"></a>

노드 모니터링 에이전트는 GPU 커널 로그에서 NVIDIA XID 오류를 감지합니다. XID 오류는 다음 두 가지 카테고리로 구분됩니다.
+  **잘 알려진 XID 코드** - 활성화된 경우 노드 조건(`AcceleratedHardwareReady=False`)을 설정하고 자동 복구를 트리거하는 심각한 오류입니다. 이유 코드 형식은 `NvidiaXID[Code]Error`입니다. EKS 노드 모니터링 에이전트가 감지하는 잘 알려진 XID 코드는 복구 작업이 필요한 NVIDIA XID 코드의 전체 목록을 나타내지 않을 수 있습니다.
+  **알 수 없는 XID 코드** - Kubernetes 이벤트로만 로깅됩니다. 자동 복구를 트리거하지 않습니다. 이유 코드 형식은 `NvidiaXID[Code]Warning`입니다. 알 수 없는 XID 오류를 조사하려면 `dmesg | grep -i nvrm`을 사용하여 커널 로그를 검토합니다.

XID 오류에 대한 자세한 내용은 *NVIDIA GPU 배포 및 관리 설명서*의 [Xid Errors](https://docs.nvidia.com/deploy/xid-errors/index.html#topic_5_1)를 참조하세요. 개별 XID 메시지에 대한 자세한 내용은 *NVIDIA GPU 배포 및 관리 설명서*의 [Understanding Xid Messages](https://docs.nvidia.com/deploy/gpu-debug-guidelines/index.html#understanding-xid-messages)를 참조하세요.

다음 표에는 잘 알려진 XID 코드, 해당 의미 및 활성화된 경우 기본 노드 복구 작업이 나열되어 있습니다.


| XID 코드 | 설명 | 복구 작업 | 
| --- | --- | --- | 
|  13  |  그래픽 엔진 예외 - 일반적으로 소프트웨어 문제 또는 드라이버 버그로 인해 라생한 GPU 그래픽 엔진 오류가 발생했습니다.  |  재부팅  | 
|  31  |  GPU 메모리 페이지 장애 - 애플리케이션이 매핑되지 않았거나 액세스할 수 없는 GPU 메모리에 액세스하려고 시도했습니다.  |  재부팅  | 
|  48  |  더블 비트 ECC 오류 - GPU 메모리에서 수정 불가능한 더블 비트 오류가 발생했으며, 이는 잠재적 하드웨어 성능 저하를 나타냅니다.  |  재부팅  | 
|  63  |  GPU 메모리 다시 매핑 이벤트 - GPU 드라이버가 감지된 오류로 인해 GPU 메모리의 일부를 다시 매핑했습니다. 이는 종종 복구 가능합니다.  |  재부팅  | 
|  64  |  GPU 메모리 다시 매핑 실패 - GPU가 결함이 있는 메모리를 다시 매핑할 수 없으며, 이는 하드웨어 문제를 나타냅니다.  |  재부팅  | 
|  74  |  NVLink 오류 - GPU 간 고속 NVLink 상호 연결에서 오류가 발생했습니다.  |  Replace  | 
|  79  |  GPU가 버스에서 빠짐 - PCIe를 통해 GPU에 더 이상 액세스할 수 없으며, 이는 일반적으로 하드웨어 장애 또는 전원 문제를 나타냅니다.  |  Replace  | 
|  94  |  격리된 메모리 오류 - 메모리 오류가 발생했지만 격리되어 다른 애플리케이션에 영향을 미치지 않았습니다.  |  재부팅  | 
|  95  |  격리되지 않은 메모리 오류 - 다른 애플리케이션 또는 시스템 메모리에 영향을 미칠 수 있는 메모리 오류가 발생했습니다.  |  재부팅  | 
|  119  |  GSP RPC 제한 시간 - GPU 시스템 프로세서와의 통신이 잠재적으로 펌웨어 문제로 인해 제한 시간을 초과했습니다.  |  Replace  | 
|  120  |  GSP 오류 - GPU 시스템 프로세서에서 오류가 발생했습니다.  |  Replace  | 
|  121  |  C2C 오류 - 칩 간 상호 연결(다중 다이 GPU에서 사용됨)에서 오류가 발생했습니다.  |  Replace  | 
|  140  |  ECC 복구되지 않음 오류 - ECC 오류가 격리 상태에서 해제되어 데이터가 손상되었을 수 있습니다.  |  Replace  | 

GPU 상태와 관련된 현재 노드 조건을 보려면 다음 명령을 실행합니다.

```
kubectl get nodes -o custom-columns='NAME:.metadata.name,ACCELERATOR_READY:.status.conditions[?(@.type=="AcceleratedHardwareReady")].status,REASON:.status.conditions[?(@.type=="AcceleratedHardwareReady")].reason'
```

클러스터에서 XID 관련 이벤트를 보려면 다음 명령 중 하나를 실행합니다.

```
kubectl get events | grep -i "NvidiaXID"
```

## ContainerRuntime 노드 상태 문제
<a name="node-health-ContainerRuntime"></a>

다음 표에서 심각도가 '조건'인 문제에 대한 모니터링 조건은 `ContainerRuntimeReady`입니다.


| 이름 | 심각도 | 설명 | 복구 작업 | 
| --- | --- | --- | --- | 
|  ContainerRuntimeFailed  |  Event  |  컨테이너 런타임이 컨테이너를 생성하지 못했습니다. 반복적으로 발생하는 경우 보고된 문제와 관련이 있을 수 있습니다.  |  없음  | 
|  DeprecatedContainerdConfiguration  |  Event  |  사용 중단된 이미지 매니페스트 버전 2, 스키마 1을 사용하는 컨테이너 이미지인 스키마가 최근 `containerd`를 통해 노드로 풀링되었습니다.  |  없음  | 
|  KubeletFailed  |  Event  |  kubelet이 실패 상태가 되었습니다.  |  없음  | 
|  LivenessProbeFailures  |  Event  |  활성 프로브 장애가 감지되었습니다. 반복해서 발생하는 경우 애플리케이션 코드 문제 또는 불충분한 제한 시간 값을 나타낼 수 있습니다.  |  없음  | 
|  PodStuckTerminating  |  조건  |  포드가 과도한 시간 동안 종료되지 않거나 중단되었습니다. 이는 포드 상태 진행을 방지하는 CRI 오류로 인해 발생할 수 있습니다.  |  Replace  | 
|  ReadinessProbeFailures  |  Event  |  준비 상태 프로브 장애가 감지되었습니다. 반복적으로 발생하는 경우 애플리케이션 코드 문제 또는 불충분한 제한 시간 값을 나타낼 수 있습니다.  |  없음  | 
|  [Name]RepeatedRestart  |  Event  |  시스템 장치가 자주 다시 시작됩니다.  |  없음  | 
|  ServiceFailedToStart  |  Event  |  systemd 단위를 시작하지 못했습니다.  |  없음  | 

## 커널 노드 상태 문제
<a name="node-health-Kernel"></a>

다음 표에서 심각도가 '조건'인 문제에 대한 모니터링 조건은 `KernelReady`입니다.


| 이름 | 심각도 | 설명 | 복구 작업 | 
| --- | --- | --- | --- | 
|  AppBlocked  |  Event  |  일반적으로 입력 또는 출력에서 차단되어 일정 예약에서 장시간 동안 작업이 차단되었습니다.  |  없음  | 
|  AppCrash  |  Event  |  노드의 애플리케이션이 충돌했습니다.  |  없음  | 
|  ApproachingKernelPidMax  |  Event  |  프로세스 수가 현재 `kernel.pid_max` 설정당 사용 가능한 최대 PID 수에 근접하고 있습니다. 이 값을 초과하면 더 이상 프로세스를 시작할 수 없습니다.  |  없음  | 
|  ApproachingMaxOpenFiles  |  Event  |  현재 커널 설정을 고려할 때 열려 있는 파일의 수가 가능한 최대 수에 근접하고 있으며, 그 이후에는 새 파일을 열지 못합니다.  |  없음  | 
|  ConntrackExceededKernel  |  Event  |  연결 추적이 커널의 최댓값을 초과했으며 새 연결을 설정할 수 없어 패킷 손실이 발생할 수 있습니다.  |  없음  | 
|  ExcessiveZombieProcesses  |  Event  |  완전히 회수할 수 없는 프로세스가 많은 수로 누적되고 이는 애플리케이션 문제를 나타내며 시스템 프로세스 제한에 도달할 수 있습니다.  |  없음  | 
|  ForkFailedOutOfPIDs  |  조건  |  시스템이 프로세스 ID 또는 메모리를 벗어났기 때문에 포크 또는 실행 직접 호출이 실패했습니다. 이는 좀비 프로세스 또는 물리적 메모리 소진으로 인해 발생할 수 있습니다.  |  Replace  | 
|  KernelBug  |  Event  |  Linux 커널 자체에서 커널 버그가 감지 및 보고되었지만, 이는 CPU 또는 메모리 사용량이 높은 노드로 인해 발생할 수 있으며 이벤트 처리가 지연될 수 있습니다.  |  없음  | 
|  LargeEnvironment  |  Event  |  이 프로세스의 환경 변수 수는 예상보다 많으며, 이는 `enableServiceLinks`가 true로 설정된 많은 서비스에서 발생할 수 있습니다. 이로 인해 성능 문제가 발생할 수 있습니다.  |  없음  | 
|  RapidCron  |  Event  |  cron 작업이 이 노드에서 5분 간격보다 빠르게 실행되고 있어 작업이 상당한 리소스를 소비하면 성능에 영향을 줄 수 있습니다.  |  없음  | 
|  SoftLockup  |  Event  |  CPU가 지정된 시간 동안 중지되었습니다.  |  없음  | 

## 네트워킹 노드 상태 문제
<a name="node-health-Networking"></a>

다음 표에서 심각도가 '조건'인 문제에 대한 모니터링 조건은 `NetworkingReady`입니다.


| 이름 | 심각도 | 설명 | 복구 작업 | 
| --- | --- | --- | --- | 
|  BandwidthInExceeded  |  Event  |  인바운드 집계 대역폭이 인스턴스의 최댓값을 초과하여 패킷이 대기열에 추가되거나 손실되었습니다.  |  없음  | 
|  BandwidthOutExceeded  |  Event  |  아웃바운드 집계 대역폭이 인스턴스의 최댓값을 초과하여 패킷이 대기열에 추가되거나 손실되었습니다.  |  없음  | 
|  ConntrackExceeded  |  Event  |  연결 추적이 인스턴스의 최댓값을 초과했으며 새 연결을 설정할 수 없어 패킷 손실이 발생할 수 있습니다.  |  없음  | 
|  EFAErrorMetric  |  Event  |  EFA 드라이버 지표는 성능이 저하된 인터페이스가 있음을 보여줍니다.  |  없음  | 
|  IPAMDInconsistentState  |  Event  |  디스크의 IPAMD 체크포인트 상태는 컨테이너 런타임의 IP를 반영하지 않습니다.  |  없음  | 
|  IPAMDNoIPs  |  Event  |  IPAMD에 IP 주소가 없습니다.  |  없음  | 
|  IPAMDNotReady  |  조건  |  IPAMD가 API 서버에 연결되지 않습니다.  |  Replace  | 
|  IPAMDNotRunning  |  조건  |  Amazon VPC CNI 프로세스가 실행 중인 것으로 확인되지 않았습니다.  |  Replace  | 
|  IPAMDRepeatedlyRestart  |  Event  |  IPAMD 서비스에서 여러 번 다시 시작되었습니다.  |  없음  | 
|  InterfaceNotRunning  |  조건  |  이 인터페이스가 실행 중이 아니거나 네트워크 문제가 있는 것 같습니다.  |  Replace  | 
|  InterfaceNotUp  |  조건  |  이 인터페이스가 작동하지 않거나 네트워크 문제가 있는 것 같습니다.  |  Replace  | 
|  KubeProxyNotReady  |  Event  |  Kube-proxy가 리소스를 감시하거나 나열하지 못했습니다.  |  없음  | 
|  LinkLocalExceeded  |  Event  |  로컬 프록시 서비스에 대한 트래픽의 PPS가 네트워크 인터페이스의 최댓값을 초과하여 패킷이 손실되었습니다.  |  없음  | 
|  MACAddressPolicyMisconfigured  |  Event  |  systemd-networkd 링크 구성의 `MACAddressPolicy` 값이 잘못되었습니다.  |  없음  | 
|  MissingDefaultRoutes  |  Event  |  기본 라우팅 규칙이 누락되었습니다.  |  없음  | 
|  MissingIPRoutes  |  Event  |  포드 IP에 대한 경로가 누락되었습니다.  |  없음  | 
|  MissingIPRules  |  Event  |  포드 IP에 대한 규칙이 누락되었습니다.  |  없음  | 
|  MissingLoopbackInterface  |  조건  |  루프백 인터페이스가 이 인스턴스에서 누락되어 로컬 연결에 따라 서비스가 실패하게 됩니다.  |  Replace  | 
|  NetworkSysctl  |  Event  |  이 노드의 네트워크 `sysctl` 설정이 잘못되었을 수 있습니다.  |  없음  | 
|  PPSExceeded  |  Event  |  양방향 PPS가 인스턴스의 최댓값을 초과하여 패킷이 대기열에 추가되거나 손실되었습니다.  |  없음  | 
|  PortConflict  |  Event  |  포드가 hostPort를 사용하는 경우 호스트의 이미 바인딩된 포트를 재정의하는 `iptables` 규칙을 작성할 수 있으므로 API 서버가 `kubelet`에 액세스하지 못할 수 있습니다.  |  없음  | 
|  UnexpectedRejectRule  |  Event  |  예상치 못한 `REJECT` 또는 `DROP` 규칙이 `iptables`에서 발견되어 예상 트래픽을 차단할 수 있습니다.  |  없음  | 

## 스토리지 노드 상태 문제
<a name="node-health-Storage"></a>

다음 표에서 심각도가 '조건'인 문제에 대한 모니터링 조건은 `StorageReady`입니다.


| 이름 | 심각도 | 설명 | 복구 작업 | 
| --- | --- | --- | --- | 
|  EBSInstanceIOPSExceeded  |  Event  |  인스턴스에 대한 최대 IOPS를 초과했습니다.  |  없음  | 
|  EBSInstanceThroughputExceeded  |  Event  |  인스턴스에 대한 최대 처리량을 초과했습니다.  |  없음  | 
|  EBSVolumeIOPSExceeded  |  Event  |  특정 EBS 볼륨에 대한 최대 IOPS를 초과했습니다.  |  없음  | 
|  EBSVolumeThroughputExceeded  |  Event  |  특정 Amazon EBS 볼륨에 대한 최대 처리량을 초과했습니다.  |  없음  | 
|  EtcHostsMountFailed  |  Event  |  `kubelet-container` 작업 중 `/var/lib/kubelet/pods`를 다시 탑재하는 사용자 데이터로 인해 kubelet에서 생성한 `/etc/hosts`를 탑재하지 못했습니다.  |  없음  | 
|  IODelays  |  Event  |  프로세스에서 입력 또는 출력 지연이 감지되었으며, 이는 과도한 경우 입력-출력 프로비저닝이 부족할 수 있음을 나타냅니다.  |  없음  | 
|  KubeletDiskUsageSlow  |  Event  |  `kubelet`이 파일 시스템에 액세스하려고 시도하는 동안 느린 디스크 사용량을 보고합니다. 이는 디스크 입력-출력 부족 또는 파일 시스템 문제를 나타낼 수 있습니다.  |  없음  | 
|  XFSSmallAverageClusterSize  |  Event  |  XFS Average Cluster 크기는 작으며 이는 과도한 여유 공간 조각화를 나타냅니다. 이 경우 사용 가능한 inode 또는 여유 공간에도 불구하고 파일이 생성되지 않을 수 있습니다.  |  없음  | 

## 노드 모니터링 에이전트 구성
<a name="node-monitoring-agent-configure"></a>

EKS 노드 모니터링 에이전트는 DaemonSet로 배포됩니다. EKS 추가 기능으로 배포하는 경우 다음 구성 값으로 설치를 사용자 지정할 수 있습니다. 기본 구성은 EKS 노드 모니터링 에이전트 [헬름 차트](https://github.com/aws/eks-node-monitoring-agent/blob/main/charts/eks-node-monitoring-agent/values.yaml)를 참조하세요.


| 구성 옵션 | 설명 | 
| --- | --- | 
|   `monitoringAgent.resources.requests.cpu`   |  모니터링 에이전트에 대한 CPU 리소스 요청입니다.  | 
|   `monitoringAgent.resources.requests.memory`   |  모니터링 에이전트에 대한 메모리 리소스 요청입니다.  | 
|   `monitoringAgent.resources.limits.cpu`   |  모니터링 에이전트에 대한 CPU 리소스 제한입니다.  | 
|   `monitoringAgent.resources.limits.memory`   |  모니터링 에이전트에 대한 메모리 리소스 제한입니다.  | 
|   `monitoringAgent.tolerations`   |  테인트된 노드에서 모니터링 에이전트를 예약하기 위한 허용 오차입니다.  | 
|   `monitoringAgent.additionalArgs`   |  모니터링 에이전트에 전달할 추가 명령줄 인수입니다.  | 

**참고**  
EKS 추가 기능 또는 헬름 설치를 사용하여 `hostname-override` 및 `verbosity`를 `monitoringAgent.additionalArgs`로 구성할 수 있습니다. 현재 EKS 추가 기능 또는 헬름 설치에서 추가 인수를 통해 노드 모니터링 에이전트의 `probe-address`(`8002`) 또는 `metrics-address`(`8003`)를 사용자 지정할 수 없습니다.

노드 모니터링 에이전트에는 NVIDIA GPU를 모니터링하기 위한 NVIDIA 데이터 센터 GPU 관리자(DCGM) 서버 구성 요소(`nv-hostengine`)가 포함되어 있습니다. 이 구성 요소는 에이전트의 [헬름 차트](https://github.com/aws/eks-node-monitoring-agent/blob/main/charts/eks-node-monitoring-agent/values.yaml)에서 `nodeAffinity`에 표시된 대로 NVIDIA GPU 인스턴스 유형인 노드에서만 실행됩니다. EKS 노드 모니터링 에이전트와 함께 기존 NVIDIA DCGM 설치를 사용할 수 없습니다. 이 기능이 필요한 경우 EKS 로드맵 [GitHub 문제 2763](https://github.com/aws/containers-roadmap/issues/2763)에 대한 피드백을 제공하세요.

EKS 노드 모니터링 에이전트를 EKS 추가 기능으로 배포하는 경우 다음 구성 값으로 NVIDIA DCGM 설치를 사용자 지정할 수 있습니다.


| 구성 옵션 | 설명 | 
| --- | --- | 
|   `dcgmAgent.resources.requests.cpu`   |  DCGM 에이전트에 대한 CPU 리소스 요청입니다.  | 
|   `dcgmAgent.resources.requests.memory`   |  DCGM 에이전트에 대한 메모리 리소스 요청입니다.  | 
|   `dcgmAgent.resources.limits.cpu`   |  DCGM 에이전트에 대한 CPU 리소스 제한입니다.  | 
|   `dcgmAgent.resources.limits.memory`   |  DCGM 에이전트에 대한 메모리 리소스 제한입니다.  | 
|   `dcgmAgent.tolerations`   |  테인트된 노드에서 DCGM 에이전트를 예약하기 위한 허용 오차입니다.  | 

다음 AWS CLI 명령을 사용하여 EKS 노드 모니터링 에이전트 EKS 추가 기능의 버전 및 스키마에 대한 유용한 정보를 얻을 수 있습니다.

Kubernetes 버전의 최신 에이전트 추가 기능 버전을 가져옵니다. `1.35`를 Kubernetes 버전으로 바꿉니다.

```
aws eks describe-addon-versions \
  --addon-name eks-node-monitoring-agent \
  --kubernetes-version 1.35 \
  --query='addons[].addonVersions[].addonVersion'
```

EKS 추가 기능에서 지원되는 에이전트 추가 기능 스키마를 가져옵니다. `v1.5.1-eksbuild.1`을 에이전트 버전으로 바꿉니다.

```
aws eks describe-addon-configuration \
  --addon-name eks-node-monitoring-agent \
  --addon-version v1.5.1-eksbuild.1
```

# EKS 클러스터에서 노드 자동 복구
<a name="node-repair"></a>

이 주제에서는 EKS 자동 노드 복구 동작과 요구 사항에 맞게 이 기능을 구성하는 방법을 자세히 설명합니다. EKS 자동 노드 복구는 EKS Auto Mode에서 기본적으로 활성화되며 EKS 관리형 노드 그룹 및 Karpenter와 함께 사용할 수 있습니다.

기본 EKS 자동 노드 복구 작업은 아래 표에 요약되어 있으며 EKS Auto Mode, EKS 관리형 노드 그룹 및 Karpenter의 동작에 적용됩니다. EKS Auto Mode 또는 Karpenter를 사용하는 경우 모든 `AcceleratedHardwareReady` 복구 작업은 `Replace`이며 EKS 관리형 노드 그룹만 복구 작업으로 `Reboot`를 지원합니다.

EKS 노드 모니터링 에이전트에서 감지한 노드 상태 문제 및 해당 노드 복구 작업의 상세 목록은 [EKS 노드 모니터링 에이전트에서 노드 상태 문제 감지](node-health-nma.md) 섹션을 참조하세요.


| 노드 조건 | 설명 | 다음 이후에 복구 | 복구 작업 | 
| --- | --- | --- | --- | 
|  AcceleratedHardwareReady  |  AcceleratedHardwareReady는 노드의 가속 하드웨어(GPU, Neuron)가 올바르게 작동하는지를 나타냅니다.  |  10m  |  교체 또는 재부팅  | 
|  ContainerRuntimeReady  |  ContainerRuntimeReady는 컨테이너 런타임(Containered 등)이 올바르게 작동하고 컨테이너를 실행할 수 있는지를 나타냅니다.  |  30m  |  Replace  | 
|  DiskPressure  |  DiskPressure는 노드에서 디스크 압력(디스크 공간 부족 또는 높은 I/O)이 발생하고 있음을 나타내는 표준 Kubernetes 조건입니다.  |  해당 사항 없음  |  없음  | 
|  KernelReady  |  KernelReady는 커널이 심각한 오류, 패닉 또는 리소스 소진 없이 올바르게 작동하는지를 나타냅니다.  |  30m  |  Replace  | 
|  MemoryPressure  |  MemoryPressure는 노드에서 메모리 압력(사용 가능한 메모리 부족)이 발생하고 있음을 나타내는 표준 Kubernetes 조건입니다.  |  해당 사항 없음  |  없음  | 
|  NetworkingReady  |  NetworkingReady는 노드의 네트워킹 스택이 올바르게 작동하는지(인터페이스, 라우팅, 연결)를 나타냅니다.  |  30m  |  Replace  | 
|  StorageReady  |  StorageReady는 노드의 스토리지 하위 시스템이 올바르게 작동하는지(디스크, 파일 시스템, I/O)를 나타냅니다.  |  30m  |  Replace  | 
|  준비됨  |  Ready는 노드가 정상이고 포드를 수락할 준비가 되었음을 나타내는 표준 Kubernetes 조건입니다.  |  30m  |  Replace  | 

EKS 자동 노드 복구 작업은 기본적으로 다음 시나리오에서 비활성화됩니다. 진행 중인 노드 복구 작업은 각 시나리오에서 계속됩니다. 이러한 기본 설정을 재정의하는 방법은 [자동 노드 복구 구성](#configure-node-repair) 섹션을 참조하세요.

 **EKS 관리형 노드 그룹** 
+ 노드 그룹에는 노드가 5개 넘게 있고 노드 그룹의 노드 중 20% 넘게 비정상 상태입니다.
+ 클러스터의 영역 전환은 Application Recovery Controller(ARC)를 통해 트리거됩니다.

 **EKS Auto Mode 및 Karpenter** 
+ NodePool의 노드 중 20% 넘게 비정상 상태입니다.
+ 독립 실행형 NodeClaims의 경우 클러스터의 노드 중 20%가 비정상 상태입니다.

## 자동 노드 복구 구성
<a name="configure-node-repair"></a>

EKS Auto Mode를 사용하는 경우 자동 노드 복구를 구성할 수 없으며, 항상 Karpenter와 동일한 기본 설정으로 활성화됩니다.

### Karpenter
<a name="configure-node-repair-karpenter"></a>

Karpenter에서 자동 노드 복구를 사용하려면 `NodeRepair=true` 기능 게이트를 활성화합니다. `--feature-gates` CLI 옵션 또는 Karpenter 배포의 `FEATURE_GATES` 환경 변수를 통해 기능 게이트를 활성화할 수 있습니다. 자세한 내용은 [Karpenter](https://karpenter.sh/docs/concepts/disruption/#node-auto-repair) 설명서를 참조하세요.

### 관리형 노드 그룹
<a name="configure-node-repair-mng"></a>

새 EKS 관리형 노드 그룹을 생성하는 경우 또는 기존 EKS 관리형 노드 그룹을 업데이트하여 자동 노드 복구를 활성화할 수 있습니다.
+  **Amazon EKS 콘솔** - 관리형 노드 그룹에 대해 **노드 자동 복구 활성화** 확인란을 선택합니다. 자세한 내용은 [클러스터에 대한 관리형 노드 그룹 생성](create-managed-node-group.md) 섹션을 참조하세요.
+  **AWS CLI** – [https://docs.aws.amazon.com/cli/latest/reference/eks/create-nodegroup.html](https://docs.aws.amazon.com/cli/latest/reference/eks/create-nodegroup.html) 또는 [https://docs.aws.amazon.com/cli/latest/reference/eks/update-nodegroup-config.html](https://docs.aws.amazon.com/cli/latest/reference/eks/update-nodegroup-config.html) 명령에 `--node-repair-config enabled=true`를 추가합니다.
+  **eksctl** – `managedNodeGroups.nodeRepairConfig.enabled: true`를 구성합니다. [eksctl GitHub](https://github.com/eksctl-io/eksctl/blob/main/examples/44-node-repair.yaml)의 예제를 참조하세요.

EKS 관리형 노드 그룹을 사용하는 경우 다음 설정을 기반으로 노드 자동 복구 동작을 제어할 수 있습니다.

노드 자동 복구가 작업 수행을 중지하는 시점을 제어하려면 노드 그룹에서 비정상 노드 수를 기반으로 임계치를 설정합니다. 절대 수 또는 백분율을 설정합니다. 단, 둘 다 설정할 수는 없습니다.


| 설정 | 설명 | 
| --- | --- | 
|   `maxUnhealthyNodeThresholdCount`   |  노드 자동 복구가 중지되는 비정상 노드의 절대 수입니다. 이를 사용하여 복구 범위를 제한합니다.  | 
|   `maxUnhealthyNodeThresholdPercentage`   |  노드 자동 복구가 중지되는 비정상 노드의 백분율(0\$1100)입니다.  | 

동시에 복구되는 노드 수를 제어하기 위해 복구 병렬 처리를 구성할 수 있습니다. 비정상 노드 임계치와 마찬가지로 절대 수 또는 백분율을 설정합니다. 단, 둘 다 설정할 수는 없습니다.


| 설정 | 설명 | 
| --- | --- | 
|   `maxParallelNodesRepairedCount`   |  동시에 복구할 최대 노드 수입니다.  | 
|   `maxParallelNodesRepairedPercentage`   |  동시에 복구할 비정상 노드의 최대 비율(0\$1100)입니다.  | 

`nodeRepairConfigOverrides`를 사용하면 특정 조건에 맞게 복구 동작을 사용자 지정할 수 있습니다. 다른 문제 유형에 대해 다른 복구 작업 또는 대기 시간이 필요한 경우 이 옵션을 사용합니다.

재정의마다 다음 필드가 모두 필요합니다.


| 필드 | 설명 | 
| --- | --- | 
|   `nodeMonitoringCondition`   |  노드 모니터링 에이전트가 보고하는 비정상 조건입니다. 예: `AcceleratedHardwareReady`, `NetworkingReady`, `StorageReady`, `KernelReady`.  | 
|   `nodeUnhealthyReason`   |  비정상 조건에 대한 특정 사유 코드입니다. 예시: `NvidiaXID31Error`, `IPAMDNotRunning`.  | 
|   `minRepairWaitTimeMins`   |  노드가 복구에 적합한 자격을 갖추기 전에 조건을 지속해야 하는 최소 시간(분)입니다. 일시적인 문제로 노드를 복구하지 않으려면 이 옵션을 사용합니다.  | 
|   `repairAction`   |  조건이 충족되면 수행할 작업입니다. 유효한 값: `Replace`(노드 종료 및 교체), `Reboot`(노드 재부팅) 또는 `NoAction`(복구 작업 없음).  | 

다음 AWS CLI 예제에서는 사용자 지정 복구 설정을 사용하여 노드 그룹을 생성합니다.

```
aws eks create-nodegroup \
  --cluster-name my-cluster \
  --nodegroup-name my-nodegroup \
  --node-role arn:aws:iam::111122223333:role/NodeRole \
  --subnets subnet-0123456789abcdef0 \
  --node-repair-config '{
    "enabled": true,
    "maxUnhealthyNodeThresholdPercentage": 10,
    "maxParallelNodesRepairedCount": 3,
    "nodeRepairConfigOverrides": [
      {
        "nodeMonitoringCondition": "AcceleratedHardwareReady",
        "nodeUnhealthyReason": "NvidiaXID64Error",
        "minRepairWaitTimeMins": 5,
        "repairAction": "Replace"
      },
      {
        "nodeMonitoringCondition": "AcceleratedHardwareReady",
        "nodeUnhealthyReason": "NvidiaXID31Error",
        "minRepairWaitTimeMins": 15,
        "repairAction": "NoAction"
      }
    ]
  }'
```

이 구성에서는 다음을 수행합니다.
+ 노드 자동 복구 활성화
+ 노드의 10% 넘게 비정상 상태일 때 복구 작업 중지
+ 한 번에 최대 3개의 노드 복구
+ 5분 후에 노드를 교체하도록 XID 64 오류(GPU 메모리 재매핑 실패)를 재정의합니다. 기본값은 10분 후 재부팅입니다.
+ 아무 작업도 수행하지 않도록 XID 31 오류(GPU 메모리 페이지 오류)를 재정의합니다. 기본값은 10분 후 재부팅입니다.

# 노드의 상태 보기
<a name="learn-status-conditions"></a>

이 주제에서는 Amazon EKS 클러스터에서 노드 상태 모니터링에 사용할 수 있는 도구와 방법을 설명합니다. 관련 정보에는 노드 수준 문제를 식별하고 진단하는 데 도움이 되는 노드 조건, 이벤트, 감지 사례가 포함됩니다. 여기에 설명된 명령과 패턴을 사용하여 노드 상태 리소스를 검사하고, 상태 조건을 해석하고, 운영 문제 해결을 위해 노드 이벤트를 분석할 수 있습니다.

모든 노드에 대한 Kubernetes 명령을 사용하여 일부 노드 상태 정보를 가져올 수 있습니다. 또한 Amazon EKS Auto Mode 또는 Amazon EKS 관리형 추가 기능을 통해 노드 모니터링 에이전트를 사용하는 경우 문제 해결에 도움이 되는 더욱 다양한 노드 신호를 얻을 수 있습니다. 노드 모니터링 에이전트에서 감지된 상태 문제에 대한 설명은 관찰성 대시보드에서도 확인할 수 있습니다. 자세한 내용은 [EKS 노드 모니터링 에이전트에서 노드 상태 문제 감지](node-health-nma.md) 섹션을 참조하세요.

## 노드 조건
<a name="status-node-conditions"></a>

노드 조건은 인스턴스 교체 또는 재부팅과 같은 문제 해결 작업이 필요한 터미널 문제를 나타냅니다.

 **모든 노드에 대한 조건을 가져오려면:** 

```
kubectl get nodes -o 'custom-columns=NAME:.metadata.name,CONDITIONS:.status.conditions[*].type,STATUS:.status.conditions[*].status'
```

 **특정 노드에 대한 세부 조건을 가져오려면** 

```
kubectl describe node node-name
```

 **정상 노드의 조건 출력 예제:** 

```
  - lastHeartbeatTime: "2024-11-21T19:07:40Z"
    lastTransitionTime: "2024-11-08T03:57:40Z"
    message: Monitoring for the Networking system is active
    reason: NetworkingIsReady
    status: "True"
    type: NetworkingReady
```

 **네트워킹 문제가 있는 비정상 노드의 조건 예제:** 

```
  - lastHeartbeatTime: "2024-11-21T19:12:29Z"
    lastTransitionTime: "2024-11-08T17:04:17Z"
    message: IPAM-D has failed to connect to API Server which could be an issue with
      IPTable rules or any other network configuration.
    reason: IPAMDNotReady
    status: "False"
    type: NetworkingReady
```

## 노드 이벤트
<a name="status-node-events"></a>

노드 이벤트는 일시적인 문제 또는 최적이 아닌 구성을 나타냅니다.

 **노드 모니터링 에이전트가 보고한 모든 이벤트를 가져오려면** 

노드 모니터링 에이전트를 사용할 수 있는 경우 다음 명령을 실행할 수 있습니다.

```
kubectl get events --field-selector=reportingComponent=eks-node-monitoring-agent
```

샘플 출력:

```
LAST SEEN   TYPE      REASON       OBJECT                                              MESSAGE
4s          Warning   SoftLockup   node/ip-192-168-71-251.us-west-2.compute.internal   CPU stuck for 23s
```

 **모든 노드에 대한 이벤트를 가져오려면** 

```
kubectl get events --field-selector involvedObject.kind=Node
```

 **특정 노드에 대한 이벤트를 가져오려면** 

```
kubectl get events --field-selector involvedObject.kind=Node,involvedObject.name=node-name
```

 **이벤트를 실시간으로 보려면** 

```
kubectl get events -w --field-selector involvedObject.kind=Node
```

 **이벤트 출력 예제:** 

```
LAST SEEN   TYPE     REASON           OBJECT         MESSAGE
2m          Warning  MemoryPressure   Node/node-1    Node experiencing memory pressure
5m          Normal   NodeReady        Node/node-1    Node became ready
```

## 일반적인 문제 해결 명령
<a name="status-node-troubleshooting"></a>

```
# Get comprehensive node status
kubectl get node node-name -o yaml

# Watch node status changes
kubectl get nodes -w

# Get node metrics
kubectl top node
```

# kubectl 및 S3를 사용하여 관리형 노드에 대한 노드 로그 검색
<a name="auto-get-logs"></a>

노드 모니터링 에이전트가 있는 Amazon EKS 관리형 노드에 대한 노드 로그를 검색하는 방법을 알아봅니다.

## 사전 조건
<a name="_prerequisites"></a>

다음 항목이 준비되어 있는지 확인합니다.
+ 기존 Amazon EKS 클러스터에 노드 모니터링 에이전트가 있습니다. 자세한 내용은 [노드 상태 문제 감지 및 노드 자동 복구 활성화](node-health.md) 섹션을 참조하세요.
+ 클러스터와의 통신을 위해 `kubectl` 명령줄 도구가 설치 및 구성되어 있습니다.
+ S3 버킷 및 객체를 생성할 수 있는 충분한 권한을 가지고 AWS CLI를 설치하고 로그인했습니다.
+ 최신 버전의 Python 3가 설치되어 있습니다.
+ AWS SDK for Python 3, Boto 3가 설치되어 있습니다.

## 1단계: S3 버킷 대상 생성(선택 사항)
<a name="_step_1_create_s3_bucket_destination_optional"></a>

아직 로그를 저장할 S3 버킷이 없는 경우 한 개를 생성합니다. 다음 AWS CLI 명령을 사용합니다. 버킷은 기본적으로 `private` 액세스 제어 목록으로 설정됩니다. *bucket-name*을 선택한 고유의 버킷 이름으로 바꿉니다.

```
aws s3api create-bucket --bucket <bucket-name>
```

## 2단계: HTTP Put에 대해 미리 서명된 S3 URL 생성
<a name="_step_2_create_pre_signed_s3_url_for_http_put"></a>

Amazon EKS는 HTTP PUT 작업을 수행하여 노드 로그를 지정한 URL로 반환합니다. 이 자습서에서는 미리 서명된 S3 HTTP PUT URL을 생성합니다.

로그는 `.tar.gz` 확장과 함께 gzip tarball로 반환됩니다.

**참고**  
AWS API 또는 SDK를 사용하여 EKS에 대해 미리 서명된 S3 업로드 URL을 생성하고 로그 파일을 업로드해야 합니다. AWS CLI를 사용하여 미리 서명된 S3 업로드 URL을 생성할 수 없습니다.

1. 버킷에서 로그를 저장할 위치를 결정합니다. 예를 들어 *2024-11-12/logs1.tar.gz*를 키로 사용할 수 있습니다.

1. 다음 Python 코드를 *presign-upload.py* 파일에 저장하세요. *<bucket-name>* 및 *<key>*를 바꾸세요. 키는 `.tar.gz`로 끝나야 합니다.

   ```
   import boto3; print(boto3.client('s3').generate_presigned_url(
      ClientMethod='put_object',
      Params={'Bucket': '<bucket-name>', 'Key': '<key>'},
      ExpiresIn=1000
   ))
   ```

1. 스크립트를 실행합니다.

   ```
   python presign-upload.py
   ```

1. URL 출력을 기록해 둡니다. 다음 단계에서 이 값을 *http-put-destination*으로 사용합니다.

자세한 내용은 AWS Boto3 SDK for Python 설명서에서 [Generate a presigned URL to upload a file](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html#generating-a-presigned-url-to-upload-a-file)을 참조하세요.

## 3단계: NodeDiagnostic 리소스 생성
<a name="_step_3_create_nodediagnostic_resource"></a>

로그를 수집할 노드의 이름을 식별합니다.

노드 이름을 리소스 이름으로 사용하고 HTTP PUT URL 대상을 제공하는 `NodeDiagnostic` 매니페스트를 생성합니다.

```
apiVersion: eks.amazonaws.com/v1alpha1
kind: NodeDiagnostic
metadata:
    name: <node-name>
spec:
    logCapture:
        destination: http-put-destination
```

매니페스트를 클러스터에 적용합니다.

```
kubectl apply -f nodediagnostic.yaml
```

`NodeDiagnostic` 리소스를 설명하여 컬렉션 상태를 확인할 수 있습니다.
+ `Success` 또는 `SuccessWithErrors` 상태는 작업이 완료되고 로그가 제공된 대상으로 업로드되었음을 나타냅니다(`SuccessWithErrors`는 일부 로그가 누락되었을 수 있음을 나타냄).
+ 상태가 실패인 경우 업로드 URL이 잘 구성되고 만료되지 않았는지 확인합니다.

```
kubectl describe nodediagnostics.eks.amazonaws.com/<node-name>
```

## 4단계: S3에서 로그 다운로드
<a name="_step_4_download_logs_from_s3"></a>

로그 다운로드를 시도하기 전에 1분 정도 기다립니다. 그런 다음 S3 CLI를 사용하여 로그를 다운로드합니다.

```
# Once NodeDiagnostic shows Success status, download the logs
aws s3 cp s3://<bucket-name>/key ./<path-to-node-logs>.tar.gz
```

## 5단계: NodeDiagnostic 리소스 정리
<a name="_step_5_clean_up_nodediagnostic_resource"></a>
+  `NodeDiagnostic` 리소스는 자동으로 삭제되지 않습니다. 로그 아티팩트를 가져온 후에 이를 직접 정리해야 합니다.

```
# Delete the NodeDiagnostic resource
kubectl delete nodediagnostics.eks.amazonaws.com/<node-name>
```

## NodeDiagnostic `node` 대상
<a name="_nodediagnostic_node_destination"></a>

노드 모니터링 에이전트의 `v1.6.0` 버전부터 로그 수집 대상을 `node`로 설정하는 옵션이 있습니다. 이 대상을 사용하면 나중에 수집할 수 있도록 노드에서 로그가 수집되고 일시적으로 유지됩니다. 이 기능 외에도 노드 모니터링 에이전트의 GitHub 리포지토리 내에는 간편한 상호 작용 및 로그 수집을 위해 설치할 수 있는 `kubectl` 플러그인이 있습니다. 자세한 내용은 [`kubectl ekslogs` 플러그인에 대한 설명서](https://github.com/aws/eks-node-monitoring-agent/blob/main/tools/kubectl-ekslogs/README.md)를 참조하세요.

## 사용 예
<a name="_example_usage"></a>

```
# Collect NodeDiagnostic logs from a single node
kubectl ekslogs <node-name>

# Collect NodeDiagnostic logs from multiple nodes
kubectl ekslogs <node-name-1> <node-name-2> <node-name-3>

# Collect NodeDiagnostic logs from all nodes with a specific label
kubectl ekslogs -l <key>=<value>
```

# Amazon EKS Hybrid Nodes 개요
<a name="hybrid-nodes-overview"></a>

*Amazon EKS Hybrid Nodes*를 사용하면 온프레미스 및 엣지 인프라를 Amazon EKS 클러스터의 노드로 사용할 수 있습니다. AWS는 Amazon EKS 클러스터의 AWS 호스팅 Kubernetes 컨트롤 플레인을 관리하고 온프레미스 또는 엣지 환경에서 실행되는 하이브리드 노드를 관리합니다. 이를 통해 환경 전반의 Kubernetes 관리를 통합하고 온프레미스 및 엣지 애플리케이션을 위해 Kubernetes 컨트롤 플레인 관리를 AWS로 오프로드합니다.

Amazon EKS Hybrid Nodes는 모든 온프레미스 하드웨어 또는 가상 머신과 함께 작동하여 애플리케이션이 실행되어야 하는 모든 곳에 Amazon EKS의 효율성, 확장성, 가용성을 제공합니다. Amazon EKS 추가 기능, Amazon EKS Pod Identity, 클러스터 액세스 항목, 클러스터 인사이트, 확장된 Kubernetes 버전 지원을 포함하여 Amazon EKS Hybrid Nodes와 함께 다양한 Amazon EKS 기능을 사용할 수 있습니다. Amazon EKS Hybrid Nodes는 중앙 집중식 모니터링, 로깅, ID 관리를 위해 AWS Systems Manager, AWS IAM Roles Anywhere, Amazon Managed Service for Prometheus, Amazon CloudWatch를 포함한 AWS 서비스와 기본적으로 통합됩니다.

Amazon EKS Hybrid Nodes를 사용하면 선결제 약정이나 최소 요금이 없으며, Amazon EKS 클러스터에 연결될 때 하이브리드 노드의 vCPU 리소스에 대해 시간당 요금이 부과됩니다. 가격에 대한 자세한 내용은 [Amazon EKS Pricing](https://aws.amazon.com/eks/pricing/)을 참조하세요.

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/tFn9IdlddBw?rel=0/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/tFn9IdlddBw?rel=0)


## Features
<a name="hybrid-nodes-features"></a>

EKS Hybrid Nodes에는 다음과 같은 상위 수준 기능이 있습니다.
+  **관리형 Kubernetes 컨트롤 플레인**: AWS는 EKS 클러스터의 AWS 호스팅 Kubernetes 컨트롤 플레인을 관리하고 사용자는 온프레미스 또는 엣지 환경에서 실행되는 하이브리드 노드를 관리합니다. 이를 통해 환경 전반의 Kubernetes 관리를 통합하고 온프레미스 및 엣지 애플리케이션을 위해 Kubernetes 컨트롤 플레인 관리를 AWS로 오프로드합니다. Kubernetes 컨트롤 플레인을 AWS로 이동하면 애플리케이션의 온프레미스 용량을 절약하고 Kubernetes 컨트롤 플레인이 워크로드에 따라 확장된다고 신뢰할 수 있습니다.
+  **일관된 EKS 경험**: 온프레미스 및 클라우드 환경에서 일관된 EKS 경험을 위해 EKS 추가 기능, EKS Pod Identity, 클러스터 액세스 항목, 클러스터 인사이트, 확장된 Kubernetes 버전 지원 등 대부분의 EKS 기능이 EKS Hybrid Nodes에서 지원됩니다. EKS Hybrid Nodes에서 지원되는 EKS 추가 기능에 대한 자세한 내용은 [하이브리드 노드에 대한 추가 기능 구성](hybrid-nodes-add-ons.md) 섹션을 참조하세요.
+  **중앙 집중식 관찰성 및 ID 관리**: EKS Hybrid Nodes는 중앙 집중식 모니터링, 로깅, ID 관리를 위해 AWS Systems Manager, AWS IAM Roles Anywhere, Amazon Managed Service for Prometheus, Amazon CloudWatch, Amazon GuardDuty를 포함한 AWS 서비스와 기본적으로 통합됩니다.
+  **클라우드로 버스트 또는 온프레미스 용량 추가**: 단일 EKS 클러스터를 사용하여 AWS 리전, AWS 로컬 영역 또는 AWS Outposts에서 하이브리드 노드 및 노드를 실행하여 클라우드로 버스트하거나 EKS 클러스터에 온프레미스 용량을 추가할 수 있습니다. 자세한 내용은 [혼합 모드 클러스터 고려 사항](hybrid-nodes-webhooks.md#hybrid-nodes-considerations-mixed-mode)을 참조하세요.
+  **유연한 인프라**: EKS Hybrid Nodes는 *자체 인프라 사용* 접근 방식을 따르며 하이브리드 노드에 사용하는 인프라에 구애받지 않습니다. 물리적 또는 가상 머신과 x86 및 ARM 아키텍처에서 하이브리드 노드를 실행할 수 있으므로 다양한 인프라 유형의 하이브리드 노드에서 실행되는 온프레미스 워크로드를 마이그레이션할 수 있습니다.
+  **유연한 네트워킹**: EKS Hybrid Nodes에서는 EKS 컨트롤 플레인과 하이브리드 노드 간의 통신이 클러스터 생성 중에 전달하는 VPC 및 서브넷을 통해 라우팅되며, 이는 컨트롤 플레인-노드 네트워킹을 위한 EKS의 [기존 메커니즘](https://docs.aws.amazon.com/eks/latest/best-practices/subnets.html)을 기반으로 합니다. 이는 온프레미스 네트워크를 AWS의 VPC에 연결하는 기본 방법에 유연성을 제공합니다. AWS Site-to-Site VPN, AWS Direct Connect, 자체 VPN 솔루션을 포함하여 몇 가지 [문서화된 옵션](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)을 사용하고 사용 사례에 가장 적합한 방법을 선택할 수 있습니다.

## Limits
<a name="hybrid-node-limits"></a>
+ 클러스터당 최대 15개의 원격 노드 네트워크 CIDR과 최대 15개의 원격 포드 네트워크 CIDR이 지원됩니다.

## 고려 사항
<a name="hybrid-nodes-general"></a>
+ EKS Hybrid Nodes는 신규 또는 기존 EKS 클러스터와 함께 사용할 수 있습니다.
+ EKS Hybrid Nodes는 AWS GovCloud(미국) 리전 및 AWS 중국 리전을 제외한 모든 AWS 리전에서 사용할 수 있습니다.
+ EKS Hybrid Nodes에는 온프레미스 환경과 AWS 간에 신뢰할 수 있는 연결이 있어야 합니다. EKS Hybrid Nodes는 연결 해제, 중단, 간헐적 또는 제한된(DDIL) 환경에 적합하지 않습니다. DDIL 환경에서 실행하는 경우 [Amazon EKS Anywhere](https://aws.amazon.com/eks/eks-anywhere/)를 고려하세요. 네트워크 연결 해제 시나리오 중 하이브리드 노드 작동 방식에 대한 자세한 내용은 [EKS Hybrid Nodes 모범 사례](https://docs.aws.amazon.com/eks/latest/best-practices/hybrid-nodes-network-disconnections.html)를 참조하세요.
+ AWS 리전, AWS 로컬 영역, AWS Outposts를 포함한 클라우드 인프라 또는 다른 클라우드에서 EKS Hybrid Nodes를 실행하는 것은 지원되지 않습니다. Amazon EC2 인스턴스에서 하이브리드 노드를 실행하는 경우 하이브리드 노드 요금이 부과됩니다.
+ 하이브리드 노드에 대한 결제는 노드가 EKS 클러스터에 조인할 때 시작되고 노드가 클러스터에서 제거될 때 중지됩니다. 하이브리드 노드를 사용하지 않는 경우 EKS 클러스터에서 하이브리드 노드를 제거해야 합니다.

## 추가 리소스
<a name="hybrid-nodes-resources"></a>
+  [https://www.eksworkshop.com/docs/networking/eks-hybrid-nodes/](https://www.eksworkshop.com/docs/networking/eks-hybrid-nodes/): 데모 환경에서 EKS 하이브리드 노드를 배포하기 위한 단계별 지침입니다.
+  [https://www.youtube.com/watch?v=ZxC7SkemxvU](https://www.youtube.com/watch?v=ZxC7SkemxvU): EKS Hybrid Nodes 출시를 소개하는 AWS re:Inven 세션입니다. 고객이 자신의 환경에서 EKS Hybrid Nodes를 어떻게 사용하고 있는지 보여줍니다.
+  [https://repost.aws/articles/ARL44xuau6TG2t-JoJ3mJ5Mw/unpacking-the-cluster-networking-for-amazon-eks-hybrid-nodes](https://repost.aws/articles/ARL44xuau6TG2t-JoJ3mJ5Mw/unpacking-the-cluster-networking-for-amazon-eks-hybrid-nodes): EKS Hybrid Nodes용 네트워킹을 설정하는 다양한 방법을 설명하는 문서입니다.
+  [https://aws.amazon.com/blogs/containers/run-genai-inference-across-environments-with-amazon-eks-hybrid-nodes/](https://aws.amazon.com/blogs/containers/run-genai-inference-across-environments-with-amazon-eks-hybrid-nodes/): EKS Hybrid Nodes를 사용하여 환경 전반에서 GenAI 추론을 실행하는 방법을 보여주는 블로그 게시물입니다.

# 하이브리드 노드에 대한 사전 조건 설정
<a name="hybrid-nodes-prereqs"></a>

Amazon EKS Hybrid Nodes를 사용하려면 온프레미스 환경에서 지원되는 운영 체제가 있는 AWS, 베어 메탈 서버 또는 가상 머신으로의 프라이빗 연결과 AWS IAM Roles Anywhere 또는 AWS Systems Manager(SSM) 하이브리드 활성화가 구성되어 있어야 합니다. 하이브리드 노드 수명 주기 전반에 걸쳐 이러한 사전 조건을 관리할 책임은 사용자에게 있습니다.
+ 온프레미스 환경과 AWS 간의 하이브리드 네트워크 연결 
+ 물리적 또는 가상 머신 형태의 인프라
+ 하이브리드 노드와 호환되는 운영 체제
+ 구성된 온프레미스 IAM 자격 증명 공급자

![\[하이브리드 노드 네트워크 연결.\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-prereq-diagram.png)


## 하이브리드 네트워크 연결
<a name="hybrid-nodes-prereqs-connect"></a>

Amazon EKS 컨트롤 플레인과 하이브리드 노드 간의 통신은 클러스터 생성 중에 전달하는 VPC와 서브넷을 통해 라우팅되며, 이는 컨트롤 플레인에서 노드 네트워킹을 위한 Amazon EKS의 [기존 메커니즘](https://aws.github.io/aws-eks-best-practices/networking/subnets/)을 기반으로 합니다. AWS Site-to-Site VPN, AWS Direct Connect 또는 자체 VPN 연결을 포함하여 온프레미스 환경을 VPC와 연결하는 데 사용할 수 있는 몇 가지 [문서화된 옵션](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)이 있습니다. 하이브리드 네트워크 연결에 이러한 솔루션을 사용하는 방법에 대한 자세한 내용은 [AWS Site-to-Site VPN](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html) 및 [AWS Direct Connect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html) 사용 설명서를 참조하세요.

최적의 경험을 위해 AWS 리전의 하이브리드 노드 연결에 최소 100Mbps 및 최대 200ms의 왕복 지연 시간을 제공하는 안정적인 네트워크 연결을 권장합니다. 이는 대부분의 사용 사례에 적용되는 일반적인 지침이지만 엄격한 요구 사항은 아닙니다. 대역폭 및 지연 시간 요구 사항은 하이브리드 노드 수와 애플리케이션 이미지 크기, 애플리케이션 탄력성, 모니터링 및 로깅 구성, 다른 AWS 서비스에 저장된 데이터에 대한 애플리케이션 종속성과 같은 워크로드 특성에 따라 달라질 수 있습니다. 네트워킹 설정이 워크로드의 요구 사항을 충족하는지 확인하려면 프로덕션에 배포하기 전에 자체 애플리케이션 및 환경을 사용하여 테스트하는 것이 좋습니다.

## 온프레미스 네트워크 구성
<a name="hybrid-nodes-prereqs-onprem"></a>

Amazon EKS 컨트롤 플레인에서 온프레미스 환경으로의 인바운드 네트워크 액세스를 활성화해야 Amazon EKS 컨트롤 플레인이 하이브리드 노드에서 실행 중인 `kubelet`와 통신하고, 선택적으로 하이브리드 노드에서 실행 중인 웹후크와 통신할 수 있습니다. 또한 Amazon EKS 컨트롤 플레인과 통신하려면 하이브리드 노드 및 해당 노드에서 실행되는 구성 요소에 대해 아웃바운드 네트워크 액세스를 활성화해야 합니다. AWS Direct Connect, AWS Site-to-Site VPN 또는 자체 VPN 연결에 대해 완전히 비공개로 유지되도록 이 통신을 구성할 수 있습니다.

온프레미스 노드 및 포드 네트워크에 사용하는 CIDR(Classless Inter-Domain Routing) 범위는 IPv4 RFC-1918 또는 CGNAT 주소 범위를 사용해야 합니다. 온프레미스 라우터는 온프레미스 노드와 선택적으로 포드에 대한 경로로 구성되어야 합니다. 방화벽과 온프레미스 환경에서 활성화해야 하는 필수 포트와 프로토콜의 전체 목록을 포함하여 온프레미스 네트워크 요구 사항에 대한 자세한 내용은 [온프레미스 네트워킹 구성](hybrid-nodes-networking.md#hybrid-nodes-networking-on-prem)을 참조하세요.

## EKS 클러스터 구성
<a name="hybrid-nodes-prereqs-cluster"></a>

지연 시간을 최소화하려면 온프레미스 또는 엣지 환경에 가장 가까운 AWS 리전에서 Amazon EKS 클러스터를 생성하는 것이 좋습니다. Amazon EKS 클러스터를 생성하는 동안 온프레미스 노드 및 포드 CIDR을 두 개의 API 필드인 `RemoteNodeNetwork` 및 `RemotePodNetwork`를 통해 전달합니다. 온프레미스 네트워크 팀과 상의하여 온프레미스 노드 및 포드 CIDR을 식별해야 할 수 있습니다. 노드 CIDR은 온프레미스 네트워크에서 할당되고 포드 CIDR은 CNI에 오버레이 네트워크를 사용하는 경우, 사용하는 컨테이너 네트워크 인터페이스(CNI)에서 할당됩니다. Cilium과 Calico는 기본적으로 오버레이 네트워크를 사용합니다.

`RemoteNodeNetwork` 및 `RemotePodNetwork` 필드를 통해 구성하는 온프레미스 노드 및 포드 CIDR은 VPC를 통해 하이브리드 노드에서 실행되는 `kubelet`과 포드로 트래픽을 라우팅하도록 Amazon EKS 컨트롤 플레인을 구성하는 데 사용됩니다. 온프레미스 노드 및 포드 CIDR은 서로, 클러스터 생성 중에 전달하는 VPC CIDR 또는 Amazon EKS 클러스터의 서비스 IPv4 구성과 중첩될 수 없습니다. 또한 온프레미스 라우터가 트래픽을 라우팅할 수 있도록 포드 CIDR이 각 EKS 클러스터에 고유해야 합니다.

Amazon EKS Kubernetes API 서버 엔드포인트에 퍼블릭 또는 프라이빗 엔드포인트 액세스 중 하나를 사용하는 것이 좋습니다. '퍼블릭 및 프라이빗'을 선택하면 Amazon EKS Kubernetes API 서버 엔드포인트가 항상 VPC 외부에서 실행되는 하이브리드 노드의 퍼블릭 IP로 확인되므로 하이브리드 노드가 클러스터에 조인하지 못할 수 있습니다. 퍼블릭 엔드포인트 액세스를 사용하면 Kubernetes API 서버 엔드포인트가 퍼블릭 IP로 확인되고 하이브리드 노드에서 Amazon EKS 컨트롤 플레인으로의 통신이 인터넷을 통해 라우팅됩니다. 프라이빗 엔드포인트 액세스를 선택하면 Kubernetes API 서버 엔드포인트가 프라이빗 IP로 확인되고 하이브리드 노드에서 Amazon EKS 컨트롤 플레인으로의 통신이 프라이빗 연결 링크를 통해 라우팅되며, 대부분의 경우 AWS Direct Connect 또는 AWS Site-to-Site VPN으로 라우팅됩니다.

## VPC 구성
<a name="hybrid-nodes-prereqs-vpc"></a>

온프레미스 노드의 라우팅 테이블에 있는 경로와 선택적으로 가상 프라이빗 게이트웨이(VGW) 또는 전송 게이트웨이(TGW)를 대상으로 하는 포드 네트워크로 Amazon EKS 클러스터 생성 중에 전달하는 VPC를 구성해야 합니다. 예를 들면 다음과 같습니다. `REMOTE_NODE_CIDR` 및 `REMOTE_POD_CIDR`을 온프레미스 네트워크의 값으로 바꿉니다.


| 대상 주소 | 대상 | 설명 | 
| --- | --- | --- | 
|  10.226.0.0/16  |  로컬  |  VPC 내의 VPC 경로에 대한 로컬 트래픽  | 
|  REMOTE\$1NODE\$1CIDR  |  tgw-abcdef123456  |  온프레미스 노드 CIDR, 트래픽을 TGW로 라우팅  | 
|  REMODE\$1POD\$1CIDR  |  tgw-abcdef123456  |  온프레미스 포드 CIDR, 트래픽을 TGW로 라우팅  | 

## 보안 그룹 구성
<a name="hybrid-nodes-prereqs-sg"></a>

클러스터를 생성할 때 Amazon EKS에서 `eks-cluster-sg-<cluster-name>-<uniqueID>`라는 보안 그룹을 만듭니다. 이 클러스터 보안 그룹의 인바운드 규칙은 변경할 수 없지만 아웃바운드 규칙을 제한할 수 있습니다. 하이브리드 노드에서 실행되는 kubelet와 선택적으로 웹후크가 Amazon EKS 컨트롤 플레인에 연결할 수 있게 하려면 클러스터에 보안 그룹을 추가해야 합니다. 이 추가 보안 그룹에 필요한 인바운드 규칙은 다음과 같습니다. `REMOTE_NODE_CIDR` 및 `REMOTE_POD_CIDR`을 온프레미스 네트워크의 값으로 바꿉니다.


| 이름 | 보안 그룹 규칙 ID | IP 버전 | Type | 프로토콜 | 포트 범위 | 소스 | 
| --- | --- | --- | --- | --- | --- | --- | 
|  온프레미스 노드 인바운드  |  sgr-abcdef123456  |  IPv4  |  HTTPS  |  TCP  |  443  |  REMOTE\$1NODE\$1CIDR  | 
|  온프레미스 포드 인바운드  |  sgr-abcdef654321  |  IPv4  |  HTTPS  |  TCP  |  443  |  REMOTE\$1POD\$1CIDR  | 

## 인프라
<a name="hybrid-nodes-prereqs-infra"></a>

하이브리드 노드로 사용할 수 있는 베어 메탈 서버 또는 가상 머신이 있어야 합니다. 하이브리드 노드는 기본 인프라에 구애받지 않으며 x86 및 ARM 아키텍처를 지원합니다. Amazon EKS Hybrid Nodes는 '자체 인프라 구축' 접근 방식을 따르며, 이 방식에서 하이브리드 노드에 사용하는 베어 메탈 서버 또는 가상 머신의 프로비저닝 및 관리는 사용자의 책임입니다. 엄격한 최소 리소스 요구 사항은 없지만 하이브리드 노드에 대해 최소 1개의 vCPU 및 1GiB RAM이 있는 호스트를 사용하는 것이 좋습니다.

## 운영 체제
<a name="hybrid-nodes-prereqs-os"></a>

Bottlerocket, Amazon Linux 2023(AL2023), Ubuntu 및 RHEL은 하이브리드 노드의 노드 운영 체제로 사용하기 위해 지속적으로 검증됩니다. Bottlerocket은 VMware vSphere 환경에서만 AWS에서 지원됩니다. AL2023은 Amazon EC2 외부에서 실행되는 경우 AWS 지원 플랜의 적용을 받지 않습니다. AL2023은 온프레미스 가상화 환경에서만 사용할 수 있습니다. 자세한 내용은 [Amazon Linux 2023 사용 설명서](https://docs.aws.amazon.com/linux/al2023/ug/outside-ec2.html)를 참조하세요. AWS는 Ubuntu 및 RHEL 운영 체제와의 하이브리드 노드 통합을 지원하지만 운영 체제 자체에 대한 지원은 제공하지 않습니다.

운영 체제 프로비저닝 및 관리는 사용자의 책임입니다. 하이브리드 노드를 처음 테스트하는 경우 이미 프로비저닝된 호스트에서 Amazon EKS Hybrid Nodes CLI(`nodeadm`)를 실행하는 것이 가장 쉽습니다. 프로덕션 배포의 경우 호스트 시작 시 호스트를 Amazon EKS 클러스터에 자동으로 조인하기 위해 systemd 서비스로 실행되도록 구성된 `nodeadm`을 골든 운영 체제 이미지에 포함하는 것이 좋습니다.

## 온프레미스 IAM 자격 증명 공급자
<a name="hybrid-nodes-prereqs-iam"></a>

Amazon EKS Hybrid Nodes는 AWS SSM 하이브리드 활성화 또는 AWS IAM Roles Anywhere에서 프로비저닝한 임시 IAM 자격 증명을 사용하여 Amazon EKS 클러스터로 인증합니다. Amazon EKS Hybrid Nodes CLI(`nodeadm`)와 함께 AWS SSM 하이브리드 활성화 또는 AWS IAM Roles Anywhere를 사용해야 합니다. 인증 기관(CA)이 있는 기존 퍼블릭 키 인프라(PKI)와 온프레미스 환경에 대한 인증서가 없는 경우 AWS SSM 하이브리드 활성화를 사용하는 것이 좋습니다. 온프레미스에 기존 PKI 및 인증서가 있는 경우 AWS IAM Roles Anywhere를 사용합니다.

Amazon EC2에서 실행되는 노드의 [Amazon EKS 노드 IAM 역할](create-node-role.md)과 마찬가지로 하이브리드 노드를 Amazon EKS 클러스터에 조인하는 데 필요한 권한이 있는 하이브리드 노드 IAM 역할을 생성합니다. AWS IAM Roles Anywhere를 사용하는 경우 AWS IAM Roles Anywhere가 하이브리드 노드 IAM 역할을 수임하고 하이브리드 노드 IAM 역할을 수임 가능한 역할로 사용하여 AWS IAM Roles Anywhere 프로필을 구성하도록 허용하는 신뢰 정책을 구성합니다. AWS SSM을 사용하는 경우 AWS SSM이 하이브리드 노드 IAM 역할을 수임하고 하이브리드 노드 IAM 역할을 사용하여 하이브리드 활성화를 생성하도록 서용하는 신뢰 정책을 구성합니다. 필요한 권한을 가진 하이브리드 노드 IAM 역할을 생성하는 방법은 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md) 섹션을 참조하세요.

# 하이브리드 노드용 네트워킹 준비
<a name="hybrid-nodes-networking"></a>

이 주제에서는 Amazon EKS 클러스터를 생성하고 하이브리드 노드를 연결하기 전에 구성해야 하는 네트워킹 설정에 대한 개요를 제공합니다. 이 안내서에서는 [AWS Site-to-Site VPN](https://docs.aws.amazon.com/vpn/latest/s2svpn/SetUpVPNConnections.html), [AWS Direct Connect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html) 또는 자체 VPN 솔루션을 사용하여 하이브리드 네트워크 연결에 대한 사전 요구 사항을 충족했다고 가정합니다.

![\[하이브리드 노드 네트워크 연결.\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-prereq-diagram.png)


## 온프레미스 네트워킹 구성
<a name="hybrid-nodes-networking-on-prem"></a>

### 최소 네트워크 요구 사항
<a name="hybrid-nodes-networking-min-reqs"></a>

최적의 경험을 위해 AWS 리전의 하이브리드 노드 연결에 최소 100Mbps 및 최대 200ms의 왕복 지연 시간을 제공하는 안정적인 네트워크 연결을 권장합니다. 이는 대부분의 사용 사례에 적용되는 일반적인 지침이지만 엄격한 요구 사항은 아닙니다. 대역폭 및 지연 시간 요구 사항은 하이브리드 노드 수와 애플리케이션 이미지 크기, 애플리케이션 탄력성, 모니터링 및 로깅 구성, 다른 AWS 서비스에 저장된 데이터에 대한 애플리케이션 종속성과 같은 워크로드 특성에 따라 달라질 수 있습니다. 네트워킹 설정이 워크로드의 요구 사항을 충족하는지 확인하려면 프로덕션에 배포하기 전에 자체 애플리케이션 및 환경을 사용하여 테스트하는 것이 좋습니다.

### 온프레미스 노드 및 포드 CIDR
<a name="hybrid-nodes-networking-on-prem-cidrs"></a>

하이브리드 노드에 사용할 노드 및 포드 CIDR과 해당 노드에서 실행되는 워크로드를 식별합니다. 노드 CIDR은 온프레미스 네트워크에서 할당되고 포드 CIDR은 CNI에 오버레이 네트워크를 사용하는 경우 컨테이너 네트워크 인터페이스(CNI)에서 할당됩니다. `RemoteNodeNetwork` 및 `RemotePodNetwork` 필드를 사용하여 EKS 클러스터를 생성할 때 온프레미스 노드 CIDR과 포드 CIDR을 입력으로 전달합니다. 온프레미스 노드 CIDR은 온프레미스 네트워크에서 라우팅 가능해야 합니다. 온프레미스 포드 CIDR 라우팅 가능성에 대한 자세한 내용은 다음 섹션을 참조하세요.

온프레미스 노드 및 포드 CIDR 블록은 다음 요구 사항을 충족해야 합니다.

1. `IPv4` RFC-1918 범위 중 하나(`10.0.0.0/8`, `172.16.0.0/12` 또는 `192.168.0.0/16`) 또는 RFC 6598에 의해 정의된 CGNAT 범위 내(`100.64.0.0/10`)에 있어야 합니다.

1. 서로, EKS 클러스터의 VPC CIDR 또는 Kubernetes 서비스 `IPv4` CIDR과 중첩되지 않습니다.

### 온프레미스 포드 네트워크 라우팅
<a name="hybrid-nodes-networking-on-prem-pod-routing"></a>

EKS Hybrid Nodes를 사용할 때 일반적으로 클라우드와 온프레미스 환경 간에 완전한 클러스터 통신 및 기능을 사용할 수 있도록 온프레미스 네트워크에서 온프레미스 포드 CIDR을 라우팅할 수 있게 만드는 것이 좋습니다.

 **라우팅 가능한 포드 네트워크** 

온프레미스 네트워크에서 포드 네트워크를 라우팅할 수 있게 만들 수 있는 경우 아래 지침을 따르세요.

1. 온프레미스 포드 CIDR을 사용하여 EKS 클러스터의 `RemotePodNetwork` 필드를 구성하고, 온프레미스 포드 CIDR을 사용하여 VPC 라우팅 테이블을 구성하고, 온프레미스 포드 CIDR을 사용하여 EKS 클러스터 보안 그룹을 구성합니다.

1. Border Gateway Protocol(BGP), 정적 경로 또는 기타 사용자 지정 라우팅 솔루션을 포함하여 온프레미스 네트워크에서 온프레미스 포드 CIDR을 라우팅 가능하도록 하는 데 몇 가지 기법을 사용할 수 있습니다. BGP는 사용자 지정 또는 수동 라우팅 구성이 필요한 대체 솔루션보다 더 확장성이 뛰어나고 관리하기 쉽기 때문에 권장되는 솔루션입니다. AWS는 포드 CIDR을 알리는 데 Cilium 및 Calico의 BGP 기능을 지원합니다. 자세한 내용은 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md) 및 [라우팅 가능한 원격 포드 CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs) 섹션을 참조하세요.

1. EKS 컨트롤 플레인이 웹후크에 할당된 포드 IP 주소와 통신할 수 있으므로 웹후크가 하이브리드 노드에서 실행될 수 있습니다.

1. 클라우드 노드에서 실행되는 워크로드는 동일한 EKS 클러스터의 하이브리드 노드에서 실행되는 워크로드와 직접 통신할 수 있습니다.

1. AWS Application Load Balancer, Amazon Managed Service for Prometheus 등의 다른 AWS 서비스는 하이브리드 노드에서 실행되는 워크로드와 통신하여 네트워크 트래픽의 균형을 맞추고 포드 지표를 스크래핑할 수 있습니다.

 **라우팅 불가능한 포드 네트워크** 

온프레미스 네트워크에서 포드 네트워크를 라우팅할 수 있게 만들 수 *없는* 경우 아래 지침을 따르세요.

1. 웹후크는 EKS 컨트롤 플레인에서 웹후크에 할당된 포드 IP 주소로 연결해야 하므로 하이브리드 노드에서 웹후크를 실행할 수 없습니다. 이 경우 하이브리드 노드와 동일한 EKS 클러스터의 클라우드 노드에서 웹후크를 실행하는 것이 좋습니다. 자세한 내용은 [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md)을 참조하세요.

1. 클라우드 노드에서 실행되는 워크로드는 클라우드 노드에 VPC CNI를 사용하고 하이브리드 노드에 Cilium이나 Calico를 사용할 때 하이브리드 노드에서 실행되는 워크로드와 직접 통신할 수 없습니다.

1. 서비스 트래픽 분산을 사용하여 트래픽이 시작되는 영역에 트래픽을 로컬로 유지합니다. 서비스 트래픽 분산에 대한 자세한 내용은 [서비스 트래픽 분산 구성](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-service-traffic-distribution)을 참조하세요.

1. 온프레미스 호스트를 떠나는 포드 트래픽에 대해 송신 매스커레이드 또는 네트워크 주소 변환(NAT)을 사용하도록 CNI를 구성합니다. 이 기능은 Cilium에서 기본적으로 활성화되어 있습니다. Calico에서는 `natOutgoing`을 `true`로 설정해야 합니다.

1. AWS Application Load Balancer, Amazon Managed Service for Prometheus 등의 다른 AWS 서비스는 하이브리드 노드에서 실행되는 워크로드와 통신할 수 없습니다.

### 하이브리드 노드 설치 및 업그레이드 중에 필요한 액세스
<a name="hybrid-nodes-networking-access-reqs"></a>

호스트에 하이브리드 노드 종속성을 설치하는 설치 프로세스 중에 다음 도메인에 액세스할 수 있어야 합니다. 이 프로세스는 운영 체제 이미지를 빌드할 때 한 번 수행하거나 런타임 시 각 호스트에서 수행할 수 있습니다. 여기에는 초기 설치와 하이브리드 노드의 Kubernetes 버전을 업그레이드할 때도 포함됩니다.

일부 패키지는 OS의 기본 패키지 관리자를 사용하여 설치됩니다. AL2023 및 RHEL의 경우 `yum` 명령은 `containerd`, `ca-certificates`, `iptables` 및 `amazon-ssm-agent`를 설치하는 데 사용됩니다. Ubuntu의 경우 `apt`는 `containerd`, `ca-certificates` 및 `iptables`를 설치하는 데 사용되고, `snap`은 `amazon-ssm-agent`를 설치하는 데 사용됩니다.


| 구성 요소 | URL | 프로토콜 | 포트 | 
| --- | --- | --- | --- | 
|  EKS 노드 아티팩트(S3)  |  https://hybrid-assets.eks.amazonaws.com  |  HTTPS  |  443  | 
|   [EKS 서비스 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |  https://eks.*region*.amazonaws.com  |  HTTPS  |  443  | 
|   [ECR 서비스 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/ecr.html)   |  https://api.ecr.*region*.amazonaws.com  |  HTTPS  |  443  | 
|  EKS ECR 엔드포인트  |  리전별 엔드포인트는 [Amazon EKS 추가 기능에 대한 Amazon 컨테이너 이미지 레지스트리 보기](add-ons-images.md) 섹션을 참조하세요.  |  HTTPS  |  443  | 
|  SSM 바이너리 엔드포인트 1   |  https://amazon-ssm-*region*.s3.*region*.amazonaws.com  |  HTTPS  |  443  | 
|   [SSM 서비스 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/ssm.html) 1   |  https://ssm.*region*.amazonaws.com  |  HTTPS  |  443  | 
|  IAM Anywhere 바이너리 엔드포인트 2   |  https://rolesanywhere.amazonaws.com  |  HTTPS  |  443  | 
|   [IAM Anywhere 서비스 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rolesanywhere.html) 2   |  https://rolesanywhere.*region*.amazonaws.com  |  HTTPS  |  443  | 
|  운영 체제 패키지 관리자 엔드포인트  |  패키지 리포지토리 엔드포인트는 OS별로 다르며 지리적 리전에 따라 다를 수 있습니다.  |  HTTPS  |  443  | 

**참고**  
 1 AWS SSM 엔드포인트에 대한 액세스는 온프레미스 IAM 자격 증명 공급자에 AWS SSM 하이브리드 활성화를 사용하는 경우에만 필요합니다.  
 2 AWS IAM 엔드포인트에 대한 액세스는 온프레미스 IAM 자격 증명 공급자에 AWS IAM Roles Anywhere를 사용하는 경우에만 필요합니다.

### 지속적인 클러스터 작업에 필요한 액세스
<a name="hybrid-nodes-networking-access-reqs-ongoing"></a>

지속적인 클러스터 작업을 위해서는 온프레미스 방화벽에 대한 다음 네트워크 액세스가 필요합니다.

**중요**  
CNI 선택에 따라 CNI 포트에 대한 추가 네트워크 액세스 규칙을 구성해야 합니다. 자세한 내용은 [Cilium documentation](https://docs.cilium.io/en/stable/operations/system_requirements/#firewall-rules) 및 [Calico documentation](https://docs.tigera.io/calico/latest/getting-started/kubernetes/requirements#network-requirements)를 참조하세요.


| Type | 프로토콜 | Direction | 포트 | 소스 | Destination | 사용법 | 
| --- | --- | --- | --- | --- | --- | --- | 
|  HTTPS  |  TCP  |  아웃바운드  |  443  |  원격 노드 CIDR  |  EKS 클러스터 IP 1   |  kubelet에서 Kubernetes API 서버로  | 
|  HTTPS  |  TCP  |  아웃바운드  |  443  |  원격 포드 CIDR  |  EKS 클러스터 IP 1   |  포드에서 Kubernetes API 서버로  | 
|  HTTPS  |  TCP  |  아웃바운드  |  443  |  원격 노드 CIDR  |   [SSM 서비스 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/ssm.html)   |  5분마다 SSM 하이브리드 활성화 자격 증명 새로 고침 및 SSM 하트비트  | 
|  HTTPS  |  TCP  |  아웃바운드  |  443  |  원격 노드 CIDR  |   [IAM Anywhere 서비스 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rolesanywhere.html)   |  IAM Roles Anywhere 자격 증명 새로 고침  | 
|  HTTPS  |  TCP  |  아웃바운드  |  443  |  원격 포드 CIDR  |   [STS 리전 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/sts.html)   |  포드에서 STS 엔드포인트로, IRSA에만 필요  | 
|  HTTPS  |  TCP  |  아웃바운드  |  443  |  원격 노드 CIDR  |   [Amazon EKS 인증 서비스 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |  노드에서 Amazon EKS 인증 엔드포인트로, Amazon EKS Pod Identity에만 필요  | 
|  HTTPS  |  TCP  |  인바운드  |  10250  |  EKS 클러스터 IP 1   |  원격 노드 CIDR  |  Kubernetes API 서버에서 kubelet으로  | 
|  HTTPS  |  TCP  |  인바운드  |  웹후크 포트  |  EKS 클러스터 IP 1   |  원격 포드 CIDR  |  Kubernetes API 서버에서 웹후크로  | 
|  HTTPS  |  TCP, UDP  |  인바운드, 아웃바운드  |  53  |  원격 포드 CIDR  |  원격 포드 CIDR  |  포드와 CoreDNS 간. 클라우드에서 CoreDNS 복제본을 1개 이상 실행하는 경우 CoreDNS가 실행 중인 VPC에 대한 DNS 트래픽을 허용해야 합니다.  | 
|  사용자 정의  |  사용자 정의  |  인바운드, 아웃바운드  |  앱 포트  |  원격 포드 CIDR  |  원격 포드 CIDR  |  포드 간  | 

**참고**  
 1 EKS 클러스터의 IP입니다. Amazon EKS 탄력적 네트워크 인터페이스에 대한 다음 섹션을 참조하세요.

### Amazon EKS 네트워크 인터페이스
<a name="hybrid-nodes-networking-eks-network-interfaces"></a>

Amazon EKS는 클러스터 생성 중에 전달하는 VPC의 서브넷에 네트워크 인터페이스를 연결하여 EKS 컨트롤 플레인과 VPC 간의 통신을 활성화합니다. Amazon EKS가 생성하는 네트워크 인터페이스는 Amazon EC2 콘솔에서 또는 AWS CLI를 사용하여 클러스터를 생성한 후에 찾을 수 있습니다. Kubernetes 버전 업그레이드와 같이 EKS 클러스터에 변경 사항이 적용되면 원래 네트워크 인터페이스가 삭제되고 새 네트워크 인터페이스가 생성됩니다. 클러스터 생성 중에 전달하는 서브넷에 대해 제한된 서브넷 크기를 사용하여 Amazon EKS 네트워크 인터페이스의 IP 범위를 제한할 수 있습니다. 이렇게 하면 알려진 제한된 IP 세트에 대한 인바운드/아웃바운드 연결을 허용하도록 온프레미스 방화벽을 쉽게 구성할 수 있습니다. 네트워크 인터페이스가 생성되는 서브넷을 제어하려면 클러스터를 생성하거나 클러스터를 생성한 후 서브넷을 업데이트할 때 지정하는 서브넷 수를 제한할 수 있습니다.

Amazon EKS에서 프로비저닝한 네트워크 인터페이스에는 `Amazon EKS your-cluster-name ` 형식에 대한 설명이 있습니다. Amazon EKS가 프로비저닝하는 네트워크 인터페이스의 IP 주소를 찾는 데 사용할 수 있는 AWS CLI 명령은 아래 예제를 참조하세요. `VPC_ID`를 클러스터 생성 중에 전달하는 VPC의 ID로 바꿉니다.

```
aws ec2 describe-network-interfaces \
--query 'NetworkInterfaces[?(VpcId == VPC_ID && contains(Description,Amazon EKS))].PrivateIpAddress'
```

## AWS VPC 및 서브넷 설정
<a name="hybrid-nodes-networking-vpc"></a>

Amazon EKS에 대한 기존 [VPC 및 서브넷 요구 사항](network-reqs.md)은 하이브리드 노드가 있는 클러스터에 적용됩니다. 또한 VPC CIDR은 온프레미스 노드 및 포드 CIDR과 중첩될 수 없습니다. 온프레미스 노드와 선택적으로 포드 CIDR에 대해 VPC 라우팅 테이블에서 경로를 구성해야 합니다. 이 경로는 일반적으로 가상 프라이빗 게이트웨이(VGW) 또는 전송 게이트웨이(TGW)인 하이브리드 네트워크 연결에 사용 중인 게이트웨이로 트래픽을 라우팅하도록 설정되어야 합니다. TGW 또는 VGW를 사용하여 VPC를 온프레미스 환경에 연결하는 경우 VPC에 대한 TGW 또는 VGW 연결을 생성해야 합니다. VPC는 DNS 호스트 이름과 DNS 확인을 모두 지원해야 합니다.

다음 단계에서는 AWS CLI를 사용합니다. AWS Management Console에서 또는 AWS CloudFormation, AWS CDK, Terraform과 같은 다른 인터페이스를 사용하여 이러한 리소스를 생성할 수도 있습니다.

### 1단계: VPC 생성
<a name="_step_1_create_vpc"></a>

1. 다음 명령을 실행하여 VPC를 생성합니다. VPC\$1CIDR을 RFC 1918(프라이빗), CGNAT(RFC 6598) 또는 비RFC 1918/비CGNAT(퍼블릭)(예: 10.0.0.0/16)인 IPv4 CIDR 범위로 바꿉니다. 참고: EKS 요구 사항인 DNS 확인은 기본적으로 VPC에 대해 활성화됩니다.

   ```
   aws ec2 create-vpc --cidr-block VPC_CIDR
   ```

1. VPC의 DNS 호스트 이름을 활성화합니다. 참고로 DNS 확인은 기본적으로 VPC에 대해 활성화됩니다. `VPC_ID`를 이전 단계에서 생성한 VPC의 ID로 바꿉니다.

   ```
   aws ec2 modify-vpc-attribute --vpc-id VPC_ID --enable-dns-hostnames
   ```

### 2단계: 서브넷 생성
<a name="_step_2_create_subnets"></a>

서브넷을 2개 이상 생성합니다. Amazon EKS는 클러스터 네트워크 인터페이스에 이러한 서브넷을 사용합니다. 자세한 내용은 [Subnets requirements and considerations](network-reqs.md#network-requirements-subnets)을 참조하세요.

1. 다음 명령을 사용하여 AWS 리전의 가용 영역을 찾을 수 있습니다. `us-west-2`를 해당 리전으로 바꿉니다.

   ```
   aws ec2 describe-availability-zones \
        --query 'AvailabilityZones[?(RegionName == us-west-2)].ZoneName'
   ```

1. 서브넷을 만듭니다. `VPC_ID`를 VPC의 ID로 바꿉니다. `SUBNET_CIDR`을 서브넷의 CIDR 블록(예: 10.0.1.0/24)으로 바꿉니다. `AZ`를 서브넷이 생성될 가용 영역(예: us-west-2a)으로 바꿉니다. 생성하는 서브넷은 2개 이상의 서로 다른 가용 영역에 있어야 합니다.

   ```
   aws ec2 create-subnet \
       --vpc-id VPC_ID \
       --cidr-block SUBNET_CIDR \
       --availability-zone AZ
   ```

### (선택 사항) 3단계: Amazon VPC Transit Gateway(TGW) 또는 AWS Direct Connect 가상 프라이빗 게이트웨이(VGW)에 VPC 연결
<a name="optional_step_3_attach_vpc_with_amazon_vpc_transit_gateway_tgw_or_shared_aws_direct_connect_virtual_private_gateway_vgw"></a>

TGW 또는 VGW를 사용하는 경우 VPC를 TGW 또는 VGW에 연결합니다. 자세한 내용은 [Amazon VPC attachments in Amazon VPC Transit Gateways](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-vpc-attachments.html) 또는 [AWS Direct Connect virtual private gateway associations](https://docs.aws.amazon.com/vpn/latest/s2svpn/how_it_works.html#VPNGateway).를 참조하세요.

 **전송 게이트웨이** 

다음 명령을 실행하여 전송 게이웨이를 연결합니다. `VPC_ID`를 VPC의 ID로 바꿉니다. `SUBNET_ID1` 및 `SUBNET_ID2`를 이전 단계에서 생성한 서브넷의 ID로 바꿉니다. `TGW_ID`를 TGW의 ID로 바꿉니다.

```
aws ec2 create-transit-gateway-vpc-attachment \
    --vpc-id VPC_ID \
    --subnet-ids SUBNET_ID1 SUBNET_ID2 \
    --transit-gateway-id TGW_ID
```

 **가상 프라이빗 게이트웨이** 

다음 명령을 실행하여 전송 게이웨이를 연결합니다. `VPN_ID`를 VGW의 ID로 바꿉니다. `VPC_ID`를 VPC의 ID로 바꿉니다.

```
aws ec2 attach-vpn-gateway \
    --vpn-gateway-id VPN_ID \
    --vpc-id VPC_ID
```

### (선택 사항) 4단계: 라우팅 테이블 생성
<a name="_optional_step_4_create_route_table"></a>

VPC의 기본 라우팅 테이블을 수정하거나 사용자 지정 라우팅 테이블을 생성할 수 있습니다. 다음 단계에서는 온프레미스 노드 및 포드 CIDR에 대한 경로가 포함된 사용자 지정 라우팅 테이블을 생성합니다. 자세한 내용은 [Subnet route tables](https://docs.aws.amazon.com/vpc/latest/userguide/subnet-route-tables.html)을 참조하세요. `VPC_ID`를 VPC의 ID로 바꿉니다.

```
aws ec2 create-route-table --vpc-id VPC_ID
```

### 5단계: 온프레미스 노드 및 포드에 대한 경로 생성
<a name="_step_5_create_routes_for_on_premises_nodes_and_pods"></a>

각 온프레미스 원격 노드의 라우팅 테이블에서 경로를 생성합니다. VPC의 기본 라우팅 테이블을 수정하거나 이전 단계에서 생성한 사용자 지정 라우팅 테이블을 사용할 수 있습니다.

아래 예제에서는 온프레미스 노드 및 포드 CIDR에 대한 경로를 생성하는 방법을 보여줍니다. 이 예제에서는 전송 게이트웨이(TGW)를 사용하여 VPC를 온프레미스 환경에 연결합니다. 온프레미스 노드와 포드 CIDR이 여러 개인 경우 각 CIDR에 대해 단계를 반복합니다.
+ 인터넷 게이트웨이 또는 가상 프라이빗 게이트웨이(VGW)를 사용하는 경우 `--transit-gateway-id`를 `--gateway-id`로 바꿉니다.
+ `RT_ID`를 이전 단계에서 생성한 라우팅 테이블의 ID로 바꿉니다.
+ `REMOTE_NODE_CIDR`을 하이브리드 노드에 사용할 CIDR 범위로 바꿉니다.
+ `REMOTE_POD_CIDR`을 하이브리드 노드에서 실행되는 포드에 사용할 CIDR 범위로 바꿉니다. 포드 CIDR 범위는 온프레미스 오버레이 네트워크를 가장 일반적으로 사용하는 컨테이너 네트워킹 인터페이스(CNI) 구성에 해당합니다. 자세한 내용은 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md) 섹션을 참조하세요.
+ `TGW_ID`를 TGW의 ID로 바꿉니다.

 **원격 노드 네트워크** 

```
aws ec2 create-route \
    --route-table-id RT_ID \
    --destination-cidr-block REMOTE_NODE_CIDR \
    --transit-gateway-id TGW_ID
```

 **원격 포드 네트워크** 

```
aws ec2 create-route \
    --route-table-id RT_ID \
    --destination-cidr-block REMOTE_POD_CIDR \
    --transit-gateway-id TGW_ID
```

### (선택 사항) 6단계: 서브넷을 라우팅 테이블에 연결
<a name="_optional_step_6_associate_subnets_with_route_table"></a>

이전 단계에서 사용자 지정 라우팅 테이블을 생성한 경우 이전 단계에서 생성한 각 서브넷을 사용자 지정 라우팅 테이블과 연결합니다. VPC 기본 라우팅 테이블을 수정하는 경우 서브넷이 VPC의 기본 라우팅 테이블과 자동으로 연결되며 이 단계를 건너뛸 수 있습니다.

이전 단계에서 생성한 각 서브넷에 대해 다음 명령을 실행합니다. `RT_ID`를 이전 단계에서 생성한 라우팅 테이블로 바꿉니다. `SUBNET_ID`를 서브넷의 ID로 바꿉니다.

```
aws ec2 associate-route-table --route-table-id RT_ID --subnet-id SUBNET_ID
```

## 클러스터 보안 그룹 고려 사항
<a name="hybrid-nodes-networking-cluster-sg"></a>

지속적인 클러스터 작업을 위해서는 EKS 클러스터 보안 그룹에 대한 다음 액세스 권한이 필요합니다. Amazon EKS는 원격 노드 및 포드 네트워크가 구성된 클러스터를 생성하거나 업데이트할 때 하이브리드 노드에 필요한 **인바운드** 보안 그룹 규칙을 자동으로 생성합니다. 보안 그룹은 기본적으로 모든 **아웃바운드** 트래픽을 허용하므로 Amazon EKS는 하이브리드 노드에 대한 클러스터 보안 그룹의 **아웃바운드** 규칙을 자동으로 수정하지 않습니다. 클러스터 보안 그룹을 사용자 지정하려면 다음 표의 규칙으로 트래픽을 제한할 수 있습니다.


| Type | 프로토콜 | Direction | 포트 | 소스 | Destination | 사용법 | 
| --- | --- | --- | --- | --- | --- | --- | 
|  HTTPS  |  TCP  |  인바운드  |  443  |  원격 노드 CIDR  |  해당 사항 없음  |  Kubelet에서 Kubernetes API 서버로  | 
|  HTTPS  |  TCP  |  인바운드  |  443  |  원격 포드 CIDR  |  해당 사항 없음  |  CNI가 포드 트래픽에 NAT를 사용하지 않을 때 K8s API 서버에 대한 액세스가 필요한 포드입니다.  | 
|  HTTPS  |  TCP  |  아웃바운드  |  10250  |  해당 사항 없음  |  원격 노드 CIDR  |  Kubernetes API 서버에서 Kubelet으로  | 
|  HTTPS  |  TCP  |  아웃바운드  |  웹후크 포트  |  해당 사항 없음  |  원격 포드 CIDR  |  Kubernetes API 서버에서 웹후크로(하이브리드 노드에서 웹후크를 실행하는 경우)  | 

**중요**  
 **보안 그룹 규칙 제한**: Amazon EC2 보안 그룹에는 기본적으로 최대 60개의 인바운드 규칙이 있습니다. 클러스터 보안 그룹이 이 제한에 근접하면 보안 그룹 인바운드 규칙이 적용되지 않을 수 있습니다. 이 경우 누락된 인바운드 규칙에 수동으로 추가해야 할 수 있습니다.  
 **CIDR 정리 책임**: EKS 클러스터에서 원격 노드 또는 포드 네트워크를 제거하는 경우 EKS는 해당 보안 그룹 규칙을 자동으로 제거하지 않습니다. 사용자가 직접 보안 그룹 규칙에서 사용하지 않은 원격 노드 또는 포드 네트워크를 수동으로 제거해야 합니다.

Amazon EKS에서 생성하는 클러스터 보안 그룹에 대한 자세한 내용을 알아보려면 [클러스터에 대한 Amazon EKS 보안 그룹 요구 사항 보기](sec-group-reqs.md) 부분을 참조하세요.

### (선택 사항) 수동 보안 그룹 구성
<a name="_optional_manual_security_group_configuration"></a>

추가 보안 그룹을 생성하거나 자동으로 생성된 규칙을 수정해야 하는 경우 다음 명령을 참조로 사용할 수 있습니다. 기본적으로 아래 명령은 모든 아웃바운드 액세스를 허용하는 보안 그룹을 생성합니다. 위의 규칙만 포함하도록 아웃바운드 액세스를 제한할 수 있습니다. 아웃바운드 규칙을 제한하려는 경우 변경된 규칙을 프로덕션 클러스터에 적용하기 전에 모든 애플리케이션 및 포드 연결을 철저히 테스트하는 것이 좋습니다.
+ 첫 번째 명령에서 `SG_NAME`을 보안 그룹의 이름으로 변경
+ 첫 번째 명령에서 `VPC_ID`를 이전 단계에서 생성한 VPC의 ID로 변경
+ 두 번째 명령에서 `SG_ID`를 첫 번째 명령에서 생성한 보안 그룹의 ID로 변경
+ 두 번째 명령에서 `REMOTE_NODE_CIDR` 및 `REMOTE_POD_CIDR`을 하이브리드 노드 및 온프레미스 네트워크의 값으로 변경

```
aws ec2 create-security-group \
    --group-name SG_NAME \
    --description "security group for hybrid nodes" \
    --vpc-id VPC_ID
```

```
aws ec2 authorize-security-group-ingress \
    --group-id SG_ID \
    --ip-permissions '[{"IpProtocol": "tcp", "FromPort": 443, "ToPort": 443, "IpRanges": [{"CidrIp": "REMOTE_NODE_CIDR"}, {"CidrIp": "REMOTE_POD_CIDR"}]}]'
```

# 하이브리드 노드용 운영 체제 준비
<a name="hybrid-nodes-os"></a>

Bottlerocket, Amazon Linux 2023(AL2023), Ubuntu 및 RHEL은 하이브리드 노드의 노드 운영 체제로 사용하기 위해 지속적으로 검증됩니다. Bottlerocket은 VMware vSphere 환경에서만 AWS에서 지원됩니다. AL2023은 Amazon EC2 외부에서 실행되는 경우 AWS 지원 플랜의 적용을 받지 않습니다. AL2023은 온프레미스 가상화 환경에서만 사용할 수 있습니다. 자세한 내용은 [Amazon Linux 2023 사용 설명서](https://docs.aws.amazon.com/linux/al2023/ug/outside-ec2.html)를 참조하세요. AWS는 Ubuntu 및 RHEL 운영 체제와의 하이브리드 노드 통합을 지원하지만 운영 체제 자체에 대한 지원은 제공하지 않습니다.

운영 체제 프로비저닝 및 관리는 사용자의 책임입니다. 하이브리드 노드를 처음 테스트하는 경우 이미 프로비저닝된 호스트에서 Amazon EKS Hybrid Nodes CLI(`nodeadm`)를 실행하는 것이 가장 쉽습니다. 프로덕션 배포의 경우 호스트 시작 시 호스트를 Amazon EKS 클러스터에 자동으로 조인하기 위해 systemd 서비스로 실행되도록 구성된 `nodeadm`을 운영 체제 이미지에 포함하는 것이 좋습니다. Bottlerocket을 vSphere의 노드 운영 체제로 사용하는 경우 Bottlerocket은 하이브리드 노드에 필요한 종속성을 이미 포함하고 호스트 시작 시 구성한 클러스터에 자동으로 연결되므로 `nodeadm`을 사용할 필요가 없습니다.

## 버전 호환성
<a name="_version_compatibility"></a>

아래 표는 하이브리드 노드의 노드 운영 체제로 사용할 수 있도록 호환되고 검증된 운영 체제 버전을 나타냅니다. 이 표에 포함되지 않은 다른 운영 체제 변형 또는 버전을 사용하는 경우 하이브리드 노드와 운영 체제 변형 또는 버전의 호환성은 AWS 지원에 포함되지 않습니다. 하이브리드 노드는 기본 인프라에 구애받지 않으며 x86 및 ARM 아키텍처를 지원합니다.


| 운영 체제 | 버전 | 
| --- | --- | 
|  Amazon Linux  |  Amazon Linux 2023(AL2023)  | 
|  Bottlerocket  |  Kubernetes v1.28 이상을 실행하는 v1.37.0 이상의 VMware 변형  | 
|  Ubuntu  |  Ubuntu 20.04, Ubuntu 22.04, Ubuntu 24.04  | 
|  Red Hat Enterprise Linux  |  RHEL 8, RHEL 9  | 

## 운영 체제 고려 사항
<a name="_operating_system_considerations"></a>

### 일반
<a name="_general"></a>
+ Amazon EKS Hybrid Nodes CLI(`nodeadm`)를 사용하여 하이브리드 노드 구성 요소 및 종속성의 설치 및 구성을 간소화할 수 있습니다. 운영 체제 이미지 빌드 파이프라인 중에 또는 각 온프레미스 호스트의 런타임에 `nodeadm install` 프로세스를 실행할 수 있습니다. `nodeadm`이 설치하는 구성 요소에 대한 자세한 내용은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md) 섹션을 참조하세요.
+ 온프레미스 환경에서 프록시를 사용하여 인터넷에 연결하는 경우 설치 및 업그레이드 프로세스에서 프록시를 사용하도록 패키지 관리자를 구성하기 위해 추가 운영 체제 구성이 필요합니다. 자세한 내용은 [하이브리드 노드용 프록시 구성](hybrid-nodes-proxy.md) 섹션을 참조하세요.

### Bottlerocket
<a name="_bottlerocket"></a>
+ Bottlerocket 노드를 연결하는 단계 및 도구는 다른 운영 체제의 단계와 다르며 [하이브리드 노드 연결](hybrid-nodes-join.md)의 단계 대신 [Bottlerocket을 실행하는 하이브리드 노드 연결](hybrid-nodes-bottlerocket.md)에서 별도로 다룹니다.
+ Bottlerocket의 단계에서는 하이브리드 노드 CLI 도구인 `nodeadm`을 사용하지 않습니다.
+ Bottlerocket 버전 v1.37.0 이상의 VMware 변형만 EKS Hybrid Nodes에서 지원됩니다. Bottlerocket의 VMware 변형은 Kubernetes 버전 v1.28 이상에서 사용할 수 있습니다. [다른 Bottlerocket 변형](https://bottlerocket.dev/en/os/1.36.x/concepts/variants)은 하이브리드 노드 운영 체제로 지원되지 않습니다. 참고: Bottlerocket의 VMware 변형은 x86\$164 아키텍처에서만 사용할 수 있습니다.

### Containered
<a name="_containerd"></a>
+ Containerd는 표준 Kubernetes 컨테이너 런타임이며 하이브리드 노드와 모든 Amazon EKS 노드 컴퓨팅 유형에 대한 종속성입니다. Amazon EKS Hybrid Nodes CLI(`nodeadm`)는 `nodeadm install` 프로세스 중에 Containered 설치를 시도합니다. `--containerd-source` 명령줄 옵션을 사용하여 `nodeadm install` 런타임에 Containered 설치를 구성할 수 있습니다. 유효한 옵션은 `none`, `distro`, `docker`입니다. RHEL을 사용하는 경우 `distro`는 유효한 옵션이 아니며 Docker의 리포지토리에서 Containered 빌드를 설치하도록 `nodeadm`을 구성하거나 Containered를 수동으로 설치할 수 있습니다. AL2023 또는 Ubuntu를 사용하는 경우는 `nodeadm`은 기본적으로 운영 체제 배포에서 Containered를 설치합니다. nodeadm이 Containered를 설치하지 않게 하려면 `--containerd-source none` 옵션을 사용합니다.

### Ubuntu
<a name="_ubuntu"></a>
+ Ubuntu 24.04를 사용하는 경우 Containered 버전을 업데이트하거나 포드가 올바르게 종료되게 하는 수정 사항을 채택하도록 AppArmor 구성을 변경해야 할 수 있습니다. [Ubuntu \$12065423](https://bugs.launchpad.net/ubuntu/+source/containerd-app/\+bug/2065423)을 참조하세요. AppArmor 프로필에 변경 사항을 적용하려면 재부팅해야 합니다. 최신 버전의 Ubuntu 24.04에는 패키지 관리자에 수정 사항이 포함되어 업데이트된 Containered 버전이 있습니다(Containered 버전 1.7.19 이상).

### ARM
<a name="_arm"></a>
+ ARM 하드웨어를 사용하는 경우 EKS kube-proxy 추가 기능 버전 1.31 이상을 실행하려면 Cryptography Extension(ARMv8.2\$1crypto)이 포함된 ARMv8.2 호환 프로세서가 필요합니다. Raspberry Pi 5 이전의 모든 Raspberry Pi 시스템과 Cortex-A72 기반 프로세서는 이 요구 사항을 충족하지 않습니다. 해결 방법으로 2026년 7월에 확장 지원이 종료될 때까지 EKS kube-proxy 추가 기능 1.30 버전을 계속 사용하거나, [Kubernetes 릴리스 일정](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)을 참조하거나, 업스트림의 사용자 지정 kube-proxy 이미지를 사용할 수 있습니다.
+ kube-proxy 로그의 다음 오류 메시지는 이 비호환성을 나타냅니다.

```
Fatal glibc error: This version of Amazon Linux requires a newer ARM64 processor compliant with at least ARM architecture 8.2-a with Cryptographic extensions. On EC2 this is Graviton 2 or later.
```

## 운영 체제 이미지 구축
<a name="_building_operating_system_images"></a>

Amazon EKS가 제공하는 [Packer 템플릿 예제](https://github.com/aws/eks-hybrid/tree/main/example/packer)를 사용하여 호스트 시작 시 실행되도록 구성하고 `nodeadm`을 포함하는 운영 체제 이미지를 생성할 수 있습니다. 이 프로세스는 각 호스트에서 하이브리드 노드 종속성을 개별적으로 가져오지 않도록 하고 하이브리드 노드 부트스트랩 프로세스를 자동화하기 위해 권장됩니다. Packer 템플릿 예제를 Ubuntu 22.04, Ubuntu 24.04, RHEL 8 또는 RHEL 9 ISO 이미지와 함께 사용하고 OVA, Qcow2 또는 원시 형식으로 이미지를 출력할 수 있습니다.

### 사전 조건
<a name="_prerequisites"></a>

Packer 템플릿 예제를 사용하기 전에 Packer를 실행 중인 시스템에 다음이 설치되어 있어야 합니다.
+ Packer 버전 1.11.0 이상. Packer 설치에 대한 지침은 Packer 설명서에서 [Install Packer](https://developer.hashicorp.com/packer/tutorials/docker-get-started/get-started-install-cli)를 참조하세요.
+ OVA를 빌드하는 경우 VMware vSphere 플러그인 1.4.0 이상
+ `Qcow2`를 빌드하거나 원시 이미지인 경우 QEMU 플러그인 버전 1.x

### 환경 변수 설정
<a name="_set_environment_variables"></a>

Packer 빌드를 실행하기 전에 Packer를 실행 중인 시스템에서 다음 환경 변수를 설정합니다.

 **일반** 

모든 운영 체제 및 출력 형식으로 이미지를 빌드하려면 다음 환경 변수를 설정해야 합니다.


| 환경 변수 | Type | 설명 | 
| --- | --- | --- | 
|  PKR\$1SSH\$1PASSWORD  |  문자열  |  Packer는 `ssh_username` 및 `ssh_password` 변수를 사용하여 프로비저닝 시 생성된 시스템으로 SSH를 적용합니다. 이는 각 OS의 시작 또는 사용자 데이터 파일 내에서 초기 사용자를 생성하는 데 사용되는 암호와 일치해야 합니다. 기본값은 OS에 따라 '빌더' 또는 'ubuntu'로 설정됩니다. 암호를 설정할 때 일치하는 해당 `ks.cfg` 또는 `user-data` 파일 내에서 암호를 변경해야 합니다.  | 
|  ISO\$1URL  |  문자열  |  사용할 ISO의 URL입니다. 서버에서 다운로드할 웹 링크 또는 로컬 파일의 절대 경로일 수 있습니다.  | 
|  ISO\$1CHECKSUM  |  문자열  |  제공된 ISO에 대한 관련 체크섬입니다.  | 
|  CREDENTIAL\$1PROVIDER  |  문자열  |  하이브리드 노드의 자격 증명 공급자입니다. 유효한 값은 SSM 하이브리드 활성화의 경우 `ssm`(기본값), IAM Roles Anywhere의 경우 `iam`입니다.  | 
|  K8S\$1VERSION  |  문자열  |  하이브리드 노드용 Kubernetes 버전(예: `1.31`)입니다. 지원되는 Kubernetes 버전은 [Amazon EKS 지원 버전](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)을 참조하세요.  | 
|  NODEADM\$1ARCH  |  문자열  |  `nodeadm install`용 아키텍처입니다. `amd` 또는 `arm`을 선택합니다.  | 

 **RHEL** 

RHEL을 사용하는 경우 다음 환경 변수를 설정해야 합니다.


| 환경 변수 | Type | 설명 | 
| --- | --- | --- | 
|  RH\$1USERNAME  |  문자열  |  RHEL 구독 관리자 사용자 이름  | 
|  RH\$1PASSWORD  |  문자열  |  RHEL 구독 관리자 암호  | 
|  RHEL\$1VERSION  |  문자열  |  사용 중인 Rhel iso 버전입니다. 유효한 값은 `8` 또는 `9`입니다.  | 

 **Ubuntu** 

Ubuntu별 환경 변수는 필요하지 않습니다.

 **vSphere** 

VMware vSphere OVA를 빌드하는 경우 다음 환경 변수를 설정해야 합니다.


| 환경 변수 | Type | 설명 | 
| --- | --- | --- | 
|  VSPHERE\$1SERVER  |  문자열  |  vSphere 서버 주소  | 
|  VSPHERE\$1USER  |  문자열  |  vSphere 사용자 이름  | 
|  VSPHERE\$1PASSWORD  |  문자열  |  vSphere 암호  | 
|  VSPHERE\$1DATACENTER  |  문자열  |  vSphere 데이터 센터 이름  | 
|  VSPHERE\$1CLUSTER  |  문자열  |  vSphere 클러스터 이름  | 
|  VSPHERE\$1DATASTORE  |  문자열  |  vSphere 데이터 저장소 이름  | 
|  VSPHERE\$1NETWORK  |  문자열  |  vSphere 네트워크 이름  | 
|  VSPHERE\$1OUTPUT\$1FOLDER  |  문자열  |  템플릿의 vSphere 출력 폴더  | 

 **QEMU** 


| 환경 변수 | Type | 설명 | 
| --- | --- | --- | 
|  PACKER\$1OUTPUT\$1FORMAT  |  문자열  |  QEMU 빌더의 출력 형식입니다. 유효 값은 `qcow2` 및 `raw`입니다.  | 

 **템플릿 확인** 

빌드를 실행하기 전에 환경 변수를 설정한 후 다음 명령을 사용하여 템플릿을 확인합니다. 템플릿에 다른 이름을 사용하는 경우 `template.pkr.hcl`을 바꿉니다.

```
packer validate template.pkr.hcl
```

### 이미지 빌드
<a name="_build_images"></a>

다음 명령을 사용하여 이미지를 빌드하고 `-only` 플래그를 사용하여 이미지의 대상 및 운영 체제를 지정합니다. 템플릿에 다른 이름을 사용하는 경우 `template.pkr.hcl`을 바꿉니다.

 **vSphere OVA** 

**참고**  
vSphere와 함께 RHEL을 사용하는 경우 시작 파일을 OEMDRV 이미지로 변환하고 부팅할 ISO로 전달해야 합니다. 자세한 내용은 EKS 하이브리드 노드 GitHub 리포지토리의 [Packer Readme](https://github.com/aws/eks-hybrid/tree/main/example/packer#utilizing-rhel-with-vsphere)를 참조하세요.

 **Ubuntu 22.04 OVA** 

```
packer build -only=general-build.vsphere-iso.ubuntu22 template.pkr.hcl
```

 **Ubuntu 24.04 OVA** 

```
packer build -only=general-build.vsphere-iso.ubuntu24 template.pkr.hcl
```

 **RHEL 8 OVA** 

```
packer build -only=general-build.vsphere-iso.rhel8 template.pkr.hcl
```

 **RHEL 9 OVA** 

```
packer build -only=general-build.vsphere-iso.rhel9 template.pkr.hcl
```

 **QEMU** 

**참고**  
빌더 호스트와 일치하지 않는 특정 호스트 CPU의 이미지를 빌드하는 경우 호스트 CPU와 일치하는 이름에 대한 [QEMU](https://www.qemu.org/docs/master/system/qemu-cpu-models.html) 설명서를 참조하고 다음 명령을 실행할 때 `-cpu` 플래그를 호스트 CPU 이름과 함께 사용합니다.

 **Ubuntu 22.04 Qcow2 / 원시** 

```
packer build -only=general-build.qemu.ubuntu22 template.pkr.hcl
```

 **Ubuntu 24.04 Qcow2 / 원시** 

```
packer build -only=general-build.qemu.ubuntu24 template.pkr.hcl
```

 **RHEL 8 Qcow2 / 원시** 

```
packer build -only=general-build.qemu.rhel8 template.pkr.hcl
```

 **RHEL 9 Qcow2 / 원시** 

```
packer build -only=general-build.qemu.rhel9 template.pkr.hcl
```

### 사용자 데이터를 통해 nodeadm 구성 전달
<a name="_pass_nodeadm_configuration_through_user_data"></a>

Cloud-init을 통해 사용자 데이터에서 `nodeadm`에 대한 구성을 전달하여 호스트 시작 시 하이브리드 노드를 구성하고 EKS 클러스터에 자동으로 연결할 수 있습니다. 다음은 VMware vSphere를 하이브리드 노드의 인프라로 사용할 때 이를 수행하는 방법의 예입니다.

1. GitHub의 [govc readme](https://github.com/vmware/govmomi/blob/main/govc/README.md) 지침에 따라 `govc` CLI를 설치합니다.

1. 이전 섹션에서 Packer 빌드를 실행하고 템플릿을 프로비저닝한 후 다음을 사용하여 템플릿을 복제하고 여러 노드를 생성할 수 있습니다. 하이브리드 노드에 사용하기 위해 생성하는 새 VM마다 템플릿을 복제해야 합니다. 아래 명령에서 다음 변수를 해당 환경의 값으로 바꿉니다. 아래 명령의 `VM_NAME`은 `metadata.yaml` 파일을 통해 VM의 이름을 주입할 때 `NODE_NAME`으로 사용됩니다.

   ```
   govc vm.clone -vm "/PATH/TO/TEMPLATE" -ds="YOUR_DATASTORE" \
       -on=false -template=false -folder=/FOLDER/TO/SAVE/VM "VM_NAME"
   ```

1. 새로운 각 VM에 대한 템플릿을 복제한 후 VM에 대한 `userdata.yaml` 및 `metadata.yaml`을 생성합니다. VM은 동일한 `userdata.yaml` 및 `metadata.yaml`을 공유할 수 있으며 아래 단계에서 VM별로 이를 채웁니다. `nodeadm` 구성은 `userdata.yaml`의 `write_files` 섹션에서 생성 및 정의됩니다. 아래 예제에서는 AWS SSM 하이브리드 활성화를 하이브리드 노드의 온프레미스 자격 증명 공급자로 사용합니다. `nodeadm` 구성에 대한 자세한 내용은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md) 섹션을 참조하세요.

    **userdata.yaml:** 

   ```
   #cloud-config
   users:
     - name: # username for login. Use 'builder' for RHEL or 'ubuntu' for Ubuntu.
       passwd: # password to login. Default is 'builder' for RHEL.
       groups: [adm, cdrom, dip, plugdev, lxd, sudo]
       lock-passwd: false
       sudo: ALL=(ALL) NOPASSWD:ALL
       shell: /bin/bash
   
   write_files:
     - path: /usr/local/bin/nodeConfig.yaml
       permissions: '0644'
       content: |
         apiVersion: node.eks.aws/v1alpha1
         kind: NodeConfig
         spec:
             cluster:
                 name: # Cluster Name
                 region: # AWS region
             hybrid:
                 ssm:
                     activationCode: # Your ssm activation code
                     activationId: # Your ssm activation id
   
   runcmd:
     - /usr/local/bin/nodeadm init -c file:///usr/local/bin/nodeConfig.yaml >> /var/log/nodeadm-init.log 2>&1
   ```

    **metadata.yaml:** 

   환경에 대한 `metadata.yaml`을 생성합니다. `"$NODE_NAME"` 변수 형식은 후속 단계의 값으로 채워지므로 파일에 그대로 둡니다.

   ```
   instance-id: "$NODE_NAME"
   local-hostname: "$NODE_NAME"
   network:
     version: 2
     ethernets:
       nics:
         match:
           name: ens*
         dhcp4: yes
   ```

1. 다음 명령을 사용하여 `userdata.yaml` 및 `metadata.yaml` 파일을 `gzip+base64` 문자열로 추가합니다. 생성하는 각 VM에 대해 다음 명령을 실행해야 합니다. `VM_NAME`을 업데이트 중인 VM의 이름으로 바꿉니다.

   ```
   export NODE_NAME="VM_NAME"
   export USER_DATA=$(gzip -c9 <userdata.yaml | base64)
   
   govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.userdata="${USER_DATA}"
   govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.userdata.encoding=gzip+base64
   
   envsubst '$NODE_NAME' < metadata.yaml > metadata.yaml.tmp
   export METADATA=$(gzip -c9 <metadata.yaml.tmp | base64)
   
   govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.metadata="${METADATA}"
   govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.metadata.encoding=gzip+base64
   ```

1. 구성한 EKS 클러스터에 자동으로 연결되어야 하는 새 VM의 전원을 켭니다.

   ```
   govc vm.power -on "${NODE_NAME}"
   ```

# 하이브리드 노드에 대한 자격 증명 준비
<a name="hybrid-nodes-creds"></a>

Amazon EKS Hybrid Nodes는 AWS SSM 하이브리드 활성화 또는 AWS IAM Roles Anywhere에서 프로비저닝한 임시 IAM 자격 증명을 사용하여 Amazon EKS 클러스터로 인증합니다. Amazon EKS Hybrid Nodes CLI(`nodeadm`)와 함께 AWS SSM 하이브리드 활성화 또는 AWS IAM Roles Anywhere를 사용해야 합니다. AWS SSM 하이브리드 활성화와 AWS IAM Roles Anywhere를 둘 다 사용해서는 안 됩니다. 인증 기관(CA)이 있는 기존 퍼블릭 키 인프라(PKI)와 온프레미스 환경에 대한 인증서가 없는 경우 AWS SSM 하이브리드 활성화를 사용하는 것이 좋습니다. 온프레미스에 기존 PKI 및 인증서가 있는 경우 AWS IAM Roles Anywhere를 사용합니다.

## 하이브리드 노드 IAM 역할
<a name="hybrid-nodes-role"></a>

하이브리드 노드를 Amazon EKS 클러스터에 연결하려면 먼저 하이브리드 노드 자격 증명에 대해 AWS SSM 하이브리드 활성화 또는 AWS IAM Roles Anywhere와 함께 사용할 IAM 역할을 생성해야 합니다. 클러스터를 생성한 후 이 역할을 Amazon EKS 액세스 항목 또는 `aws-auth` ConfigMap 항목과 함께 사용하여 IAM 역할을 Kubernetes 역할 기반 액세스 제어(RBAC)에 매핑합니다. 하이브리드 노드 IAM 역할을 Kubernetes RBAC와 연결하는 방법에 대한 자세한 내용은 [하이브리드 노드에 대한 클러스터 액세스 준비](hybrid-nodes-cluster-prep.md) 섹션을 참조하세요.

하이브리드 노드 IAM 역할에는 다음과 같은 권한이 있어야 합니다.
+ `nodeadm`이 `eks:DescribeCluster` 작업을 사용하여 하이브리드 노드를 연결할 클러스터에 대한 정보를 수집하는 권한. `eks:DescribeCluster` 작업을 활성화하지 않으면 `nodeadm init` 명령에 전달하는 노드 구성에서 Kubernetes API 엔드포인트, 클러스터 CA 번들, 서비스 IPv4 CIDR을 전달해야 합니다.
+ `nodeadm`이 `eks:ListAccessEntries` 작업을 사용하여 하이브리드 노드를 연결할 클러스터에서 액세스 항목을 나열하는 권한. `eks:ListAccessEntries` 작업을 활성화하지 않으면 `nodeadm init` 명령을 실행할 때 `--skip cluster-access-validation` 플래그를 전달해야 합니다.
+ [AmazonEC2ContainerRegistryPullOnly](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2ContainerRegistryPullOnly.html) 정책의 정의에 따라 kubelet이 Amazon Elastic Container Registry(Amazon ECR)의 컨테이너 이미지를 사용할 수 있는 권한입니다.
+ AWS SSM을 사용하는 경우 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonSSMManagedInstanceCore.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonSSMManagedInstanceCore.html) 정책에 정의된 대로 `nodeadm init`에서 AWS SSM 하이브리드 활성화를 사용할 수 있는 권한.
+ AWS SSM을 사용하는 경우 `nodeadm uninstall`에서 인스턴스 등록을 취소하기 위해 `ssm:DeregisterManagedInstance` 작업과 `ssm:DescribeInstanceInformation` 작업을 사용할 수 있는 권한입니다.
+ (선택사항) Amazon EKS Pod Identity 에이전트에서 `eks-auth:AssumeRoleForPodIdentity` 작업을 사용하여 포드에 대한 보안 인증 정보를 검색할 수 있는 권한.

## AWS SSM 하이브리드 활성화 설정
<a name="hybrid-nodes-ssm"></a>

AWS SSM 하이브리드 활성화를 설정하기 전에 하이브리드 노드 IAM 역할을 생성하고 구성해야 합니다. 자세한 내용은 [하이브리드 노드 IAM 역할 생성](#hybrid-nodes-create-role) 섹션을 참조하세요. AWS Systems Manager 사용 설명서의 [하이브리드 활성화를 생성하여 Systems Manager에 노드 등록](https://docs.aws.amazon.com/systems-manager/latest/userguide/hybrid-activation-managed-nodes.html) 지침에 따라 하이브리드 노드에 대한 AWS SSM 하이브리드 활성화를 생성합니다. 수신한 활성화 코드와 ID는 호스트를 Amazon EKS 클러스터에 하이브리드 노드로 등록할 때 `nodeadm`과 함께 사용됩니다. 하이브리드 노드용 Amazon EKS 클러스터를 생성하고 준비한 후 나중에 이 단계로 돌아갈 수 있습니다.

**중요**  
활성화를 생성한 방법에 따라, Systems Manager는 활성화 코드 및 ID를 콘솔이나 명령 창에 즉시 반환합니다. 이 정보를 복사하여 안전한 장소에 보관하십시오. 콘솔에서 벗어나거나 명령 창을 닫으면 이 정보가 손실될 수 있습니다. 이 정보가 손실하면 새로운 정품 인증을 생성해야 합니다.

기본적으로 AWS SSM 하이브리드 활성화는 24시간 동안 활성화됩니다. 또는 `2024-08-01T00:00:00`과 같은 타임스탬프 형식으로 하이브리드 활성화를 생성할 때 `--expiration-date`를 지정할 수 있습니다. AWS SSM을 자격 증명 공급자로 사용하는 경우 하이브리드 노드의 노드 이름은 구성할 수 없으며 AWS SSM에서 자동으로 생성됩니다. AWS Systems Manager 콘솔의 Fleet Manager에서 AWS SSM 관리형 인스턴스를 보고 관리할 수 있습니다. 추가 비용 없이 AWS 리전별로 계정당 최대 1,000개의 표준 [하이브리드 활성화 노드](https://docs.aws.amazon.com/systems-manager/latest/userguide/activations.html)를 등록할 수 있습니다. 그러나 1,000개 이상의 하이브리드 노드를 등록하려면 고급 인스턴스 티어를 활성화해야 합니다. [Amazon EKS Hybrid Nodes 요금](https://aws.amazon.com/eks/pricing/)에 포함되지 않은 고급 인스턴스 티어를 사용하는 경우 요금이 부과됩니다. 자세한 내용은 [AWS Systems Manager 요금](https://aws.amazon.com/systems-manager/pricing/)을 참조하세요.

하이브리드 노드 IAM 역할을 사용하여 AWS SSM 하이브리드 활성화를 생성하는 방법은 아래 예제를 참조하세요. 하이브리드 노드 자격 증명에 AWS SSM 하이브리드 활성화를 사용하는 경우 하이브리드 노드의 이름은 `mi-012345678abcdefgh` 형식을 가지며 AWS SSM에서 프로비저닝한 임시 자격 증명은 1시간 동안 유효합니다. AWS SSM을 자격 증명 공급자로 사용하는 경우 노드 이름 또는 자격 증명 기간을 변경할 수 없습니다. 임시 자격 증명은 AWS SSM에 의해 자동으로 교체되며 교체는 노드 또는 애플리케이션의 상태에 영향을 주지 않습니다.

EKS 클러스터당 하나의 AWS SSM 하이브리드 활성화를 사용하여 AWS SSM 하이브리드 활성화와 연결된 인스턴스만 등록 취소할 수 있도록 하이브리드 노드 IAM 역할의 AWS SSM `ssm:DeregisterManagedInstance` 권한 범위를 조정하는 것이 좋습니다. 이 페이지의 예제에서는 EKS 클러스터 ARN이 있는 태그가 사용되며, 이 태그를 사용하여 AWS SSM 하이브리드 활성화를 EKS 클러스터에 매핑할 수 있습니다. 또는 권한 경계 및 요구 사항에 따라 AWS SSM 권한을 조정하는 기본 태그와 방법을 사용할 수 있습니다. 아래 명령의 `REGISTRATION_LIMIT` 옵션은 AWS SSM 하이브리드 활성화를 사용할 수 있는 시스템 수를 제한하는 데 사용되는 정수입니다(예: `10`).

```
aws ssm create-activation \
     --region AWS_REGION \
     --default-instance-name eks-hybrid-nodes \
     --description "Activation for EKS hybrid nodes" \
     --iam-role AmazonEKSHybridNodesRole \
     --tags Key=EKSClusterARN,Value=arn:aws:eks:AWS_REGION:AWS_ACCOUNT_ID:cluster/CLUSTER_NAME \
     --registration-limit REGISTRATION_LIMIT
```

AWS SSM 하이브리드 활성화에 사용할 수 있는 구성 설정에 대한 자세한 내용은 [하이브리드 활성화를 생성하여 Systems Manager에 노드 등록](https://docs.aws.amazon.com/systems-manager/latest/userguide/hybrid-activation-managed-nodes.html)의 지침을 검토하세요.

## AWS IAM Roles Anywhere 설정
<a name="hybrid-nodes-iam-roles-anywhere"></a>

IAM Roles Anywhere 사용 설명서의 [IAM Roles Anywhere 시작하기](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/getting-started.html)의 지침에 따라 하이브리드 노드 IAM 역할에 대한 임시 IAM 자격 증명에 사용할 트러스트 앵커 및 프로필을 설정합니다. 프로필을 생성할 때 역할을 추가하지 않고도 프로필을 생성할 수 있습니다. 이 프로필을 생성하고, 다음 단계로 돌아가서 하이브리드 노드 IAM 역할을 생성한 다음 생성한 후 프로필에 역할을 추가할 수 있습니다. 또는 이 페이지의 뒷부분에 있는 AWS CloudFormation 단계를 사용하여 하이브리드 노드에 대한 IAM Roles Anywhere 설정을 완료할 수 있습니다.

하이브리드 노드 IAM 역할을 프로필에 추가할 때 AWS IAM Roles Anywhere 콘솔의 **프로필 편집** 페이지 하단의 **사용자 지정 역할** 세션 이름 패널에서** 사용자 지정 역할 세션 이름 수락**을 선택합니다. 이는 `CreateProfile` API의 [acceptRoleSessionName](https://docs.aws.amazon.com/rolesanywhere/latest/APIReference/API_CreateProfile.html#rolesanywhere-CreateProfile-request-acceptRoleSessionName) 필드에 해당합니다. 이렇게 하면 부트스트랩 프로세스 중에 `nodeadm`으로 전달하는 구성에서 하이브리드 노드의 사용자 지정 노드 이름을 제공할 수 있습니다. `nodeadm init` 프로세스 중에 사용자 지정 노드 이름을 전달해야 합니다. 프로필을 생성한 후 사용자 지정 역할 세션 이름을 수락하도록 프로필을 업데이트할 수 있습니다.

AWS IAM Roles Anywhere 프로필의 [durationSeconds](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/authentication-create-session#credentials-object) 필드를 통해 AWS IAM Roles Anywhere로 자격 증명 유효 기간을 구성할 수 있습니다. 기본 지속 시간은 1시간이고 최대 12시간입니다. 하이브리드 노드 IAM 역할의 `MaxSessionDuration` 설정은 AWS IAM Roles Anywhere 프로필의 `durationSeconds` 설정보다 커야 합니다. `MaxSessionDuration`에 대한 자세한 내용은 [UpdateRole API documentation](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_UpdateRole.html)를 참조하세요.

인증 기관(CA)에서 생성하는 시스템별 인증서와 키는 각 하이브리드 노드의 `/etc/iam/pki` 디렉터리에 배치하고 인증서는 `server.pem`, 키는 `server.key`의 파일 이름으로 저장해야 합니다.

## 하이브리드 노드 IAM 역할 생성
<a name="hybrid-nodes-create-role"></a>

이 섹션의 단계를 실행하려면 AWS 콘솔 또는 AWS CLI를 사용하는 IAM 보안 주체에 다음 권한이 있어야 합니다.
+  `iam:CreatePolicy` 
+  `iam:CreateRole` 
+  `iam:AttachRolePolicy` 
+ AWS IAM Roles Anywhere를 사용하는 경우
  +  `rolesanywhere:CreateTrustAnchor` 
  +  `rolesanywhere:CreateProfile` 
  +  `iam:PassRole` 

### AWS CloudFormation
<a name="hybrid-nodes-creds-cloudformation"></a>

아직 하지 않은 경우 AWS CLI를 설치하고 구성합니다. [최신 버전의 AWS CLI 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.

 **AWS SSM 하이브리드 활성화 단계** 

CloudFormation 스택은 위에 설명된 권한을 사용하여 하이브리드 노드 IAM 역할을 생성합니다. CloudFormation 템플릿은 AWS SSM 하이브리드 활성화를 생성하지 않습니다.

1. 하이브리드 노드용 AWS SSM CloudFormation 템플릿을 다운로드합니다.

   ```
   curl -OL 'https://raw.githubusercontent.com/aws/eks-hybrid/refs/heads/main/example/hybrid-ssm-cfn.yaml'
   ```

1. 다음과 같은 옵션으로 `cfn-ssm-parameters.json`을 생성합니다.

   1. `ROLE_NAME`을 하이브리드 노드 IAM 역할의 이름으로 바꿉니다. 기본적으로 이름을 지정하지 않으면 CloudFormation 템플릿은 `AmazonEKSHybridNodesRole`을 생성하는 역할의 이름으로 사용합니다.

   1. `TAG_KEY`을 AWSSSM 하이브리드 활성화를 생성할 때 사용한 AWS SSM 리소스 태그 키로 바꿉니다. 태그 키와 태그 값의 조합은 하이브리드 노드 IAM 역할이 AWS SSM 하이브리드 활성화와 연결된 AWS SSM 관리형 인스턴스의 등록을 취소할 수 있도록 허용하는 `ssm:DeregisterManagedInstance`의 조건에서 사용됩니다. CloudFormation 템플릿에서 `TAG_KEY`의 기본값은 `EKSClusterARN`입니다.

   1. `TAG_VALUE`를 AWS SSM 하이브리드 활성화를 생성할 때 사용한 AWS SSM 리소스 태그 값으로 바꿉니다. 태그 키와 태그 값의 조합은 하이브리드 노드 IAM 역할이 AWS SSM 하이브리드 활성화와 연결된 AWS SSM 관리형 인스턴스의 등록을 취소할 수 있도록 허용하는 `ssm:DeregisterManagedInstance`의 조건에서 사용됩니다. `TAG_KEY`의 기본값인 `EKSClusterARN`을 사용하는 경우 EKS 클러스터 ARN을 `TAG_VALUE`로 전달합니다. EKS 클러스터 ARN의 형식은 ` arn:aws:eks:AWS_REGION:AWS_ACCOUNT_ID:cluster/CLUSTER_NAME`입니다.

      ```
      {
        "Parameters": {
          "RoleName": "ROLE_NAME",
          "SSMDeregisterConditionTagKey": "TAG_KEY",
          "SSMDeregisterConditionTagValue": "TAG_VALUE"
        }
      }
      ```

1. CloudFormation 스택 배포 `STACK_NAME`을 CloudFormation 스택의 이름으로 바꿉니다.

   ```
   aws cloudformation deploy \
       --stack-name STACK_NAME \
       --template-file hybrid-ssm-cfn.yaml \
       --parameter-overrides file://cfn-ssm-parameters.json \
       --capabilities CAPABILITY_NAMED_IAM
   ```

 **AWS IAM Roles Anywhere의 단계** 

CloudFormation 스택은 사용자가 구성한 인증 기관(CA)을 사용하여 AWS IAM Roles Anywhere 트러스트 앵커를 생성하고, AWS IAM Roles Anywhere 프로필을 생성하고, 앞서 설명한 권한을 사용하여 하이브리드 노드 IAM 역할을 생성합니다.

1. 인증 기관(CA)을 설정하려면

   1. AWS 프라이빗 CA 리소스를 사용하려면 [AWS 프라이빗 인증 기관 콘솔](https://console.aws.amazon.com/acm-pca/home)을 엽니다. [AWS 프라이빗 CA 사용 설명서](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)의 지침을 따릅니다.

   1. 외부 CA를 사용하려면 CA에서 제공하는 지침을 따릅니다. 이후 단계에서 인증서 본문을 제공합니다.

   1. 퍼블릭 CA에서 발급된 인증서는 트러스트 앵커로 사용할 수 없습니다.

1. 하이브리드 노드용 AWS IAM Roles Anywhere CloudFormation 템플릿을 다운로드합니다.

   ```
   curl -OL 'https://raw.githubusercontent.com/aws/eks-hybrid/refs/heads/main/example/hybrid-ira-cfn.yaml'
   ```

1. 다음과 같은 옵션으로 `cfn-iamra-parameters.json`을 생성합니다.

   1. `ROLE_NAME`을 하이브리드 노드 IAM 역할의 이름으로 바꿉니다. 기본적으로 이름을 지정하지 않으면 CloudFormation 템플릿은 `AmazonEKSHybridNodesRole`을 생성하는 역할의 이름으로 사용합니다.

   1. `CERT_ATTRIBUTE`를 호스트를 고유하게 식별하는 시스템당 인증서 속성으로 바꿉니다. 사용하는 인증서 속성은 클러스터에 하이브리드 노드를 연결할 때 `nodeadm` 구성에 사용하는 nodeName과 일치해야 합니다. 자세한 내용은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md)을 참조하세요. 기본적으로 CloudFormation 템플릿은 `${aws:PrincipalTag/x509Subject/CN}`을 `CERT_ATTRIBUTE`로 사용하며, 이는 시스템별 인증서의 CN 필드에 해당합니다. 또는 `$(aws:PrincipalTag/x509SAN/Name/CN}`을 `CERT_ATTRIBUTE`로 전달할 수 있습니다.

   1. `CA_CERT_BODY`를 줄 바꿈 없이 CA의 인증서 본문으로 바꿉니다. `CA_CERT_BODY`는 PEM(Privacy Enhanced Mail) 형식이어야 합니다. PEM 형식의 CA 인증서가 있는 경우 CA 인증서 본문을 `cfn-iamra-parameters.json` 파일에 배치하기 전에 줄 바꿈과 BEGIN CERTIFICATE 및 END CERTIFICATE 줄을 제거합니다.

      ```
      {
        "Parameters": {
          "RoleName": "ROLE_NAME",
          "CertAttributeTrustPolicy": "CERT_ATTRIBUTE",
          "CABundleCert": "CA_CERT_BODY"
        }
      }
      ```

1. CloudFormation 템플릿을 배포합니다. `STACK_NAME`을 CloudFormation 스택의 이름으로 바꿉니다.

   ```
   aws cloudformation deploy \
       --stack-name STACK_NAME \
       --template-file hybrid-ira-cfn.yaml \
       --parameter-overrides file://cfn-iamra-parameters.json
       --capabilities CAPABILITY_NAMED_IAM
   ```

### AWS CLI
<a name="hybrid-nodes-creds-awscli"></a>

아직 하지 않은 경우 AWS CLI를 설치하고 구성합니다. [최신 버전의 AWS CLI 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.

 **EKS 설명 클러스터 정책 생성** 

1. 다음 콘텐츠를 가진 `eks-describe-cluster-policy.json`이라는 파일을 생성합니다:

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "eks:DescribeCluster"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

1. 다음 명령을 사용하여 정책을 생성합니다.

   ```
   aws iam create-policy \
       --policy-name EKSDescribeClusterPolicy \
       --policy-document file://eks-describe-cluster-policy.json
   ```

 **AWS SSM 하이브리드 활성화 단계** 

1. 다음 콘텐츠를 가진 `eks-hybrid-ssm-policy.json`이라는 파일을 생성합니다: 이 정책은 `ssm:DescribeInstanceInformation` 및 `ssm:DeregisterManagedInstance` 두 작업에 대한 권한을 부여합니다. 이 정책은 신뢰 정책에 지정한 리소스 태그를 기반으로 AWS SSM 하이브리드 활성화와 연결된 AWS SSM 관리형 인스턴스에 대한 `ssm:DeregisterManagedInstance` 권한을 제한합니다.

   1. `AWS_REGION`을 AWS SSM 하이브리드 활성화를 위한 AWS 리전으로 바꿉니다.

   1. `AWS_ACCOUNT_ID`를 AWS 계정 ID로 바꿉니다.

   1. `TAG_KEY`을 AWSSSM 하이브리드 활성화를 생성할 때 사용한 AWS SSM 리소스 태그 키로 바꿉니다. 태그 키와 태그 값의 조합은 하이브리드 노드 IAM 역할이 AWS SSM 하이브리드 활성화와 연결된 AWS SSM 관리형 인스턴스의 등록을 취소할 수 있도록 허용하는 `ssm:DeregisterManagedInstance`의 조건에서 사용됩니다. CloudFormation 템플릿에서 `TAG_KEY`의 기본값은 `EKSClusterARN`입니다.

   1. `TAG_VALUE`를 AWS SSM 하이브리드 활성화를 생성할 때 사용한 AWS SSM 리소스 태그 값으로 바꿉니다. 태그 키와 태그 값의 조합은 하이브리드 노드 IAM 역할이 AWS SSM 하이브리드 활성화와 연결된 AWS SSM 관리형 인스턴스의 등록을 취소할 수 있도록 허용하는 `ssm:DeregisterManagedInstance`의 조건에서 사용됩니다. `TAG_KEY`의 기본값인 `EKSClusterARN`을 사용하는 경우 EKS 클러스터 ARN을 `TAG_VALUE`로 전달합니다. EKS 클러스터 ARN의 형식은 ` arn:aws:eks:AWS_REGION:AWS_ACCOUNT_ID:cluster/CLUSTER_NAME`입니다.

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "ssm:DescribeInstanceInformation",
                  "Resource": "*"
              },
              {
                  "Effect": "Allow",
                  "Action": "ssm:DeregisterManagedInstance",
                  "Resource": "arn:aws:ssm:us-east-1:123456789012:managed-instance/*",
                  "Condition": {
                      "StringEquals": {
                          "ssm:resourceTag/TAG_KEY": "TAG_VALUE"
                      }
                  }
              }
          ]
      }
      ```

1. 다음 명령을 사용하여 정책을 생성합니다.

   ```
   aws iam create-policy \
       --policy-name EKSHybridSSMPolicy \
       --policy-document file://eks-hybrid-ssm-policy.json
   ```

1. `eks-hybrid-ssm-trust.json`이라는 이름의 파일을 만듭니다. `AWS_REGION`을 AWS SSM 하이브리드 활성화의 AWS 리전으로 바꾸고 `AWS_ACCOUNT_ID`를 AWS 계정 ID로 바꿉니다.

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement":[
         {
            "Sid":"",
            "Effect":"Allow",
            "Principal":{
               "Service":"ssm.amazonaws.com"
            },
            "Action":"sts:AssumeRole",
            "Condition":{
               "StringEquals":{
                  "aws:SourceAccount":"123456789012"
               },
               "ArnEquals":{
                  "aws:SourceArn":"arn:aws:ssm:us-east-1:123456789012:*"
               }
            }
         }
      ]
   }
   ```

1. 다음 명령을 사용하여 역할을 생성합니다.

   ```
   aws iam create-role \
       --role-name AmazonEKSHybridNodesRole \
       --assume-role-policy-document file://eks-hybrid-ssm-trust.json
   ```

1. 이전 단계에서 생성한 `EKSDescribeClusterPolicy`와 `EKSHybridSSMPolicy`를 연결합니다. `AWS_ACCOUNT_ID`를 AWS 계정 ID로 바꿉니다.

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/EKSDescribeClusterPolicy
   ```

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/EKSHybridSSMPolicy
   ```

1. `AmazonEC2ContainerRegistryPullOnly` 및 `AmazonSSMManagedInstanceCore` AWS 관리형 정책을 연결합니다.

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly
   ```

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
   ```

 **AWS IAM Roles Anywhere의 단계** 

AWS IAM Roles Anywhere를 사용하려면 하이브리드 노드 IAM 역할을 생성하기 전에 AWS IAM Roles Anywhere 트러스트 앵커를 설정해야 합니다. 자세한 내용은 [AWS IAM Roles Anywhere 설정](#hybrid-nodes-iam-roles-anywhere) 섹션을 참조하세요.

1. `eks-hybrid-iamra-trust.json`이라는 이름의 파일을 만듭니다. `TRUST_ANCHOR ARN`을 [AWS IAM Roles Anywhere 설정](#hybrid-nodes-iam-roles-anywhere) 단계에서 생성한 트러스트 앵커의 ARN으로 바꿉니다. 이 신뢰 정책의 조건은 역할 세션 이름이 하이브리드 노드에 설치된 x509 인증서의 CN과 일치하는 경우에만 AWS IAM Roles Anywhere가 하이브리드 노드 IAM 역할을 수임하여 임시 IAM 자격 증명을 교환하는 기능을 제한합니다. 또는 다른 인증서 속성을 사용하여 노드를 고유하게 식별할 수 있습니다. 신뢰 정책에서 사용하는 인증서 속성은 `nodeadm` 구성에서 설정한 `nodeName`과 일치해야 합니다. 자세한 내용은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md)을 참조하세요.

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "rolesanywhere.amazonaws.com"
               },
               "Action": [
                   "sts:TagSession",
                   "sts:SetSourceIdentity"
               ],
               "Condition": {
                   "StringEquals": {
                       "aws:PrincipalTag/x509Subject/CN": "${aws:PrincipalTag/x509Subject/CN}"
                   },
                   "ArnEquals": {
                       "aws:SourceArn": "arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TA_ID"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "rolesanywhere.amazonaws.com"
               },
               "Action": "sts:AssumeRole",
               "Condition": {
                   "StringEquals": {
                       "sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}",
                       "aws:PrincipalTag/x509Subject/CN": "${aws:PrincipalTag/x509Subject/CN}"
                   },
                   "ArnEquals": {
                       "aws:SourceArn": "arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TA_ID"
                   }
               }
           }
       ]
   }
   ```

1. 다음 명령을 사용하여 역할을 생성합니다.

   ```
   aws iam create-role \
       --role-name AmazonEKSHybridNodesRole \
       --assume-role-policy-document file://eks-hybrid-iamra-trust.json
   ```

1. 이전 단계에서 생성한 `EKSDescribeClusterPolicy`를 연결합니다. `AWS_ACCOUNT_ID`를 AWS 계정 ID로 바꿉니다.

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/EKSDescribeClusterPolicy
   ```

1. `AmazonEC2ContainerRegistryPullOnly` AWS 관리형 정책을 연결합니다.

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly
   ```

### AWS Management Console
<a name="hybrid-nodes-creds-console"></a>

 **EKS 설명 클러스터 정책 생성** 

1. [Amazon IAM 콘솔](https://console.aws.amazon.com/iam/home)을 엽니다.

1. 왼쪽 탐색 창에서 **정책**을 선택합니다.

1. **정책** 페이지에서 **정책 생성**을 선택합니다.

1. 권한 지정 페이지의 서비스 선택 패널에서 EKS를 선택합니다.

   1. **DescribeCluster**에 대한 작업을 필터링하고 **DescribeCluster** 읽기 작업을 선택합니다.

   1. **다음**을 선택합니다.

1. **검토 및 생성** 페이지에서

   1. 정책에 **정책 이름**(예: `EKSDescribeClusterPolicy`)을 입력합니다.

   1. **정책 생성**을 선택합니다.

 **AWS SSM 하이브리드 활성화 단계** 

1. [Amazon IAM 콘솔](https://console.aws.amazon.com/iam/home)을 엽니다.

1. 왼쪽 탐색 창에서 **정책**을 선택합니다.

1. **정책** 페이지에서 **정책 생성**을 선택합니다.

1. **권한 지정** 페이지의 **정책 편집기** 오른쪽 상단에서 **JSON**을 선택합니다. 다음 조각을 붙여 넣습니다. `AWS_REGION`을 AWS SSM 하이브리드 활성화의 AWS 리전으로 바꾸고 `AWS_ACCOUNT_ID`를 AWS 계정 ID로 바꿉니다. `TAG_KEY` 및 `TAG_VALUE`를 AWS SSM 하이브리드 활성화를 생성할 때 사용한 AWS SSM 리소스 태그 키로 바꿉니다.

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "ssm:DescribeInstanceInformation",
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": "ssm:DeregisterManagedInstance",
               "Resource": "arn:aws:ssm:us-east-1:123456789012:managed-instance/*",
               "Condition": {
                   "StringEquals": {
                       "ssm:resourceTag/TAG_KEY": "TAG_VALUE"
                   }
               }
           }
       ]
   }
   ```

   1. **다음**을 선택합니다.

1. **검토 및 생성** 페이지에서

   1. 정책에 **정책** 이름(예: `EKSHybridSSMPolicy`)을 입력합니다.

   1. **정책 생성**을 선택하세요.

1. 왼쪽 탐색 창에서 **역할**을 선택합니다.

1. **역할** 페이지에서 **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 엔터티 선택** 페이지에서 다음을 수행합니다.

   1. **신뢰할 수 있는 엔터티 유형 섹션**에서 **사용자 지정 신뢰 정책**을 선택합니다. 사용자 지정 신뢰 정책 편집기에 다음을 붙여 넣습니다. `AWS_REGION`을 AWS SSM 하이브리드 활성화의 AWS 리전으로 바꾸고 `AWS_ACCOUNT_ID`를 AWS 계정 ID로 바꿉니다.

      ```
      {
         "Version":"2012-10-17",		 	 	 
         "Statement":[
            {
               "Sid":"",
               "Effect":"Allow",
               "Principal":{
                  "Service":"ssm.amazonaws.com"
               },
               "Action":"sts:AssumeRole",
               "Condition":{
                  "StringEquals":{
                     "aws:SourceAccount":"123456789012"
                  },
                  "ArnEquals":{
                     "aws:SourceArn":"arn:aws:ssm:us-east-1:123456789012:*"
                  }
               }
            }
         ]
      }
      ```

   1. [Next]를 선택합니다.

1. **권한 추가** 페이지에서 사용자 지정 정책을 연결하거나 다음과 같이 합니다.

   1. **정책 필터링** 상자에 `EKSDescribeClusterPolicy` 또는 위에서 생성한 정책의 이름을 입력합니다. 검색 결과의 정책 이름 왼쪽에 있는 확인란을 선택합니다.

   1. **정책 필터링** 상자에 `EKSHybridSSMPolicy` 또는 위에서 생성한 정책의 이름을 입력합니다. 검색 결과의 정책 이름 왼쪽에 있는 확인란을 선택합니다.

   1. **필터 정책** 상자에 `AmazonEC2ContainerRegistryPullOnly`를 입력합니다. 검색 결과의 `AmazonEC2ContainerRegistryPullOnly` 왼쪽에 있는 확인란을 선택합니다.

   1. **필터 정책** 상자에 `AmazonSSMManagedInstanceCore`를 입력합니다. 검색 결과의 `AmazonSSMManagedInstanceCore` 왼쪽에 있는 확인란을 선택합니다.

   1. **다음**을 선택합니다.

1. **이름, 검토 및 생성** 페이지에서 다음을 수행합니다.

   1. **역할 이름**에 역할의 고유한 이름(예: `AmazonEKSHybridNodesRole`)을 입력합니다.

   1. **설명(Description)**에서 현재 텍스트를 설명이 포함된 텍스트(예: `Amazon EKS - Hybrid Nodes role`)로 바꿉니다.

   1. **역할 생성**을 선택합니다.

 **AWS IAM Roles Anywhere의 단계** 

AWS IAM Roles Anywhere를 사용하려면 하이브리드 노드 IAM 역할을 생성하기 전에 AWS IAM Roles Anywhere 트러스트 앵커를 설정해야 합니다. 자세한 내용은 [AWS IAM Roles Anywhere 설정](#hybrid-nodes-iam-roles-anywhere) 섹션을 참조하세요.

1. [Amazon IAM 콘솔](https://console.aws.amazon.com/iam/home)을 엽니다.

1. 왼쪽 탐색 창에서 **역할**을 선택합니다.

1. **역할** 페이지에서 **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 엔터티 선택** 페이지에서 다음을 수행합니다.

   1. **신뢰할 수 있는 엔터티 유형 섹션**에서 **사용자 지정 신뢰 정책**을 선택합니다. 사용자 지정 신뢰 정책 편집기에 다음을 붙여 넣습니다. `TRUST_ANCHOR ARN`을 [AWS IAM Roles Anywhere 설정](#hybrid-nodes-iam-roles-anywhere) 단계에서 생성한 트러스트 앵커의 ARN으로 바꿉니다. 이 신뢰 정책의 조건은 역할 세션 이름이 하이브리드 노드에 설치된 x509 인증서의 CN과 일치하는 경우에만 AWS IAM Roles Anywhere가 하이브리드 노드 IAM 역할을 수임하여 임시 IAM 자격 증명을 교환하는 기능을 제한합니다. 또는 다른 인증서 속성을 사용하여 노드를 고유하게 식별할 수 있습니다. 신뢰 정책에서 사용하는 인증서 속성은 nodeadm 구성에서 설정한 nodeName과 일치해야 합니다. 자세한 내용은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md)을 참조하세요.

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "rolesanywhere.amazonaws.com"
                  },
                  "Action": [
                      "sts:TagSession",
                      "sts:SetSourceIdentity"
                  ],
                  "Condition": {
                      "StringEquals": {
                          "aws:PrincipalTag/x509Subject/CN": "${aws:PrincipalTag/x509Subject/CN}"
                      },
                      "ArnEquals": {
                          "aws:SourceArn": "arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TA_ID"
                      }
                  }
              },
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "rolesanywhere.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole",
                  "Condition": {
                      "StringEquals": {
                          "sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}",
                          "aws:PrincipalTag/x509Subject/CN": "${aws:PrincipalTag/x509Subject/CN}"
                      },
                      "ArnEquals": {
                          "aws:SourceArn": "arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TA_ID"
                      }
                  }
              }
          ]
      }
      ```

   1. [Next]를 선택합니다.

1. **권한 추가** 페이지에서 사용자 지정 정책을 연결하거나 다음과 같이 합니다.

   1. **정책 필터링** 상자에 `EKSDescribeClusterPolicy` 또는 위에서 생성한 정책의 이름을 입력합니다. 검색 결과의 정책 이름 왼쪽에 있는 확인란을 선택합니다.

   1. **필터 정책** 상자에 `AmazonEC2ContainerRegistryPullOnly`를 입력합니다. 검색 결과의 `AmazonEC2ContainerRegistryPullOnly` 왼쪽에 있는 확인란을 선택합니다.

   1. **다음**을 선택합니다.

1. **이름, 검토 및 생성** 페이지에서 다음을 수행합니다.

   1. **역할 이름**에 역할의 고유한 이름(예: `AmazonEKSHybridNodesRole`)을 입력합니다.

   1. **설명(Description)**에서 현재 텍스트를 설명이 포함된 텍스트(예: `Amazon EKS - Hybrid Nodes role`)로 바꿉니다.

   1. **역할 생성**을 선택합니다.

# 하이브리드 노드를 사용하여 Amazon EKS 클러스터 생성
<a name="hybrid-nodes-cluster-create"></a>

이 주제에서는 사용 가능한 옵션에 대한 개요와 하이브리드 노드 지원 Amazon EKS 클러스터를 생성할 때 고려해야 할 사항을 설명합니다. EKS Hybrid Nodes는 표준 및 확장 지원을 포함하여 클라우드 노드가 있는 Amazon EKS 클러스터와 동일한 [Kubernetes 버전 지원](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)을 제공합니다.

EKS Hybrid Nodes를 사용할 계획이 없는 경우 [Amazon EKS 클러스터 생성](create-cluster.md)의 기본 Amazon EKS 클러스터 생성 설명서를 참조하세요.

## 사전 조건
<a name="hybrid-nodes-cluster-create-prep"></a>
+ [하이브리드 노드에 대한 사전 조건 설정](hybrid-nodes-prereqs.md)가 완료되었습니다. 하이브리드 노드 지원 클러스터를 생성하기 전에 온프레미스 노드와 선택적으로 포드 CIDR을 식별하고, EKS 요구 사항 및 하이브리드 노드 요구 사항에 따라 VPC 및 서브넷을 생성하고, 온프레미스와 선택적으로 포드 CIDR에 대한 인바운드 규칙이 있는 보안 그룹을 지정해야 합니다. 이러한 사전 조건에 대한 자세한 내용은 [하이브리드 노드용 네트워킹 준비](hybrid-nodes-networking.md) 섹션을 참조하세요.
+ 장치에 최신 버전의 AWS Command Line Interface(AWS CLI)가 설치 및 구성되어 있습니다. 현재 버전을 확인하려면 `aws --version`을 사용합니다. yum, apt-get 또는 macOS용 Homebrew와 같은 패키지 관리자는 최신 버전 AWS CLI 이전에 나온 버전이 몇 가지 있을 때도 있습니다. 최신 버전을 설치하려면 AWS Command Line Interface 사용 설명서의 [최신 버전의 AWS CLI 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 및 [AWS CLI 설정 구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)을 참조하세요.
+ IAM 역할을 생성하고 정책을 연결하며 EKS 클러스터를 생성하고 설명할 권한이 있는 [IAM 보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles#iam-term-principal)

## 고려 사항
<a name="hybrid-nodes-cluster-create-consider"></a>
+ 클러스터는 클러스터 인증 모드에 `API` 또는 `API_AND_CONFIG_MAP`을 사용해야 합니다.
+ 클러스터는 IPv4 주소 패밀리를 사용해야 합니다.
+ 클러스터는 퍼블릭 또는 프라이빗 클러스터 엔드포인트 연결을 사용해야 합니다. Amazon EKS Kubernetes API 서버 엔드포인트는 VPC 외부에서 실행되는 하이브리드 노드의 퍼블릭 IP로 확인되므로 클러스터는 '퍼블릭 및 프라이빗' 클러스터 엔드포인트 연결을 사용할 수 없습니다.
+ OIDC 인증은 하이브리드 노드가 있는 EKS 클러스터에서 지원됩니다.
+ 기존 클러스터의 하이브리드 노드 구성을 추가, 변경 또는 제거할 수 있습니다. 자세한 내용은 [기존 Amazon EKS 클러스터에서 하이브리드 노드 활성화 또는 구성 수정](hybrid-nodes-cluster-update.md) 섹션을 참조하세요.

## 1단계: 클러스터 IAM 역할 만들기
<a name="hybrid-nodes-cluster-create-iam"></a>

이미 클러스터 IAM 역할이 있거나 `eksctl` 또는 AWS CloudFormation을 사용하여 클러스터를 생성하려는 경우 이 단계를 건너뛸 수 있습니다. 기본적으로 `eksctl` 및 AWS CloudFormation 템플릿은 클러스터 IAM 역할을 생성합니다.

1. 다음 명령을 실행하여 IAM 신뢰 정책 JSON 파일을 생성합니다.

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "eks.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

1. Amazon EKS 클러스터 IAM 역할을 생성합니다. 필요한 경우 eks-cluster-role-trust-policy.json 앞에 이전 단계에서 파일을 작성한 컴퓨터의 경로를 붙입니다. 명령은 사용자가 이전 단계에서 생성한 신뢰 정책을 역할에 연결합니다. [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles#iam-term-principal)을 생성하려면 역할을 생성하는 IAM 보안 주체에 `iam:CreateRole` 작업(권한)을 할당해야 합니다.

   ```
   aws iam create-role \
       --role-name myAmazonEKSClusterRole \
       --assume-role-policy-document file://"eks-cluster-role-trust-policy.json"
   ```

1. Amazon EKS 관리형 정책을 할당하거나 사용자 지정 정책을 생성할 수 있습니다. 사용자 지정 정책에서 사용해야 하는 최소 권한은 [Amazon EKS 노드 IAM 역할](create-node-role.md)을(를) 참조하십시오. Amazon EKS 관리형 `AmazonEKSClusterPolicy`를 역할에 연결합니다. IAM 정책을 [IAM 보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles#iam-term-principal)에 연결하려면 정책을 연결하는 보안 주체에 `iam:AttachUserPolicy` 또는 `iam:AttachRolePolicy`의 IAM 작업(권한) 중 하나를 할당해야 합니다.

   ```
   aws iam attach-role-policy \
       --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy \
       --role-name myAmazonEKSClusterRole
   ```

## 2단계: 하이브리드 노드 지원 클러스터 생성
<a name="hybrid-nodes-cluster-create-cluster"></a>

다음을 사용하여 클러스터를 만들 수 있습니다.
+  [eksctl](#hybrid-nodes-cluster-create-eksctl) 
+  [AWS CloudFormation](#hybrid-nodes-cluster-create-cfn) 
+  [AWS CLI](#hybrid-nodes-cluster-create-cli) 
+  [AWS Management Console](#hybrid-nodes-cluster-create-console) 

### 하이브리드 노드 지원 클러스터 생성- eksctl
<a name="hybrid-nodes-cluster-create-eksctl"></a>

`eksctl` 명령줄 도구의 최신 버전을 설치해야 합니다. `eksctl`을 설치 또는 업그레이드하려면 `eksctl` 설명서에서 [설치](https://eksctl.io/installation)를 참조하세요.

1. `cluster-config.yaml`을 생성하여 하이브리드 노드 지원 Amazon EKS IPv4 클러스터를 정의합니다. `cluster-config.yaml`에서 다음과 같은 교체를 수행합니다. 전체 설정 목록은 [eksctl 설명서](https://eksctl.io/getting-started/)를 참조하세요.

   1. `CLUSTER_NAME`를 클러스터 이름으로 바꿉니다. 이름에는 영숫자(대소문자 구분)와 하이픈만 사용할 수 있습니다. 영숫자로 시작해야 하며 100자 이하여야 합니다. 이름은 클러스터를 생성하는 AWS 리전과 AWS 계정 내에서 고유해야 합니다.

   1. `AWS_REGION`을 클러스터를 생성할 AWS 리전으로 바꿉니다.

   1. `K8S_VERSION`를 모든 [Amazon EKS 지원 버전](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)으로 변경합니다.

   1. [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md)의 단계에서 구성한 자격 증명 공급자를 기반으로 `CREDS_PROVIDER`를 `ssm` 또는 `ira`로 바꿉니다.

   1. AWS IAM Roles Anywhere를 자격 증명 공급자로 사용하는 `ira`로 자격 증명 공급자가 설정된 경우 `CA_BUNDLE_CERT`를 바꿉니다. CA\$1BUNDLE\$1CERT는 CA(인증 기관) 인증서 본문이며 CA 선택에 따라 달라집니다. 인증서는 PEM(Privacy Enhanced Mail) 형식이어야 합니다.

   1. `GATEWAY_ID`를 VPC에 연결할 가상 프라이빗 게이트웨이 또는 전송 게이트웨이의 ID로 바꿉니다.

   1. `REMOTE_NODE_CIDRS`를 하이브리드 노드의 온프레미스 노드 CIDR로 바꿉니다.

   1. `REMOTE_POD_CIDRS`를 하이브리드 노드에서 실행되는 워크로드의 온프레미스 포드 CIDR로 바꾸거나 하이브리드 노드에서 웹후크를 실행하지 않는 경우 구성에서 라인을 제거합니다. 포드 트래픽이 온프레미스 호스트에서 나갈 때 CNI가 포드 IP 주소에 네트워크 주소 변환(NAT) 또는 매스커레이딩을 사용하지 않는 경우 `REMOTE_POD_CIDRS`를 구성해야 합니다. 하이브리드 노드에서 웹후크를 실행하는 경우 `REMOTE_POD_CIDRS`를 구성해야 합니다. [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md)에서 자세한 내용을 참조하세요.

   1. 온프레미스 노드 및 포드 CIDR 블록은 다음 요구 사항을 충족해야 합니다.

      1. IPv4 RFC-1918 범위 중 하나(`10.0.0.0/8`, `172.16.0.0/12` 또는 `192.168.0.0/16`) 또는 RFC 6598에 의해 정의된 CGNAT 범위 내(`100.64.0.0/10`)에 있어야 합니다.

      1. 서로, 클러스터의 `VPC CIDR` 또는 Kubernetes 서비스 IPv4 CIDR과 중첩되지 않습니다.

         ```
         apiVersion: eksctl.io/v1alpha5
         kind: ClusterConfig
         
         metadata:
           name: CLUSTER_NAME
           region: AWS_REGION
           version: "K8S_VERSION"
         
         remoteNetworkConfig:
           iam:
             provider: CREDS_PROVIDER # default SSM, can also be set to IRA
             # caBundleCert: CA_BUNDLE_CERT
           vpcGatewayID: GATEWAY_ID
           remoteNodeNetworks:
           - cidrs: ["REMOTE_NODE_CIDRS"]
           remotePodNetworks:
           - cidrs: ["REMOTE_POD_CIDRS"]
         ```

1. 다음 명령을 실행합니다.

   ```
   eksctl create cluster -f cluster-config.yaml
   ```

   클러스터 프로비저닝에는 몇 분 정도 걸립니다. 클러스터가 생성되는 동안 여러 줄의 출력이 나타납니다. 출력의 마지막 줄은 다음 예제와 유사합니다.

   ```
   [✓]  EKS cluster "CLUSTER_NAME" in "REGION" region is ready
   ```

1. [3단계: kubeconfig 업데이트](#hybrid-nodes-cluster-create-kubeconfig) 항목을 계속 진행합니다.

### 하이브리드 노드 지원 클러스터 생성-AWS CloudFormation
<a name="hybrid-nodes-cluster-create-cfn"></a>

CloudFormation 스택은 사용자가 지정하는 `RemoteNodeNetwork` 및 `RemotePodNetwork`를 사용하여 EKS 클러스터 IAM 역할과 EKS 클러스터를 생성합니다. CloudFormation 템플릿에 노출되지 않은 EKS 클러스터의 설정을 사용자 지정해야 하는 경우 CloudFormation 템플릿을 수정합니다.

1. CloudFormation 템플릿을 다운로드하십시오.

   ```
   curl -OL 'https://raw.githubusercontent.com/aws/eks-hybrid/refs/heads/main/example/hybrid-eks-cfn.yaml'
   ```

1. `cfn-eks-parameters.json`을 생성하고 각 값에 대한 구성을 지정합니다.

   1.  `CLUSTER_NAME`: 생성할 EKS 클러스터의 이름입니다.

   1.  `CLUSTER_ROLE_NAME`: 생성할 EKS 클러스터 IAM 역할의 이름입니다. 템플릿의 기본값은 'EKSClusterRole'입니다.

   1.  `SUBNET1_ID`: 사전 조건 단계에서 생성한 첫 번째 서브넷의 ID입니다.

   1.  `SUBNET2_ID`: 사전 조건 단계에서 생성한 두 번째 서브넷의 ID입니다.

   1.  `SG_ID`: 이전 단계에서 만든 보안 그룹 ID입니다.

   1.  `REMOTE_NODE_CIDRS`: 하이브리드 노드에 대한 온프레미스 노드 CIDR입니다.

   1.  `REMOTE_POD_CIDRS`: 하이브리드 노드에서 실행되는 워크로드에 대한 온프레미스 포드 CIDR입니다. 포드 트래픽이 온프레미스 호스트에서 나갈 때 CNI가 포드 IP 주소에 네트워크 주소 변환(NAT) 또는 매스커레이딩을 사용하지 않는 경우 `REMOTE_POD_CIDRS`를 구성해야 합니다. 하이브리드 노드에서 웹후크를 실행하는 경우 `REMOTE_POD_CIDRS`를 구성해야 합니다. [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md)에서 자세한 내용을 참조하세요.

   1. 온프레미스 노드 및 포드 CIDR 블록은 다음 요구 사항을 충족해야 합니다.

      1. IPv4 RFC-1918 범위 중 하나(`10.0.0.0/8`, `172.16.0.0/12` 또는 `192.168.0.0/16`) 또는 RFC 6598에 의해 정의된 CGNAT 범위 내(`100.64.0.0/10`)에 있어야 합니다.

      1. 서로, 클러스터의 `VPC CIDR` 또는 Kubernetes 서비스 IPv4 CIDR과 중첩되지 않습니다.

   1.  `CLUSTER_AUTH`: 클러스터의 클러스터 인증 모드입니다. 유효 값은 `API` 및 `API_AND_CONFIG_MAP`입니다. 템플릿의 기본값은 `API_AND_CONFIG_MAP`입니다.

   1.  `CLUSTER_ENDPOINT`: 클러스터의 클러스터 엔드포인트 연결입니다. 유효한 값은 '퍼블릭' 또는 '프라이빗'입니다. 템플릿의 기본값은 프라이빗입니다. 즉, VPC 내에서만 Kubernetes API 엔드포인트에 연결할 수 있습니다.

   1.  `K8S_VERSION`: 클러스터에 사용할 Kubernetes 버전입니다. [Amazon EKS supported versions](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)을 참조하세요.

      ```
      {
        "Parameters": {
          "ClusterName": "CLUSTER_NAME",
          "ClusterRoleName": "CLUSTER_ROLE_NAME",
          "SubnetId1": "SUBNET1_ID",
          "SubnetId2": "SUBNET2_ID",
          "SecurityGroupId" "SG_ID",
          "RemoteNodeCIDR": "REMOTE_NODE_CIDRS",
          "RemotePodCIDR": "REMOTE_POD_CIDRS",
          "ClusterAuthMode": "CLUSTER_AUTH",
          "ClusterEndpointConnectivity": "CLUSTER_ENDPOINT",
          "K8sVersion": "K8S_VERSION"
        }
       }
      ```

1. CloudFormation 스택 배포 `STACK_NAME`을 CloudFormation 스택의 이름으로 바꾸고 `AWS_REGION`을 클러스터를 생성할 AWS 리전으로 바꿉니다.

   ```
   aws cloudformation deploy \
       --stack-name STACK_NAME \
       --region AWS_REGION \
       --template-file hybrid-eks-cfn.yaml \
       --parameter-overrides file://cfn-eks-parameters.json \
       --capabilities CAPABILITY_NAMED_IAM
   ```

   클러스터 프로비저닝에는 몇 분 정도 걸립니다. 다음 명령을 사용하여 스택의 상태를 확인할 수 있습니다. `STACK_NAME`을 CloudFormation 스택의 이름으로 바꾸고 `AWS_REGION`을 클러스터를 생성할 AWS 리전으로 바꿉니다.

   ```
   aws cloudformation describe-stacks \
       --stack-name STACK_NAME \
       --region AWS_REGION \
       --query 'Stacks[].StackStatus'
   ```

1. [3단계: kubeconfig 업데이트](#hybrid-nodes-cluster-create-kubeconfig) 항목을 계속 진행합니다.

### 하이브리드 노드 지원 클러스터 생성-AWS CLI
<a name="hybrid-nodes-cluster-create-cli"></a>

1. 다음 명령을 실행하여 하이브리드 노드 지원 EKS 클러스터를 생성합니다. 명령을 실행하기 전에 다음을 실제 설정으로 바꿉니다. 전체 설정 목록은 [Amazon EKS 클러스터 생성](create-cluster.md) 설명서를 참조하세요.

   1.  `CLUSTER_NAME`: 생성할 EKS 클러스터의 이름입니다.

   1.  `AWS_REGION`: 클러스터가 생성될 AWS 리전입니다.

   1.  `K8S_VERSION`: 클러스터에 사용할 Kubernetes 버전입니다. 지원되는 Amazon EKS 버전을 참조하세요.

   1.  `ROLE_ARN`: 클러스터에 대해 구성한 Amazon EKS 클러스터 역할입니다. 자세한 내용은 Amazon EKS 클러스터 IAM 역할을 참조하세요.

   1.  `SUBNET1_ID`: 사전 조건 단계에서 생성한 첫 번째 서브넷의 ID입니다.

   1.  `SUBNET2_ID`: 사전 조건 단계에서 생성한 두 번째 서브넷의 ID입니다.

   1.  `SG_ID`: 이전 단계에서 만든 보안 그룹 ID입니다.

   1. 클러스터 액세스 인증 모드에서 `API` 및 `API_AND_CONFIG_MAP`을 사용할 수 있습니다. 아래 명령에서 클러스터 액세스 인증 모드는 `API_AND_CONFIG_MAP`으로 설정됩니다.

   1. `endpointPublicAccess` 및 `endpointPrivateAccess` 파라미터를 사용하여 클러스터의 Kubernetes API 서버 엔드포인트에 대한 퍼블릭 및 프라이빗 액세스를 활성화하거나 비활성화할 수 있습니다. 아래 명령에서 `endpointPublicAccess`는 false로 설정되고 `endpointPrivateAccess`는 true로 설정됩니다.

   1.  `REMOTE_NODE_CIDRS`: 하이브리드 노드에 대한 온프레미스 노드 CIDR입니다.

   1.  `REMOTE_POD_CIDRS` (선택 사항): 하이브리드 노드에서 실행되는 워크로드에 대한 온프레미스 포드 CIDR입니다.

   1. 온프레미스 노드 및 포드 CIDR 블록은 다음 요구 사항을 충족해야 합니다.

      1. IPv4 RFC-1918 범위 중 하나(`10.0.0.0/8`, `172.16.0.0/12` 또는 `192.168.0.0/16`) 또는 RFC 6598에 의해 정의된 CGNAT 범위 내(`100.64.0.0/10`)에 있어야 합니다.

      1. 서로, Amazon EKS 클러스터의 `VPC CIDR` 또는 Kubernetes 서비스 IPv4 CIDR과 중첩되지 않습니다.

         ```
         aws eks create-cluster \
             --name CLUSTER_NAME \
             --region AWS_REGION \
             --kubernetes-version K8S_VERSION \
             --role-arn ROLE_ARN \
             --resources-vpc-config subnetIds=SUBNET1_ID,SUBNET2_ID,securityGroupIds=SG_ID,endpointPrivateAccess=true,endpointPublicAccess=false \
             --access-config authenticationMode=API_AND_CONFIG_MAP \
             --remote-network-config '{"remoteNodeNetworks":[{"cidrs":["REMOTE_NODE_CIDRS"]}],"remotePodNetworks":[{"cidrs":["REMOTE_POD_CIDRS"]}]}'
         ```

1. 클러스터를 프로비저닝하는 데 몇 분 정도 걸립니다. 다음 명령을 사용하여 클러스터의 상태를 쿼리할 수 있습니다. `CLUSTER_NAME`을 생성 중인 클러스터의 이름으로 바꾸고 `AWS_REGION`을 클러스터가 생성 중인 AWS 리전으로 바꿉니다. 반환되는 출력이 `ACTIVE`가 되면 다음 단계로 진행하세요.

   ```
   aws eks describe-cluster \
       --name CLUSTER_NAME \
       --region AWS_REGION \
       --query "cluster.status"
   ```

1. [3단계: kubeconfig 업데이트](#hybrid-nodes-cluster-create-kubeconfig) 항목을 계속 진행합니다.

### 하이브리드 노드 지원 클러스터 생성 - AWS Management Console
<a name="hybrid-nodes-cluster-create-console"></a>

1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)에서 Amazon EKS 콘솔을 엽니다.

1. 클러스터 추가를 선택하고 생성을 선택합니다.

1. 클러스터 구성 페이지에서 다음 필드를 입력합니다.

   1.  **이름** - 클러스터의 이름 이름에는 영숫자(대소문자 구분)와 하이픈, 밑줄만 사용할 수 있습니다. 영숫자로 시작해야 하며 100자 이하여야 합니다. 이름은 클러스터를 생성하는 AWS 리전과 AWS 계정 내에서 고유해야 합니다.

   1.  **클러스터 IAM 역할**-생성한 Amazon EKS 클러스터 IAM 역할을 선택하여 Kubernetes 컨트롤 플레인이 사용자 대신 AWS 리소스를 관리하게 할 수 있습니다.

   1.  **Kubernetes 버전(Kubernetes version)** - 클러스터에 대해 사용할 Kubernetes 버전 이전 버전이 필요한 경우가 아니면 최신 버전을 선택하는 것이 좋습니다.

   1.  **업그레이드 정책**-확장 또는 표준을 선택합니다.

      1.  **확장:** 이 옵션은 릴리스 날짜 이후 26개월 동안 Kubernetes 버전을 지원합니다. 연장 지원 기간에는 표준 지원 기간이 종료된 후 시작되는 시간당 추가 비용이 발생합니다. 확장 지원이 종료되면 클러스터가 다음 버전으로 자동 업그레이드됩니다.

      1.  **표준:** 이 옵션은 릴리스 날짜 이후 14개월 동안 Kubernetes 버전을 지원합니다. 추가 비용은 없습니다. 표준 지원이 종료되면 클러스터가 다음 버전으로 자동 업그레이드됩니다.

   1.  **클러스터 액세스**-클러스터 관리자 액세스를 허용하거나 허용하지 않도록 선택하고 인증 모드를 선택합니다. 하이브리드 노드 지원 클러스터에는 다음 인증 모드가 지원됩니다.

      1.  **EKS API**: 클러스터는 EKS 액세스 항목 API에서만 인증된 IAM 보안 주체를 가져옵니다.

      1.  **EKS API 및 ConfigMap**: 클러스터는 EKS 액세스 항목 API와 `aws-auth` ConfigMap 모두에서 인증된 IAM 보안 주체를 가져옵니다.

   1.  **비밀 암호화(Secrets encryption)** - (선택 사항) KMS 키를 사용하여 Kubernetes 비밀의 비밀 암호화를 사용 설정하도록 선택합니다. 클러스터를 생성한 후에도 이 기능을 사용 설정할 수 있습니다. 이 기능을 사용 설정하기 전에 [기존 클러스터에서 KMS를 사용하여 Kubernetes 비밀 암호화](enable-kms.md)의 정보를 숙지해야 합니다.

   1.  **ARC 영역 전환** - 이 기능을 활성화하면 EKS는 클러스터를 ARC 영역 전환에 등록하여 영역 전환을 통해 애플리케이션 트래픽을 AZ에서 다른 위치로 전환할 수 있습니다.

   1.  **태그**-(선택사항) 클러스터에 태그를 추가합니다. 자세한 내용은 [태그를 사용하여 Amazon EKS 리소스 구성](eks-using-tags.md) 섹션을 참조하세요.

   1. 이 페이지를 모두 완료하면 **다음**을 선택합니다.

1. **네트워킹 지정** 페이지에서 다음 필드의 값을 선택합니다.

   1.  **VPC**-[VPC 및 서브넷에 대한 Amazon EKS 네트워킹 요구 사항 보기](network-reqs.md) 및 [Amazon EKS Hybrid Nodes 요구 사항](hybrid-nodes-prereqs.md)을 충족하는 기존 VPC를 선택합니다. VPC를 선택하기 전에 VPC, 서브넷, 하이브리드 노드에 대한 Amazon EKS 네트워킹 요구 사항 보기의 모든 요구 사항과 고려 사항을 숙지하는 것이 좋습니다. 클러스터 생성 후에는 사용하려는 VPC를 변경할 수 없습니다. 목록에 기존 VPC가 없는 경우 먼저 VPC를 생성해야 합니다. 자세한 내용은 [Amazon EKS 클러스터에 대한 Amazon VPC 생성](creating-a-vpc.md) 및 [Amazon EKS Hybrid Nodes 네트워킹 요구 사항](hybrid-nodes-prereqs.md)을 참조하세요.

   1.  **서브넷**-기본적으로 이전 필드에서 지정한 VPC에서 사용 가능한 모든 서브넷이 사전 선택됩니다. 두 개 이상을 선택해야 합니다.

   1.  **보안 그룹** – (선택사항) 생성하는 네트워크 인터페이스에 Amazon EKS가 연결하려는 보안 그룹을 하나 이상 지정합니다. 지정하는 보안 그룹 중 하나 이상에 온프레미스 노드와 선택적으로 포드 CIDR에 대한 인바운드 규칙이 있어야 합니다. 자세한 내용은 [Amazon EKS Hybrid Nodes networking requirements](hybrid-nodes-networking.md)을 참조하세요. 보안 그룹 선택 여부에 관계없이 Amazon EKS는 클러스터와 VPC 간에 통신을 사용 설정할 수 있는 보안 그룹을 생성합니다. Amazon EKS는 이 보안 그룹과 사용자가 선택한 보안 그룹을 생성하는 네트워크 인터페이스에 연결합니다. Amazon EKS가 생성하는 클러스터 보안 그룹에 대한 자세한 내용은 [클러스터에 대한 Amazon EKS 보안 그룹 요구 사항 보기](sec-group-reqs.md) 섹션을 참조하세요. Amazon EKS가 생성하는 클러스터 보안 그룹의 규칙을 수정할 수 있습니다.

   1.  **클러스터 IP 주소 패밀리 선택**-하이브리드 노드 지원 클러스터의 경우 IPv4를 선택해야 합니다.

   1. (선택 사항) **Kubernetes 서비스 IP 주소 범위 구성**을 선택하고 **서비스 IPv4 범위**를 지정합니다.

   1.  **하이브리드 노드를 활성화하도록 원격 네트워크 구성을 선택**하고 하이브리드 노드에 대한 온프레미스 노드와 포드 CIDR을 지정합니다.

   1. 포드 트래픽이 온프레미스 호스트에서 나갈 때 CNI가 포드 IP 주소에 네트워크 주소 변환(NAT) 또는 매스커레이딩을 사용하지 않는 경우 원격 포드 CIDR을 구성해야 합니다. 하이브리드 노드에서 웹후크를 실행하는 경우 원격 포드 CIDR을 구성해야 합니다.

   1. 온프레미스 노드 및 포드 CIDR 블록은 다음 요구 사항을 충족해야 합니다.

      1. IPv4 RFC-1918 범위 중 하나(`10.0.0.0/8`, `172.16.0.0/12` 또는 `192.168.0.0/16`) 또는 RFC 6598에 의해 정의된 CGNAT 범위 내(`100.64.0.0/10`)에 있어야 합니다.

      1. 서로, 클러스터의 `VPC CIDR` 또는 Kubernetes 서비스 IPv4 CIDR과 중첩되지 않습니다.

   1. **클러스터 엔드포인트 액세스**에서 옵션을 선택합니다. 클러스터를 생성한 후에는 이 옵션을 변경할 수 있습니다. 하이브리드 노드 지원 클러스터의 경우 퍼블릭 또는 프라이빗을 선택해야 합니다. 기본값이 아닌 옵션을 선택하기 전에 옵션과 그 의미를 숙지해야 합니다. 자세한 내용은 [클러스터 API 서버 엔드포인트](cluster-endpoint.md) 섹션을 참조하세요.

   1. 이 페이지를 모두 완료하면 **다음**을 선택합니다.

1. (선택사항) 관찰성 **구성** 페이지에서 설정할 지표 및 컨트롤 플레인 로깅 옵션을 선택합니다. 기본적으로 각 로그 유형은 해제되어 있습니다.

   1. Prometheus 지표 옵션에 자세한 내용은 [Prometheus를 사용한 클러스터 지표 모니터링](prometheus.md) 섹션을 참조하세요.

   1. EKS 컨트롤 로깅 옵션에 대한 자세한 내용은 [CloudWatch Logs에 컨트롤 플레인 로그 전송](control-plane-logs.md) 섹션을 참조하세요.

   1. 이 페이지를 모두 완료하면 **다음**을 선택합니다.

1. **추가 기능 선택** 페이지에서 클러스터에 추가할 추가 기능을 선택합니다.

   1. 필요한 만큼 **Amazon EKS 애드온** 및 **AWS 마켓플레이스 애드온**을 선택할 수 있습니다. 하이브리드 노드와 호환되지 않는 Amazon EKS 추가 기능은 '하이브리드 노드와 호환되지 않음'으로 표시되며 추가 기능에는 하이브리드 노드에서 실행되지 않게 하는 반선호도 규칙이 있습니다. 자세한 내용은 하이브리드 노드용 추가 기능 구성을 참조하세요. 설치하려는 **AWS 마켓플레이스 애드온**이 목록에 없는 경우 검색창에 텍스트를 입력하여 사용 가능한 **AWS 마켓플레이스 애드온**을 검색할 수 있습니다. **카테고리**, **공급업체** 또는 **요금 모델**로 검색한 다음에 검색 결과 중에서 추가 기능을 선택할 수도 있습니다.

   1. CoreDNS, kube-proxy와 같은 일부 추가 기능은 기본적으로 설치됩니다. 기본 추가 기능을 비활성화하면 Kubernetes 애플리케이션 실행 기능에 영향을 미칠 수 있습니다.

   1. 이 페이지를 모두 완료하면 `Next`을 선택합니다.

1. **선택한 추가 기능 설정 구성** 페이지에서 설치할 버전을 선택합니다.

   1. 클러스터 생성 후 언제든지 최신 버전으로 업데이트할 수 있습니다. 클러스터 생성 후 각 추가 기능의 구성을 업데이트할 수 있습니다. 추가 기능 구성에 대한 자세한 내용은 [Amazon EKS 추가 기능 업데이트](updating-an-add-on.md) 섹션을 참조하세요. 하이브리드 노드와 호환되는 추가 기능 버전은 [하이브리드 노드에 대한 추가 기능 구성](hybrid-nodes-add-ons.md) 섹션을 참조하세요.

   1. 이 페이지를 모두 완료하면 다음을 선택합니다.

1. **검토 및 생성** 페이지에서 이전 페이지에서 입력하거나 선택한 정보를 검토합니다. 변경해야 하는 경우 **편집**을 선택합니다 만족하는 경우 **생성**을 선택합니다. 클러스터가 프로비저닝되는 동안 **상태** 필드에는 **생성 중**이 표시됩니다. 클러스터 프로비저닝에는 몇 분 정도 걸립니다.

1. [3단계: kubeconfig 업데이트](#hybrid-nodes-cluster-create-kubeconfig) 항목을 계속 진행합니다.

## 3단계: kubeconfig 업데이트
<a name="hybrid-nodes-cluster-create-kubeconfig"></a>

`eksctl`을 사용하여 클러스터를 생성한 경우 이 단계를 건너뛸 수 있습니다. 이는 `eksctl`이 사용자 대신 이 단계를 이미 완료했기 때문입니다. `kubectl` 구성 파일에 새 컨텍스트를 추가하여 이 클러스터와 통신하도록 `kubectl`을 활성화합니다. 파일 생성 및 업데이트 방법에 대한 자세한 내용을 알아보려면 [Kubeconfig 파일을 생성하여 kubectl을 EKS 클러스터에 연결](create-kubeconfig.md) 부분을 참조하세요.

```
aws eks update-kubeconfig --name CLUSTER_NAME --region AWS_REGION
```

예제 출력은 다음과 같습니다.

```
Added new context arn:aws:eks:AWS_REGION:111122223333:cluster/CLUSTER_NAME to /home/username/.kube/config
```

다음 명령을 실행하여 클러스터와의 통신을 확인합니다.

```
kubectl get svc
```

예제 출력은 다음과 같습니다.

```
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   28h
```

## 4단계: 클러스터 설정
<a name="_step_4_cluster_setup"></a>

다음 단계로 하이브리드 노드가 클러스터에 조인할 수 있도록 액세스를 활성화하려면 [하이브리드 노드에 대한 클러스터 액세스 준비](hybrid-nodes-cluster-prep.md) 섹션을 참조하세요.

# 기존 Amazon EKS 클러스터에서 하이브리드 노드 활성화 또는 구성 수정
<a name="hybrid-nodes-cluster-update"></a>

이 주제에서는 사용 가능한 옵션에 대한 개요를 제공하고 Amazon EKS 클러스터의 하이브리드 노드 구성을 추가, 변경 또는 제거할 때 고려해야 할 사항을 설명합니다.

Amazon EKS 클러스터에서 하이브리드 노드를 사용할 수 있게 하려면 `RemoteNetworkConfig` 구성에서 온프레미스 노드와 포드 네트워크(선택 사항)의 IP 주소 CIDR 범위를 추가합니다. EKS는 이 CIDR 목록을 사용하여 클러스터와 온프레미스 네트워크 간의 연결을 활성화합니다. 클러스터 구성을 업데이트할 때의 전체 옵션 목록은 *Amazon EKS API 참조*의 [UpdateClusterConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateClusterConfig.html)를 참조하세요.

클러스터의 EKS Hybrid Nodes 네트워킹 구성에 대해 다음 작업 중 하나를 수행할 수 있습니다.
+  [원격 네트워크 구성을 추가하여 기존 클러스터에서 EKS Hybrid Nodes를 활성화합니다.](#hybrid-nodes-cluster-enable-existing)
+  [기존 클러스터에서 원격 노드 네트워크나 원격 포드 네트워크를 추가, 변경 또는 제거합니다.](#hybrid-nodes-cluster-update-config)
+  [모든 원격 노드 네트워크 CIDR 범위를 제거하여 기존 클러스터에서 EKS Hybrid Nodes를 비활성화합니다.](#hybrid-nodes-cluster-disable)

## 사전 조건
<a name="hybrid-nodes-cluster-enable-prep"></a>
+ 하이브리드 노드에 대해 Amazon EKS 클러스터를 활성화하기 전에 환경이 [하이브리드 노드에 대한 사전 조건 설정](hybrid-nodes-prereqs.md)에 요약되어 있고 [하이브리드 노드용 네트워킹 준비](hybrid-nodes-networking.md), [하이브리드 노드용 운영 체제 준비](hybrid-nodes-os.md) 및 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md)에 자세히 설명된 요구 사항을 충족하는지 확인합니다.
+ 클러스터는 IPv4 주소 패밀리를 사용해야 합니다.
+ 클러스터는 클러스터 인증 모드에 `API` 또는 `API_AND_CONFIG_MAP`을 사용해야 합니다. 클러스터 인증 모드를 수정하는 프로세스는 [액세스 항목을 사용하도록 인증 모드 변경](setting-up-access-entries.md)에 설명되어 있습니다.
+ Amazon EKS Kubernetes API 서버 엔드포인트에 퍼블릭 또는 프라이빗 엔드포인트 액세스 중 하나만 사용하는 것이 좋습니다. '퍼블릭 및 프라이빗'을 선택하면 Amazon EKS Kubernetes API 서버 엔드포인트가 항상 VPC 외부에서 실행되는 하이브리드 노드의 퍼블릭 IP로 확인되므로 하이브리드 노드가 클러스터에 조인하지 못할 수 있습니다. 클러스터에 대한 네트워크 액세스를 수정하는 프로세스는 [클러스터 API 서버 엔드포인트](cluster-endpoint.md)에 설명되어 있습니다.
+ 장치에 최신 버전의 AWS Command Line Interface(AWS CLI)가 설치 및 구성되어 있습니다. 현재 버전을 확인하려면 `aws --version`을 사용합니다. yum, apt-get 또는 macOS용 Homebrew와 같은 패키지 관리자는 최신 버전 AWS CLI 이전에 나온 버전이 몇 가지 있을 때도 있습니다. 최신 버전을 설치하려면 AWS 명령줄 인터페이스 사용 설명서의 [최신 버전의 AWS CLI 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 및 [AWS CLI 설정 구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)을 참조하세요.
+ Amazon EKS 클러스터에서 [UpdateClusterConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateClusterConfig.html)를 직접적으로 호출할 수 있는 권한이 있는 [IAM 위탁자](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles#iam-term-principal)입니다.
+ 하이브리드 노드와 호환되는 버전으로 추가 기능을 업데이트합니다. 하이브리드 노드와 호환되는 추가 기능 버전은 [하이브리드 노드에 대한 추가 기능 구성](hybrid-nodes-add-ons.md) 섹션을 참조하세요.
+ 하이브리드 노드와 호환되지 않는 추가 기능을 실행하는 경우 하이브리드 노드에 배포를 방지하는 다음 선호도 규칙이 추가 기능 [DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/) 또는 [배포](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)에 있는지 확인합니다. 아직 없으면 다음 선호도 규칙을 추가합니다.

  ```
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
  ```

## 고려 사항
<a name="hybrid-nodes-cluster-enable-consider"></a>

`remoteNetworkConfig` JSON 객체는 업데이트 중 다음과 같은 동작을 합니다.
+ 지정하지 않은 구성의 기존 부분은 변경되지 않습니다. `remoteNodeNetworks` 또는 `remotePodNetworks` 중 하나를 지정하지 않는 경우 해당 부분은 동일하게 유지됩니다.
+ CIDR의 `remoteNodeNetworks` 또는 `remotePodNetworks` 목록 중 하나를 수정하는 경우 최종 구성에서 원하는 CIDR의 전체 목록을 지정해야 합니다. `remoteNodeNetworks` 또는 `remotePodNetworks` CIDR 목록 중 하나에 대한 변경 사항을 지정하는 경우 업데이트 중 EKS가 원래 목록을 대체합니다.
+ 온프레미스 노드 및 포드 CIDR 블록은 다음 요구 사항을 충족해야 합니다.

  1. IPv4 RFC-1918 범위 중 하나(10.0.0.0/8, 172.16.0.0/12 또는 192.168.0.0/16) 중 하나 또는 RFC 6598에 의해 정의된 CGNAT 범위 내(`100.64.0.0/10`)에 있어야 합니다.

  1. 서로, Amazon EKS 클러스터의 모든 VPC CIDR 또는 Kubernetes 서비스 IPv4 CIDR과 중첩되지 않아야 합니다.

## 기존 클러스터에서 하이브리드 노드 활성화
<a name="hybrid-nodes-cluster-enable-existing"></a>

다음을 사용하여 기존 클러스터에서 EKS Hybrid Nodes를 활성화할 수 있습니다.
+  [AWS CloudFormation](#hybrid-nodes-cluster-enable-cfn) 
+  [AWS CLI](#hybrid-nodes-cluster-enable-cli) 
+  [AWS Management Console](#hybrid-nodes-cluster-enable-console) 

### 기존 클러스터에서 EKS Hybrid Nodes 활성화 - AWS CloudFormation
<a name="hybrid-nodes-cluster-enable-cfn"></a>

1. 클러스터에서 EKS Hybrid Nodes를 활성화하려면 CloudFormation 템플릿에 `RemoteNodeNetwork`와 `RemotePodNetwork`(선택 사항)를 추가하고 스택을 업데이트합니다. `RemoteNodeNetwork`는 최대 하나의 `Cidrs` 항목이 포함된 목록이고, `Cidrs`는 여러 IP CIDR 범위의 목록입니다.

   ```
   RemoteNetworkConfig:
     RemoteNodeNetworks:
       - Cidrs: [RemoteNodeCIDR]
     RemotePodNetworks:
       - Cidrs: [RemotePodCIDR]
   ```

1. 계속해서 [하이브리드 노드에 대한 클러스터 액세스 준비](hybrid-nodes-cluster-prep.md)로 이동하세요.

### 기존 클러스터에서 EKS Hybrid Nodes 활성화 - AWS CLI
<a name="hybrid-nodes-cluster-enable-cli"></a>

1. 다음 명령을 실행하여 EKS 클러스터의 EKS Hybrid Nodes에 대해 `RemoteNetworkConfig`를 활성화합니다. 명령을 실행하기 전에 다음을 실제 설정으로 바꿉니다. 전체 설정 목록은 *Amazon EKS API 참조*의 [UpdateClusterConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateClusterConfig.html)를 참조하세요.

   1.  `CLUSTER_NAME`: 업데이트할 EKS 클러스터의 이름입니다.

   1.  `AWS_REGION`: EKS 클러스터가 실행 중인 AWS 리전입니다.

   1.  `REMOTE_NODE_CIDRS`: 하이브리드 노드에 대한 온프레미스 노드 CIDR입니다.

   1.  `REMOTE_POD_CIDRS` (선택 사항): 하이브리드 노드에서 실행되는 워크로드에 대한 온프레미스 포드 CIDR입니다.

      ```
      aws eks update-cluster-config \
          --name CLUSTER_NAME \
          --region AWS_REGION \
          --remote-network-config '{"remoteNodeNetworks":[{"cidrs":["REMOTE_NODE_CIDRS"]}],"remotePodNetworks":[{"cidrs":["REMOTE_POD_CIDRS"]}]}'
      ```

1. 클러스터를 업데이트하는 데 몇 분 정도 걸립니다. 다음 명령을 사용하여 클러스터의 상태를 쿼리할 수 있습니다. `CLUSTER_NAME`을 수정 중인 클러스터의 이름으로 바꾸고 `AWS_REGION`을 클러스터가 실행되고 있는 AWS 리전으로 바꿉니다. 반환되는 출력이 `ACTIVE`가 되면 다음 단계로 진행하세요.

   ```
   aws eks describe-cluster \
       --name CLUSTER_NAME \
       --region AWS_REGION \
       --query "cluster.status"
   ```

1. 계속해서 [하이브리드 노드에 대한 클러스터 액세스 준비](hybrid-nodes-cluster-prep.md)로 이동하세요.

### 기존 클러스터에서 EKS Hybrid Nodes 활성화 - AWS Management Console
<a name="hybrid-nodes-cluster-enable-console"></a>

1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)에서 Amazon EKS 콘솔을 엽니다.

1. 클러스터 이름을 선택하여 클러스터 정보를 표시합니다.

1. **네트워킹** 탭을 선택하고 **관리**를 선택합니다.

1. 드롭다운에서 **원격 네트워크**를 선택합니다.

1.  **하이브리드 노드를 활성화하도록 원격 네트워크 구성을 선택**하고 하이브리드 노드에 대한 온프레미스 노드와 포드 CIDR을 지정합니다.

1. **변경 사항 저장**을 선택하여 종료합니다. 클러스터가 **활성** 상태로 돌아갈 때까지 기다립니다.

1. 계속해서 [하이브리드 노드에 대한 클러스터 액세스 준비](hybrid-nodes-cluster-prep.md)로 이동하세요.

## 기존 클러스터에서 하이브리드 노드 구성 업데이트
<a name="hybrid-nodes-cluster-update-config"></a>

다음 중 하나를 사용하여 기존 하이브리드 클러스터에서 `remoteNetworkConfig`를 수정할 수 있습니다.
+  [AWS CloudFormation](#hybrid-nodes-cluster-update-cfn) 
+  [AWS CLI](#hybrid-nodes-cluster-update-cli) 
+  [AWS Management Console](#hybrid-nodes-cluster-update-console) 

### 기존 클러스터에서 하이브리드 구성 업데이트 - AWS CloudFormation
<a name="hybrid-nodes-cluster-update-cfn"></a>

1. 새 네트워크 CIDR 값으로 CloudFormation 템플릿을 업데이트합니다.

   ```
   RemoteNetworkConfig:
     RemoteNodeNetworks:
       - Cidrs: [NEW_REMOTE_NODE_CIDRS]
     RemotePodNetworks:
       - Cidrs: [NEW_REMOTE_POD_CIDRS]
   ```
**참고**  
`RemoteNodeNetworks` 또는 `RemotePodNetworks` CIDR 목록을 업데이트할 때 모든 CIDR(신규 및 기존)을 포함합니다. EKS는 업데이트 중 전체 목록을 대체합니다. 업데이트 요청에서 이러한 필드를 생략하면 기존 구성이 유지됩니다.

1. 수정된 템플릿으로 CloudFormation 스택을 업데이트하고 스택 업데이트가 완료될 때까지 기다립니다.

### 기존 클러스터에서 하이브리드 구성 업데이트 - AWS CLI
<a name="hybrid-nodes-cluster-update-cli"></a>

1. 원격 네트워크 CIDR을 수정하려면 다음 명령을 실행합니다. 값을 실제 설정으로 바꿉니다.

   ```
   aws eks update-cluster-config
   --name CLUSTER_NAME
   --region AWS_REGION
   --remote-network-config '{"remoteNodeNetworks":[{"cidrs":["NEW_REMOTE_NODE_CIDRS"]}],"remotePodNetworks":[{"cidrs":["NEW_REMOTE_POD_CIDRS"]}]}'
   ```
**참고**  
`remoteNodeNetworks` 또는 `remotePodNetworks` CIDR 목록을 업데이트할 때 모든 CIDR(신규 및 기존)을 포함합니다. EKS는 업데이트 중 전체 목록을 대체합니다. 업데이트 요청에서 이러한 필드를 생략하면 기존 구성이 유지됩니다.

1. 계속 진행하기 전에 클러스터가 활성화됨 상태로 돌아갈 때까지 기다립니다.

### 기존 클러스터에서 하이브리드 구성 업데이트 - AWS Management Console
<a name="hybrid-nodes-cluster-update-console"></a>

1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)에서 Amazon EKS 콘솔을 엽니다.

1. 클러스터 이름을 선택하여 클러스터 정보를 표시합니다.

1. **네트워킹** 탭을 선택하고 **관리**를 선택합니다.

1. 드롭다운에서 **원격 네트워크**를 선택합니다.

1. 필요에 따라 `Remote pod networks - Optional` 및 `Remote node networks`에서 CIDR을 업데이트합니다.

1. **변경 사항 저장**을 선택하고 클러스터 상태가 **활성**으로 돌아갈 때까지 기다립니다.

## 기존 클러스터에서 하이브리드 노드 비활성화
<a name="hybrid-nodes-cluster-disable"></a>

다음을 사용하여 기존 클러스터에서 EKS Hybrid Nodes를 비활성화할 수 있습니다.
+  [AWS CloudFormation](#hybrid-nodes-cluster-disable-cfn) 
+  [AWS CLI](#hybrid-nodes-cluster-disable-cli) 
+  [AWS Management Console](#hybrid-nodes-cluster-disable-console) 

### 기존 클러스터에서 EKS Hybrid Nodes 비활성화 - AWS CloudFormation
<a name="hybrid-nodes-cluster-disable-cfn"></a>

1. 클러스터에서 EKS Hybrid Nodes를 비활성화하려면 CloudFormation 템플릿에서 `RemoteNodeNetworks`와 `RemotePodNetworks`를 빈 어레이로 설정하고 스택을 업데이트합니다.

   ```
   RemoteNetworkConfig:
     RemoteNodeNetworks: []
     RemotePodNetworks: []
   ```

### 기존 클러스터에서 EKS Hybrid Nodes 비활성화 - AWS CLI
<a name="hybrid-nodes-cluster-disable-cli"></a>

1. 다음 명령을 실행하여 EKS 클러스터에서 `RemoteNetworkConfig`를 제거합니다. 명령을 실행하기 전에 다음을 실제 설정으로 바꿉니다. 전체 설정 목록은 *Amazon EKS API 참조*의 [UpdateClusterConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateClusterConfig.html)를 참조하세요.

   1.  `CLUSTER_NAME`: 업데이트할 EKS 클러스터의 이름입니다.

   1.  `AWS_REGION`: EKS 클러스터가 실행 중인 AWS 리전입니다.

      ```
      aws eks update-cluster-config \
          --name CLUSTER_NAME \
          --region AWS_REGION \
          --remote-network-config '{"remoteNodeNetworks":[],"remotePodNetworks":[]}'
      ```

1. 클러스터를 업데이트하는 데 몇 분 정도 걸립니다. 다음 명령을 사용하여 클러스터의 상태를 쿼리할 수 있습니다. `CLUSTER_NAME`을 수정 중인 클러스터의 이름으로 바꾸고 `AWS_REGION`을 클러스터가 실행되고 있는 AWS 리전으로 바꿉니다. 반환되는 출력이 `ACTIVE`가 되면 다음 단계로 진행하세요.

   ```
   aws eks describe-cluster \
       --name CLUSTER_NAME \
       --region AWS_REGION \
       --query "cluster.status"
   ```

### 기존 클러스터에서 EKS Hybrid Nodes 비활성화 - AWS Management Console
<a name="hybrid-nodes-cluster-disable-console"></a>

1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)에서 Amazon EKS 콘솔을 엽니다.

1. 클러스터 이름을 선택하여 클러스터 정보를 표시합니다.

1. **네트워킹** 탭을 선택하고 **관리**를 선택합니다.

1. 드롭다운에서 **원격 네트워크**를 선택합니다.

1. `Remote node networks` 및 `Remote pod networks - Optional`에서 **하이브리드 노드를 사용하도록 원격 네트워크 구성**을 선택하고 모든 CIDR을 제거합니다.

1. **변경 사항 저장**을 선택하여 종료합니다. 클러스터가 **활성** 상태로 돌아갈 때까지 기다립니다.

# 하이브리드 노드에 대한 클러스터 액세스 준비
<a name="hybrid-nodes-cluster-prep"></a>

하이브리드 노드를 Amazon EKS 클러스터에 연결하기 전에 Kubernetes 권한이 있는 하이브리드 노드 IAM 역할을 활성화하여 클러스터에 조인해야 합니다. 하이브리드 노드 IAM 역할 생성 방법에 대한 자세한 내용은 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md) 섹션을 참조하세요. Amazon EKS는 IAM 보안 주체를 Kubernetes 역할 기반 액세스 제어(RBAC), Amazon EKS 액세스 항목, `aws-auth` ConfigMap과 연결하는 두 가지 방법을 지원합니다. Amazon EKS 액세스 관리에 대한 자세한 내용은 [IAM 사용자 및 역할에 Kubernetes API에 대한 액세스 권한 부여](grant-k8s-access.md) 섹션을 참조하세요.

아래 절차에 따라 하이브리드 노드 IAM 역할을 Kubernetes 권한과 연결합니다. Amazon EKS 액세스 항목을 사용하려면 클러스터가 `API` 또는 `API_AND_CONFIG_MAP` 인증 모드로 생성되어야 합니다. `aws-auth` ConfigMap을 사용하려면 클러스터가 `API_AND_CONFIG_MAP` 인증 모드로 생성되어야 합니다. 하이브리드 노드 지원 Amazon EKS 클러스터에는 `CONFIG_MAP` 전용 인증 모드가 지원되지 않습니다.

## 하이브리드 노드 IAM 역할에 Amazon EKS 액세스 항목 사용
<a name="_using_amazon_eks_access_entries_for_hybrid_nodes_iam_role"></a>

IAM 역할과 함께 사용할 수 있는 하이브리드 노드의 Amazon EKS 액세스 항목 유형인 HYBRID\$1LINUX가 있습니다. 이 액세스 항목 유형에서는 사용자 이름이 system:node:\$1\$1SessionName\$1\$1으로 자동 설정됩니다. 액세스 항목 생성에 대한 자세한 내용은 [액세스 항목 생성](creating-access-entries.md) 섹션을 참조하세요.

### AWS CLI
<a name="shared_aws_cli"></a>

1. 장치에 최신 버전의 AWS CLI가 설치 및 구성되어 있어야 합니다. 현재 버전을 확인하려면 `aws --version`을 사용합니다. yum, apt-get 또는 macOS용 Homebrew와 같은 패키지 관리자는 최신 버전 AWS CLI 이전에 나온 버전이 몇 가지 있을 때도 있습니다. 최신 버전을 설치하려면 AWS 명령줄 인터페이스 사용 설명서에서 설치 및 aws config를 사용하여 빠른 구성을 참조하세요.

1. 다음 명령을 사용하여 액세스 항목을 생성합니다. CLUSTER\$1NAME을 클러스터 이름으로 바꾸고 HYBRID\$1NODES\$1ROLE\$1ARN을 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md)의 단계에서 생성한 역할의 ARN으로 바꿉니다.

   ```
   aws eks create-access-entry --cluster-name CLUSTER_NAME \
       --principal-arn HYBRID_NODES_ROLE_ARN \
       --type HYBRID_LINUX
   ```

### AWS Management Console
<a name="hybrid-nodes-cluster-prep-console"></a>

1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)에서 Amazon EKS 콘솔을 엽니다.

1. 하이브리드 노드 지원 클러스터의 이름을 선택합니다.

1. **액세스** 탭을 선택합니다.

1. **액세스 항목 생성**을 선택합니다.

1. **IAM 보안 주체**의 경우 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md)의 단계에서 생성한 하이브리드 노드 IAM 역할을 선택합니다.

1. **유형**에서 **하이브리드 Linux**를 선택합니다.

1. (선택사항) **태그**에서 액세스 항목에 레이블을 할당합니다. 예를 들어, 태그가 동일한 모든 리소스를 더 쉽게 찾을 수 있습니다.

1. **검토 및 생성 건너뛰기**를 선택합니다. 하이브리드 Linux 액세스 항목에 정책을 추가하거나 액세스 범위를 변경할 수 없습니다.

1. 액세스 항목의 구성을 검토합니다. 문제가 있는 것 같으면 **이전**을 선택하여 이전 단계로 돌아가서 오류를 수정합니다. 구성이 올바르면 **생성**을 선택합니다.

## 하이브리드 노드 IAM 역할에 aws-auth ConfigMap 사용
<a name="_using_aws_auth_configmap_for_hybrid_nodes_iam_role"></a>

다음 단계에서는 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md)의 단계에서 생성한 하이브리드 노드 IAM 역할의 ARN으로 `aws-auth` ConfigMap을 생성하거나 업데이트합니다.

1. 클러스터에 대한 기존 `aws-auth` ConfigMap이 있는지 확인합니다. 특정 `kubeconfig` 파일을 사용하는 경우 `--kubeconfig` 플래그를 사용합니다.

   ```
   kubectl describe configmap -n kube-system aws-auth
   ```

1. `aws-auth` ConfigMap이 표시되면 필요에 따라 이를 업데이트합니다.

   1. 편집을 위해 ConfigMap을 엽니다.

      ```
      kubectl edit -n kube-system configmap/aws-auth
      ```

   1. 필요에 따라 새 `mapRoles` 항목을 추가합니다. `HYBRID_NODES_ROLE_ARN`을 하이브리드 노드 IAM 역할의 ARN으로 바꿉니다. 참고로 `{{SessionName}}`은 ConfigMap에 저장할 올바른 템플릿 형식입니다. 다른 값으로 바꾸지 마세요.

      ```
      data:
        mapRoles: |
        - groups:
          - system:bootstrappers
          - system:nodes
          rolearn: HYBRID_NODES_ROLE_ARN
          username: system:node:{{SessionName}}
      ```

   1. 파일을 저장하고 텍스트 편집기를 종료합니다.

1. 클러스터에 대한 기존 `aws-auth` ConfigMap이 없는 경우 다음 명령을 사용하여 생성합니다. `HYBRID_NODES_ROLE_ARN`을 하이브리드 노드 IAM 역할의 ARN으로 바꿉니다. `{{SessionName}}`은 ConfigMap에 저장할 올바른 템플릿 형식입니다. 다른 값으로 바꾸지 마세요.

   ```
   kubectl apply -f=/dev/stdin <<-EOF
   apiVersion: v1
   kind: ConfigMap
   metadata:
     name: aws-auth
     namespace: kube-system
   data:
     mapRoles: |
     - groups:
       - system:bootstrappers
       - system:nodes
       rolearn: HYBRID_NODES_ROLE_ARN
       username: system:node:{{SessionName}}
   EOF
   ```

# 하이브리드 노드에서 온프레미스 워크로드 실행
<a name="hybrid-nodes-tutorial"></a>

하이브리드 노드가 활성화된 EKS 클러스터에서는 AWS 클라우드에서 사용하는 것과 동일한 Amazon EKS 클러스터, 기능, 도구를 사용하여 자체 인프라에서 온프레미스 및 엣지 애플리케이션을 실행할 수 있습니다.

다음 섹션에는 하이브리드 노드 사용을 위한 단계별 지침이 포함되어 있습니다.

**Topics**
+ [하이브리드 노드 연결](hybrid-nodes-join.md)
+ [Bottlerocket을 실행하는 하이브리드 노드 연결](hybrid-nodes-bottlerocket.md)
+ [하이브리드 노드 업그레이드](hybrid-nodes-upgrade.md)
+ [하이브리드 노드 패치](hybrid-nodes-security.md)
+ [하이브리드 노드 삭제](hybrid-nodes-remove.md)

# 하이브리드 노드 연결
<a name="hybrid-nodes-join"></a>

**참고**  
다음 단계는 Bottlerocket을 제외한 호환 운영 체제를 실행하는 하이브리드 노드에 적용됩니다. Bottlerocket을 실행하는 하이브리드 노드를 연결하는 단계는 [Bottlerocket을 실행하는 하이브리드 노드 연결](hybrid-nodes-bottlerocket.md) 섹션을 참조하세요.

이 주제에서는 하이브리드 노드를 Amazon EKS 클러스터에 연결하는 방법을 설명합니다. 하이브리드 노드가 클러스터에 조인되면 Amazon EKS 콘솔이나 kubectl과 같은 Kubernetes 호환 도구에 준비되지 않음 상태로 표시됩니다. 이 페이지의 단계를 완료한 후 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)로 이동하여 하이브리드 노드가 애플리케이션을 실행할 준비가 되게 합니다.

## 사전 조건
<a name="_prerequisites"></a>

하이브리드 노드를 Amazon EKS 클러스터에 연결하기 전에 사전 조건 단계를 완료했는지 확인합니다.
+ 온프레미스 환경에서 Amazon EKS 클러스터를 호스팅하는 AWS 리전으로 네트워크 연결이 가능합니다. 자세한 정보는 [하이브리드 노드용 네트워킹 준비](hybrid-nodes-networking.md)을 참조하세요.
+ 온프레미스 호스트에 하이브리드 노드용 호환 운영 체제가 설치되어 있습니다. 자세한 정보는 [하이브리드 노드용 운영 체제 준비](hybrid-nodes-os.md)을 참조하세요.
+ 하이브리드 노드 IAM 역할을 생성하고 온프레미스 자격 증명 공급자(AWS Systems Manager 하이브리드 활성화 또는 AWS IAM Roles Anywhere)를 설정했습니다. 자세한 정보는 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md)을 참조하세요.
+ 하이브리드 노드가 활성화된 Amazon EKS 클러스터를 생성했습니다. 자세한 정보는 [하이브리드 노드를 사용하여 Amazon EKS 클러스터 생성](hybrid-nodes-cluster-create.md)을 참조하세요.
+ 하이브리드 노드 IAM 역할을 Kubernetes 역할 기반 액세스 제어(RBAC) 권한과 연결했습니다. 자세한 정보는 [하이브리드 노드에 대한 클러스터 액세스 준비](hybrid-nodes-cluster-prep.md)을 참조하세요.

## 1단계: 각 온프레미스 호스트에 하이브리드 노드 CLI(`nodeadm`) 설치
<a name="_step_1_install_the_hybrid_nodes_cli_nodeadm_on_each_on_premises_host"></a>

사전 구축된 운영 체제 이미지에 Amazon EKS Hybrid Nodes CLI(`nodeadm`)를 포함하는 경우 이 단계를 건너뛸 수 있습니다. 하이브리드 노드 버전 `nodeadm`에 대한 자세한 내용은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md) 섹션을 참조하세요.

하이브리드 노드 버전 `nodeadm`은 Amazon CloudFront가 제공하는 Amazon S3에서 호스팅됩니다. 각 온프레미스 호스트에 `nodeadm`을 설치하려면 온프레미스 호스트에서 다음 명령을 실행할 수 있습니다.

 **x86\$164 호스트의 경우:** 

```
curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/amd64/nodeadm'
```

 **ARM 호스트의 경우** 

```
curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/arm64/nodeadm'
```

각 호스트에서 다운로드한 바이너리에 실행 파일 권한을 추가합니다.

```
chmod +x nodeadm
```

## 2단계: `nodeadm`을 사용하여 하이브리드 노드 종속성 설치
<a name="_step_2_install_the_hybrid_nodes_dependencies_with_nodeadm"></a>

사전 구축된 운영 체제 이미지에 하이브리드 노드 종속성을 설치하는 경우 이 단계를 건너뛸 수 있습니다. `nodeadm install` 명령을 사용하여 하이브리드 노드에 필요한 모든 종속성을 설치할 수 있습니다. 하이브리드 노드 종속성에는 Containered, kubelet, kubectl 및 AWS SSM 또는 AWS IAM Roles Anywhere 구성 요소가 포함됩니다. `nodeadm install`에서 설치한 구성 요소 및 파일 위치에 대한 자세한 내용은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md) 섹션을 참조하세요. `nodeadm install` 프로세스를 위해 온프레미스 방화벽에서 허용해야 하는 도메인에 대한 자세한 내용은 하이브리드 노드용 [하이브리드 노드용 네트워킹 준비](hybrid-nodes-networking.md)를 참조하세요.

아래 명령을 실행하여 온프레미스 호스트에 하이브리드 노드 종속성을 설치합니다. 아래 명령은 호스트에서 sudo/root 액세스 권한이 있는 사용자와 함께 실행해야 합니다.

**중요**  
하이브리드 노드 CLI(`nodeadm`)는 호스트에서 sudo/root 액세스 권한이 있는 사용자와 함께 실행해야 합니다.
+ 예를 들어 `K8S_VERSION`을 Amazon EKS 클러스터의 Kubernetes 마이너 버전(예: `1.31`)으로 바꿉니다. 지원되는 Kubernetes 버전 목록은 [Amazon EKS 지원 버전](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)을 참조하세요.
+ `CREDS_PROVIDER`를 사용 중인 온프레미스 자격 증명 공급자로 바꿉니다. 유효한 값은 `ssm`(AWS SSM) 및 `iam-ra`(AWS IAM Roles Anywhere)입니다.

```
nodeadm install K8S_VERSION --credential-provider CREDS_PROVIDER
```

## 3단계: 클러스터에 하이브리드 노드 연결
<a name="_step_3_connect_hybrid_nodes_to_your_cluster"></a>

하이브리드 노드를 클러스터에 연결하기 전에 Amazon EKS 컨트롤 플레인과 하이브리드 노드 간 통신을 주고받기 위해 클러스터의 온프레미스 방화벽 및 보안 그룹에서 필요한 액세스를 허용했는지 확인합니다. 이 단계에서 발생하는 대부분의 문제는 방화벽 구성, 보안 그룹 구성 또는 하이브리드 노드 IAM 역할 구성과 관련이 있습니다.

**중요**  
하이브리드 노드 CLI(`nodeadm`)는 호스트에서 sudo/root 액세스 권한이 있는 사용자와 함께 실행해야 합니다.

1. 각 호스트에 배포 값을 포함하는 `nodeConfig.yaml` 파일을 생성합니다. 사용 가능한 구성 설정에 대한 전체 설명은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md) 섹션을 참조하세요. 하이브리드 노드 IAM 역할에 `eks:DescribeCluster` 작업에 대한 권한이 없는 경우 `nodeConfig.yaml`의 클러스터 섹션에서 Kubernetes API 엔드포인트, 클러스터 CA 번들, Kubernetes 서비스 IPv4 CIDR을 전달해야 합니다.

   1. 온프레미스 자격 증명 공급자에 대해 AWS SSM 하이브리드 활성화를 사용하는 경우 아래 `nodeConfig.yaml` 예제를 사용합니다.

      1. `CLUSTER_NAME`를 클러스터 이름으로 바꿉니다.

      1. `AWS_REGION`을 클러스터를 호스팅하는 AWS 리전으로 바꿉니다. 예를 들어 `us-west-2`입니다.

      1. `ACTIVATION_CODE`를 AWS SSM 하이브리드 활성화를 생성할 때 받은 활성화 코드로 바꿉니다. 자세한 정보는 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md)을 참조하세요.

      1. `ACTIVATION_ID`를 AWS SSM 하이브리드 활성화를 생성할 때 받은 활성화 ID로 바꿉니다. AWS Systems Manager 콘솔 또는 AWS CLI `aws ssm describe-activations` 명령에서 이 정보를 검색할 수 있습니다.

         ```
         apiVersion: node.eks.aws/v1alpha1
         kind: NodeConfig
         spec:
           cluster:
             name: CLUSTER_NAME
             region: AWS_REGION
           hybrid:
             ssm:
               activationCode: ACTIVATION_CODE
               activationId: ACTIVATION_ID
         ```

   1. 온프레미스 자격 증명 공급자에 AWS IAM Roles Anywhere를 사용하는 경우 아래 `nodeConfig.yaml` 예제를 사용합니다.

      1. `CLUSTER_NAME`를 클러스터 이름으로 바꿉니다.

      1. `AWS_REGION`을 클러스터를 호스팅하는 AWS 리전으로 바꿉니다. 예를 들어 `us-west-2`입니다.

      1. `NODE_NAME`을 노드의 이름으로 바꿉니다. 하이브리드 노드 IAM 역할의 신뢰 정책을 `"sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}"` 리소스 조건으로 구성한 경우 노드 이름은 호스트에서 인증서의 CN과 일치해야 합니다. 사용하는 `nodeName`은 64자를 초과할 수 없습니다.

      1. 하이브리드 노드에 대한 자격 증명 준비 단계에서 구성한 트러스트 앵커의 ARN으로 `TRUST_ANCHOR_ARN`을 바꿉니다.

      1. [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md) 단계에서 구성한 트러스트 앵커의 ARN으로 `PROFILE_ARN`을 바꿉니다.

      1. `ROLE_ARN`을 하이브리드 노드 IAM 역할의 ARN으로 바꿉니다.

      1. `CERTIFICATE_PATH`를 노드 인증서의 디스크 경로로 바꿉니다. 지정하지 않으면 기본값은 `/etc/iam/pki/server.pem`입니다.

      1. `KEY_PATH`를 인증서 프라이빗 키의 디스크 경로로 바꿉니다. 지정하지 않으면 기본값은 `/etc/iam/pki/server.key`입니다.

         ```
         apiVersion: node.eks.aws/v1alpha1
         kind: NodeConfig
         spec:
           cluster:
             name: CLUSTER_NAME
             region: AWS_REGION
           hybrid:
             iamRolesAnywhere:
               nodeName: NODE_NAME
               trustAnchorArn: TRUST_ANCHOR_ARN
               profileArn: PROFILE_ARN
               roleArn: ROLE_ARN
               certificatePath: CERTIFICATE_PATH
               privateKeyPath: KEY_PATH
         ```

1. `nodeConfig.yaml`로 `nodeadm init` 명령을 실행하여 하이브리드 노드를 Amazon EKS 클러스터에 연결합니다.

   ```
   nodeadm init -c file://nodeConfig.yaml
   ```

위 명령이 성공적으로 완료되면 하이브리드 노드가 Amazon EKS 클러스터에 조인된 것입니다. 클러스터의 컴퓨팅 탭으로 이동하거나([IAM 보안 주체가 볼 수 있는 권한이 있는지 확인](view-kubernetes-resources.md#view-kubernetes-resources-permissions)) `kubectl get nodes`를 사용하여 Amazon EKS 콘솔에서 이를 확인할 수 있습니다.

**중요**  
노드의 상태는 `Not Ready`이며, 이는 하이브리드 노드에서 실행되는 CNI가 없기 때문에 이러한 상태가 예상됩니다. 노드가 클러스터에 조인하지 않은 경우 [하이브리드 노드 문제 해결](hybrid-nodes-troubleshooting.md) 섹션을 참조하세요.

## 4단계: 하이브리드 노드에 대한 CNI 구성
<a name="_step_4_configure_a_cni_for_hybrid_nodes"></a>

하이브리드 노드가 애플리케이션을 실행할 수 있게 하려면 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)의 단계를 계속합니다.

# Bottlerocket을 실행하는 하이브리드 노드 연결
<a name="hybrid-nodes-bottlerocket"></a>

이 주제에서는 Bottlerocket을 실행하는 하이브리드 노드를 Amazon EKS 클러스터에 연결하는 방법을 설명합니다. [Bottlerocket](https://aws.amazon.com/bottlerocket/)은 AWS에서 후원하고 지원하는 오픈 소스 Linux 배포판입니다. Bottlerocket은 컨테이너 워크로드 호스팅용으로 특별히 설계되었습니다. Bottlerocket을 사용하면 컨테이너 인프라 업데이트를 자동화하여 컨테이너화된 배포의 가용성을 개선하고 운영 비용을 절감할 수 있습니다. Bottlerocket에는 컨테이너를 실행하는 데 필수적인 소프트웨어만 포함되어 있어 리소스 사용량이 개선되고 보안 위협과 관리 오버헤드가 감소합니다.

Bottlerocket 버전 v1.37.0 이상의 VMware 변형만 EKS Hybrid Nodes에서 지원됩니다. Bottlerocket의 VMware 변형은 Kubernetes 버전 v1.28 이상에서 사용할 수 있습니다. 이러한 변형의 OS 이미지에는 kubelet, containerd, aws-iam-authenticator 및 기타 EKS Hybrid Nodes용 소프트웨어 사전 조건이 포함됩니다. Bottlerocket 부트스트랩 및 관리자 컨테이너에 대한 base64 인코딩된 사용자 데이터가 포함된 Bottlerocket [설정](https://github.com/bottlerocket-os/bottlerocket#settings) 파일을 사용하여 이러한 구성 요소를 구성할 수 있습니다. 이러한 설정을 구성하면 Bottlerocket이 하이브리드 노드 자격 증명 공급자를 사용하여 하이브리드 노드를 클러스터에 인증할 수 있습니다. 하이브리드 노드가 클러스터에 조인되면 Amazon EKS 콘솔이나 `kubectl`과 같은 Kubernetes 호환 도구에 `Not Ready` 상태로 표시됩니다. 이 페이지의 단계를 완료한 후 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)로 이동하여 하이브리드 노드가 애플리케이션을 실행할 준비가 되게 합니다.

## 사전 조건
<a name="_prerequisites"></a>

하이브리드 노드를 Amazon EKS 클러스터에 연결하기 전에 사전 조건 단계를 완료했는지 확인합니다.
+ 온프레미스 환경에서 Amazon EKS 클러스터를 호스팅하는 AWS 리전으로 네트워크 연결이 가능합니다. 자세한 정보는 [하이브리드 노드용 네트워킹 준비](hybrid-nodes-networking.md)을 참조하세요.
+ 하이브리드 노드 IAM 역할을 생성하고 온프레미스 자격 증명 공급자(AWS Systems Manager 하이브리드 활성화 또는 AWS IAM Roles Anywhere)를 설정했습니다. 자세한 정보는 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md)을 참조하세요.
+ 하이브리드 노드가 활성화된 Amazon EKS 클러스터를 생성했습니다. 자세한 정보는 [하이브리드 노드를 사용하여 Amazon EKS 클러스터 생성](hybrid-nodes-cluster-create.md)을 참조하세요.
+ 하이브리드 노드 IAM 역할을 Kubernetes 역할 기반 액세스 제어(RBAC) 권한과 연결했습니다. 자세한 정보는 [하이브리드 노드에 대한 클러스터 액세스 준비](hybrid-nodes-cluster-prep.md)을 참조하세요.

## 1단계: Bottlerocket 설정 TOML 파일 생성
<a name="_step_1_create_the_bottlerocket_settings_toml_file"></a>

하이브리드 노드에 대해 Bottlerocket을 구성하려면 필요한 구성으로 `settings.toml` 파일을 생성해야 합니다. TOML 파일의 내용은 사용 중인 자격 증명 공급자(SSM 또는 IAM Roles Anywhere)에 따라 달라집니다. 이 파일은 Bottlerocket 인스턴스를 프로비저닝할 때 사용자 데이터로 전달됩니다.

**참고**  
아래에 제공된 TOML 파일은 EKS 클러스터에서 Bottlerocket VMWare 시스템을 노드로 초기화하는 데 필요한 최소 설정만 나타냅니다. Bottlerocket은 여러 사용 사례를 해결하기 위해 다양한 설정을 제공하므로, 하이브리드 노드 초기화 이후 추가 구성 옵션의 경우 [Bottlerocket 설명서](https://bottlerocket.dev/en)에서 사용 중인 Bottlerocket 버전에 대해 문서화된 모든 설정의 전체 목록을 참조하세요(예를 들어 Bottlerocket 1.51.x에 대해 사용할 수 있는 모든 설정은 [여기](https://bottlerocket.dev/en/os/1.51.x/api/settings-index)를 참조).

### SSM
<a name="_ssm"></a>

AWS Systems Manager를 자격 증명 공급자로 사용하는 경우 다음 내용이 포함된 `settings.toml` 파일을 생성합니다.

```
[settings.kubernetes]
cluster-name = "<cluster-name>"
api-server = "<api-server-endpoint>"
cluster-certificate = "<cluster-certificate-authority>"
hostname-override = "<hostname>"
provider-id = "eks-hybrid:///<region>/<cluster-name>/<hostname>"
authentication-mode = "aws"
cloud-provider = ""
server-tls-bootstrap = true

[settings.network]
hostname = "<hostname>"

[settings.aws]
region = "<region>"

[settings.kubernetes.credential-providers.ecr-credential-provider]
enabled = true
cache-duration = "12h"
image-patterns = [
    "*.dkr.ecr.*.amazonaws.com",
    "*.dkr.ecr.*.amazonaws.com.rproxy.goskope.com.cn",
    "*.dkr.ecr.*.amazonaws.eu",
    "*.dkr.ecr-fips.*.amazonaws.com",
    "*.dkr.ecr-fips.*.amazonaws.eu",
    "public.ecr.aws"
]

[settings.kubernetes.node-labels]
"eks.amazonaws.com/compute-type" = "hybrid"
"eks.amazonaws.com/hybrid-credential-provider" = "ssm"

[settings.host-containers.admin]
enabled = true
user-data = "<base64-encoded-admin-container-userdata>"

[settings.bootstrap-containers.eks-hybrid-setup]
mode = "always"
user-data = "<base64-encoded-bootstrap-container-userdata>"

[settings.host-containers.control]
enabled = true
```

자리 표시자를 다음 값으로 바꿉니다.
+  `<cluster-name>`: Amazon ECS 클러스터의 이름입니다.
+  `<api-server-endpoint>`: 클러스터의 API 서버 엔드포인트입니다.
+  `<cluster-certificate-authority>`: 클러스터의 base64로 인코딩된 CA 번들입니다.
+  `<region>`: 클러스터를 호스팅하는 AWS 리전입니다(예: "us-east-1").
+  `<hostname>`: Bottlerocket 인스턴스의 호스트 이름으로, 노드 이름으로도 구성됩니다. 이 이름은 임의의 고유한 값일 수 있지만 [Kubernetes 객체 이름 지정 규칙](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names)을 따라야 합니다. 또한 사용하는 호스트 이름은 64자를 초과할 수 없습니다. 참고: SSM 공급자를 사용하는 경우 인스턴스가 SSM에 등록된 후 이 호스트 이름 및 노드 이름이 관리형 인스턴스 ID(예: `mi-*` ID)로 바뀝니다.
+  `<base64-encoded-admin-container-userdata>`: Bottlerocket 관리자 컨테이너 구성의 base64로 인코딩된 내용입니다. 관리자 컨테이너를 활성화하면 시스템 탐색 및 디버깅을 위해 SSH를 사용하여 Bottlerocket 인스턴스에 연결할 수 있습니다. 필수 설정은 아니지만 용이한 문제 해결을 위해 활성화하는 것이 좋습니다. 관리자 컨테이너를 사용한 인증에 대한 자세한 내용은 [Bottlerocket 관리자 컨테이너 설명서](https://github.com/bottlerocket-os/bottlerocket-admin-container#authenticating-with-the-admin-container)를 참조하세요. 관리자 컨테이너는 예를 들어 SSH 사용자 및 키 입력을 JSON 형식으로 사용합니다.

```
{
  "user": "<ssh-user>",
  "ssh": {
    "authorized-keys": [
      "<ssh-authorized-key>"
    ]
  }
}
```
+  `<base64-encoded-bootstrap-container-userdata>`: Bottlerocket 부트스트랩 컨테이너 구성의 base64로 인코딩된 내용입니다. 구성에 대한 자세한 내용은 [Bottlerocket 부트스트랩 컨테이너 설명서](https://github.com/bottlerocket-os/bottlerocket-bootstrap-container)를 참조하세요. 부트스트랩 컨테이너는 인스턴스를 AWS SSM 관리형 인스턴스로 등록하고 Amazon EKS 클러스터에서 Kubernetes 노드로 조인하는 역할을 합니다. 부트스트랩 컨테이너로 전달되는 사용자 데이터는 이전에 생성한 SSM 하이브리드 활성화 코드 및 ID를 입력으로 수락하는 명령 간접 호출의 형태를 취합니다.

```
eks-hybrid-ssm-setup --activation-id=<activation-id> --activation-code=<activation-code> --region=<region>
```

### IAM Roles Anywhere
<a name="_iam_roles_anywhere"></a>

AWS IAM Roles Anywhere를 자격 증명 공급자로 사용하는 경우 다음 내용이 포함된 `settings.toml` 파일을 생성합니다.

```
[settings.kubernetes]
cluster-name = "<cluster-name>"
api-server = "<api-server-endpoint>"
cluster-certificate = "<cluster-certificate-authority>"
hostname-override = "<hostname>"
provider-id = "eks-hybrid:///<region>/<cluster-name>/<hostname>"
authentication-mode = "aws"
cloud-provider = ""
server-tls-bootstrap = true

[settings.network]
hostname = "<hostname>"

[settings.aws]
region = "<region>"
config = "<base64-encoded-aws-config-file>"

[settings.kubernetes.credential-providers.ecr-credential-provider]
enabled = true
cache-duration = "12h"
image-patterns = [
    "*.dkr.ecr.*.amazonaws.com",
    "*.dkr.ecr.*.amazonaws.com.rproxy.goskope.com.cn",
    "*.dkr.ecr.*.amazonaws.eu",
    "*.dkr.ecr-fips.*.amazonaws.com",
    "*.dkr.ecr-fips.*.amazonaws.eu",
    "public.ecr.aws"
]

[settings.kubernetes.node-labels]
"eks.amazonaws.com/compute-type" = "hybrid"
"eks.amazonaws.com/hybrid-credential-provider" = "iam-ra"

[settings.host-containers.admin]
enabled = true
user-data = "<base64-encoded-admin-container-userdata>"

[settings.bootstrap-containers.eks-hybrid-setup]
mode = "always"
user-data = "<base64-encoded-bootstrap-container-userdata>"
```

자리 표시자를 다음 값으로 바꿉니다.
+  `<cluster-name>`: Amazon ECS 클러스터의 이름입니다.
+  `<api-server-endpoint>`: 클러스터의 API 서버 엔드포인트입니다.
+  `<cluster-certificate-authority>`: 클러스터의 base64로 인코딩된 CA 번들입니다.
+  `<region>`: 클러스터를 호스팅하는 AWS 리전입니다(예: "us-east-1")
+  `<hostname>`: Bottlerocket 인스턴스의 호스트 이름으로, 노드 이름으로도 구성됩니다. 이 이름은 임의의 고유한 값일 수 있지만 [Kubernetes 객체 이름 지정 규칙](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names)을 따라야 합니다. 또한 사용하는 호스트 이름은 64자를 초과할 수 없습니다. 참고: IAM-RA 공급자를 사용하는 경우 하이브리드 노드 IAM 역할의 신뢰 정책을 `"sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}"` 리소스 조건으로 구성했으면 노드 이름은 호스트에서 인증서의 CN과 일치해야 합니다.
+  `<base64-encoded-aws-config-file>`: AWS config 파일의 base64로 인코딩된 내용입니다. 파일의 내용은 다음과 같습니다.

```
[default]
credential_process = aws_signing_helper credential-process --certificate /root/.aws/node.crt --private-key /root/.aws/node.key --profile-arn <profile-arn> --role-arn <role-arn> --trust-anchor-arn <trust-anchor-arn> --role-session-name <role-session-name>
```
+  `<base64-encoded-admin-container-userdata>`: Bottlerocket 관리자 컨테이너 구성의 base64로 인코딩된 내용입니다. 관리자 컨테이너를 활성화하면 시스템 탐색 및 디버깅을 위해 SSH를 사용하여 Bottlerocket 인스턴스에 연결할 수 있습니다. 필수 설정은 아니지만 용이한 문제 해결을 위해 활성화하는 것이 좋습니다. 관리자 컨테이너를 사용한 인증에 대한 자세한 내용은 [Bottlerocket 관리자 컨테이너 설명서](https://github.com/bottlerocket-os/bottlerocket-admin-container#authenticating-with-the-admin-container)를 참조하세요. 관리자 컨테이너는 예를 들어 SSH 사용자 및 키 입력을 JSON 형식으로 사용합니다.

```
{
  "user": "<ssh-user>",
  "ssh": {
    "authorized-keys": [
      "<ssh-authorized-key>"
    ]
  }
}
```
+  `<base64-encoded-bootstrap-container-userdata>`: Bottlerocket 부트스트랩 컨테이너 구성의 base64로 인코딩된 내용입니다. 구성에 대한 자세한 내용은 [Bottlerocket 부트스트랩 컨테이너 설명서](https://github.com/bottlerocket-os/bottlerocket-bootstrap-container)를 참조하세요. 부트스트랩 컨테이너는 인스턴스에서 IAM Roles Anywhere 호스트 인증서 및 인증서 프라이빗 키 파일을 생성하는 역할을 합니다. 그런 다음 `aws_signing_helper`가 Amazon EKS 클러스터로 인증하기 위한 임시 자격 증명을 얻기 위해 사용합니다. 부트스트랩 컨테이너로 전달되는 사용자 데이터는 이전에 생성한 인증서 및 프라이빗 키의 내용을 입력으로 수락하는 명령 간접 호출의 형태를 취합니다.

```
eks-hybrid-iam-ra-setup --certificate=<certificate> --key=<private-key>
```

## 2단계: 사용자 데이터로 Bottlerocket vSphere VM 프로비저닝
<a name="_step_2_provision_the_bottlerocket_vsphere_vm_with_user_data"></a>

TOML 파일을 구성했으면 vSphere VM 생성 중에 이 파일을 사용자 데이터로 전달합니다. VM이 처음 켜지기 전에 사용자 데이터가 구성되어 있어야 합니다. 따라서 인스턴스를 생성할 때 사용자 데이트를 제공해야 합니다. VM을 미리 생성하려는 경우에는 사용자 데이터를 구성할 때까지 VM이 poweredOff 상태여야 합니다. 예를 들어 `govc` CLI를 사용하는 경우:

### 처음으로 VM 생성
<a name="_creating_vm_for_the_first_time"></a>

```
govc vm.create \
  -on=true \
  -c=2 \
  -m=4096 \
  -net.adapter=<network-adapter> \
  -net=<network-name> \
  -e guestinfo.userdata.encoding="base64" \
  -e guestinfo.userdata="$(base64 -w0 settings.toml)" \
  -template=<template-name> \
  <vm-name>
```

### 기존 VM의 사용자 데이터 업데이트
<a name="_updating_user_data_for_an_existing_vm"></a>

```
govc vm.create \
    -on=false \
    -c=2 \
    -m=4096 \
    -net.adapter=<network-adapter> \
    -net=<network-name> \
    -template=<template-name> \
    <vm-name>

govc vm.change
    -vm <vm-name> \
    -e guestinfo.userdata="$(base64 -w0 settings.toml)" \
    -e guestinfo.userdata.encoding="base64"

govc vm.power -on <vm-name>
```

위 섹션에서 `-e guestinfo.userdata.encoding="base64"` 옵션은 사용자 데이터가 base64로 인코딩되도록 지정합니다. `-e guestinfo.userdata` 옵션은 `settings.toml` 파일의 base64로 인코딩된 내용을 사용자 데이터로 Bottlerocket 인스턴스에 전달합니다. 자리 표시자를 Bottlerocket OVA 템플릿 및 네트워킹 세부 정보와 같은 특정 값으로 바꿉니다.

## 3단계: 하이브리드 노드 연결 확인
<a name="_step_3_verify_the_hybrid_node_connection"></a>

Bottlerocket 인스턴스가 시작되면 Amazon EKS 클러스터에 조인을 시도합니다. 클러스터의 컴퓨팅 탭으로 이동하거나 다음 명령을 실행하여 Amazon EKS 콘솔에서 연결을 확인할 수 있습니다.

```
kubectl get nodes
```

**중요**  
노드의 상태는 `Not Ready`이며, 이는 하이브리드 노드에서 실행되는 CNI가 없기 때문에 이러한 상태가 예상됩니다. 노드가 클러스터에 조인하지 않은 경우 [하이브리드 노드 문제 해결](hybrid-nodes-troubleshooting.md) 섹션을 참조하세요.

## 4단계: 하이브리드 노드에 대한 CNI 구성
<a name="_step_4_configure_a_cni_for_hybrid_nodes"></a>

하이브리드 노드가 애플리케이션을 실행할 수 있게 하려면 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)의 단계를 계속합니다.

# 클러스터의 하이브리드 노드 업그레이드
<a name="hybrid-nodes-upgrade"></a>

하이브리드 노드 업그레이드 지침은 Amazon EC2에서 실행되는 자체 관리형 Amazon EKS 노드와 유사합니다. 대상 Kubernetes 버전에서 새 하이브리드 노드를 생성하고, 기존 애플리케이션을 새 Kubernetes 버전의 하이브리드 노드로 정상적으로 마이그레이션하고, 클러스터에서 이전 Kubernetes 버전의 하이브리드 노드를 제거하는 것이 좋습니다. 업그레이드를 시작하기 전에 업그레이드에 대한 [Amazon EKS 모범 사례](https://docs.aws.amazon.com/eks/latest/best-practices/cluster-upgrades.html)를 검토해야 합니다. Amazon EKS Hybrid Nodes는 표준 및 확장 지원을 포함하여클라우드 노드가 있는 Amazon EKS 클러스터에 대해 동일한 [Kubernetes 버전 지원](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)을 제공합니다.

Amazon EKS Hybrid Nodes는 노드에 대해 업스트림 Kubernetes와 동일한 [버전 스큐 정책](https://kubernetes.io/releases/version-skew-policy/#supported-version-skew)을 따릅니다. Amazon EKS Hybrid Nodes는 Amazon EKS 컨트롤 플레인보다 최신 버전일 수 없으며, 하이브리드 노드는 Amazon EKS 컨트롤 플레인 마이너 버전보다 최대 3개의 Kubernetes 마이너 버전일 수 있습니다.

전환 마이그레이션 업그레이드 전략을 위해 대상 Kubernetes 버전에 새 하이브리드 노드를 생성할 예비 용량이 없는 경우 Amazon EKS Hybrid Nodes CLI(`nodeadm`)를 사용하여 하이브리드 노드의 Kubernetes 버전을 업그레이드할 수 있습니다.

**중요**  
`nodeadm`을 사용하여 하이브리드 노드를 현재 상태로 업그레이드하는 경우 이전 버전의 Kubernetes 구성 요소가 종료되고 새 Kubernetes 버전 구성 요소가 설치 및 시작되는 프로세스 중에 노드에 대한 가동 중지가 발생합니다.

## 사전 조건
<a name="_prerequisites"></a>

업그레이드하기 전에 다음 사전 조건을 완료했는지 확인합니다.
+ 하이브리드 노드 업그레이드의 대상 Kubernetes 버전은 Amazon EKS 컨트롤 플레인 버전과 같거나 낮아야 합니다.
+ 전환 마이그레이션 업그레이드 전략을 따르는 경우 대상 Kubernetes 버전에 설치 중인 새 하이브리드 노드가 [하이브리드 노드에 대한 사전 조건 설정](hybrid-nodes-prereqs.md) 요구 사항을 충족해야 합니다. 여기에는 Amazon EKS 클러스터 생성 중에 전달한 원격 노드 네트워크 CIDR 내에 IP 주소가 있는 것이 포함됩니다.
+ 전환 마이그레이션과 인플레이스 업그레이드의 경우 하이브리드 노드는 하이브리드 노드 종속성의 새 버전을 가져오는 데 [필요한 도메인](hybrid-nodes-networking.md#hybrid-nodes-networking-on-prem)에 액세스할 수 있어야 합니다.
+ Amazon EKS Kubernetes API 엔드포인트와 상호 작용하는 데 사용 중인 로컬 시스템 또는 인스턴스에 kubectl이 설치되어 있어야 합니다.
+ CNI 버전은 업그레이드하려는 Kubernetes 버전을 지원해야 합니다. 그렇지 않은 경우 하이브리드 노드를 업그레이드하기 전에 CNI 버전을 업그레이드합니다. 자세한 정보는 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)을 참조하세요.

## 전환 마이그레이션(블루-그린) 업그레이드
<a name="hybrid-nodes-upgrade-cutover"></a>

 *전환 마이그레이션 업그레이드*는 대상 Kubernetes 버전을 사용하여 새 호스트에서 새 하이브리드 노드를 생성하고, 기존 애플리케이션을 대상 Kubernetes 버전의 새 하이브리드 노드로 정상적으로 마이그레이션하고, 클러스터에서 이전 Kubernetes 버전의 하이브리드 노드를 제거하는 프로세스를 나타냅니다. 이 전략을 블루-그린 마이그레이션이라고도 합니다.

1. [하이브리드 노드 연결](hybrid-nodes-join.md) 단계에 따라 새 호스트를 하이브리드 노드로 연결합니다. `nodeadm install` 명령을 실행할 때 대상 Kubernetes 버전을 사용합니다.

1. 대상 Kubernetes 버전의 새 하이브리드 노드와 이전 Kubernetes 버전의 하이브리드 노드 간에 통신을 활성화합니다. 이 구성을 사용하면 워크로드를 대상 Kubernetes 버전의 하이브리드 노드로 마이그레이션하는 동안 포드가 서로 통신할 수 있습니다.

1. 대상 Kubernetes 버전의 하이브리드 노드가 클러스터에 성공적으로 조인되었고 준비됨 상태인지 확인합니다.

1. 다음 명령을 사용하여 제거하려는 각 노드를 예약 불가로 표시합니다. 이는 바꾸고 있는 노드에서 새 포드가 예약되거나 다시 예약되지 않도록 하기 위한 것입니다. 자세한 내용은 Kubernetes 문서의 [kubectl cordon](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_cordon/)을 참조하세요. `NODE_NAME`을 이전 Kubernetes 버전의 하이브리드 노드 이름으로 바꿉니다.

   ```
   kubectl cordon NODE_NAME
   ```

   다음 코드 조각을 사용하여 특정 Kubernetes 버전(이 경우 `1.28`)의 모든 노드를 식별하고 연결할 수 있습니다.

   ```
   K8S_VERSION=1.28
   for node in $(kubectl get nodes -o json | jq --arg K8S_VERSION "$K8S_VERSION" -r '.items[] | select(.status.nodeInfo.kubeletVersion | match("\($K8S_VERSION)")).metadata.name')
   do
       echo "Cordoning $node"
       kubectl cordon $node
   done
   ```

1. 현재 배포가 하이브리드 노드에서 2개 미만의 CoreDNS 복제본을 실행하고 있는 경우, 배포를 복제본 2개 이상으로 확장합니다. 정상 작업 중에 복원력을 위해 하이브리드 노드에서 최소 2개의 CoreDNS 복제본을 실행하는 것이 좋습니다.

   ```
   kubectl scale deployments/coredns --replicas=2 -n kube-system
   ```

1. 다음 명령을 사용하여 클러스터에서 제거할 기존 Kubernetes 버전의 각 하이브리드 노드를 드레이닝합니다. 노드 드레이닝에 대한 자세한 내용은 Kubernetes 설명서의 [Safely Drain a Node](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/)을 참조하세요. `NODE_NAME`을 이전 Kubernetes 버전의 하이브리드 노드 이름으로 바꿉니다.

   ```
   kubectl drain NODE_NAME --ignore-daemonsets --delete-emptydir-data
   ```

   다음 코드 조각을 사용하여 특정 Kubernetes 버전(이 경우 `1.28`)의 모든 노드를 식별하고 드레이닝할 수 있습니다.

   ```
   K8S_VERSION=1.28
   for node in $(kubectl get nodes -o json | jq --arg K8S_VERSION "$K8S_VERSION" -r '.items[] | select(.status.nodeInfo.kubeletVersion | match("\($K8S_VERSION)")).metadata.name')
   do
       echo "Draining $node"
       kubectl drain $node --ignore-daemonsets --delete-emptydir-data
   done
   ```

1. `nodeadm`을 사용하여 호스트에서 하이브리드 노드 아티팩트를 중지하고 제거할 수 있습니다. root/sudo 권한이 있는 사용자와 함께 `nodeadm`을 실행해야 합니다. 노드에 포드가 남아 있는 경우 기본적으로 `nodeadm uninstall`이 진행되지 않습니다. 자세한 내용은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md)을 참조하세요.

   ```
   nodeadm uninstall
   ```

1. 하이브리드 노드 아티팩트가 중지 및 제거된 상태에서, 클러스터에서 노드 리소스를 제거합니다.

   ```
   kubectl delete node node-name
   ```

   다음 코드 조각을 사용하여 특정 Kubernetes 버전(이 경우 `1.28`)의 모든 노드를 식별하고 삭제할 수 있습니다.

   ```
   K8S_VERSION=1.28
   for node in $(kubectl get nodes -o json | jq --arg K8S_VERSION "$K8S_VERSION" -r '.items[] | select(.status.nodeInfo.kubeletVersion | match("\($K8S_VERSION)")).metadata.name')
   do
       echo "Deleting $node"
       kubectl delete node $node
   done
   ```

1. CNI 선택에 따라 위의 단계를 실행한 후 하이브리드 노드에 아티팩트가 남아 있을 수 있습니다. 자세한 정보는 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)을 참조하세요.

## 인플레이스 업그레이드
<a name="hybrid-nodes-upgrade-inplace"></a>

인플레이스 업그레이드 프로세스는 `nodeadm upgrade`를 사용하여 새로운 물리적 또는 가상 호스트 및 전환 마이그레이션 전략을 사용하지 않고 하이브리드 노드용 Kubernetes 버전을 업그레이드하는 것을 말합니다. 이 `nodeadm upgrade` 프로세스는 하이브리드 노드에서 실행되는 기존 구형 Kubernetes 구성 요소를 종료하고, 기존 구형 Kubernetes 구성 요소를 제거하고, 새 대상 Kubernetes 구성 요소를 설치하고, 새 대상 Kubernetes 구성 요소를 시작합니다. 하이브리드 노드에서 실행되는 애플리케이션에 미치는 영향을 최소화하기 위해 한 번에 하나의 노드를 업그레이드하는 것이 좋습니다. 이 프로세스의 지속 시간은 네트워크 대역폭 및 지연 시간에 따라 달라집니다.

1. 다음 명령을 사용하여 업그레이드하는 노드를 예약 불가로 표시합니다. 이는 업그레이드하는 노드에서 새 포드가 예약되거나 다시 예약되지 않도록 하기 위한 것입니다. 자세한 내용은 Kubernetes 문서의 [kubectl cordon](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_cordon/)을 참조하세요. `NODE_NAME`을 업그레이드하려는 하이브리드 노드의 이름으로 바꿉니다.

   ```
   kubectl cordon NODE_NAME
   ```

1. 다음 명령을 사용하여 업그레이드하려는 노드를 드레이닝합니다. 노드 드레이닝에 대한 자세한 내용은 Kubernetes 설명서의 [Safely Drain a Node](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/)을 참조하세요. `NODE_NAME`을 업그레이드하려는 하이브리드 노드의 이름으로 바꿉니다.

   ```
   kubectl drain NODE_NAME --ignore-daemonsets --delete-emptydir-data
   ```

1. 업그레이드하려는 하이브리드 노드에서 `nodeadm upgrade`를 실행합니다. root/sudo 권한이 있는 사용자와 함께 `nodeadm`을 실행해야 합니다. 노드 이름은 AWS SSM 및 AWS IAM Roles Anywhere 자격 증명 공급자 모두에 대한 업그레이드를 통해 보존됩니다. 업그레이드 프로세스 중에는 자격 증명 공급자를 변경할 수 없습니다. [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md)의 구성 값은 `nodeConfig.yaml` 섹션을 참조하세요. `K8S_VERSION`을 업그레이드할 대상 Kubernetes 버전으로 바꿉니다.

   ```
   nodeadm upgrade K8S_VERSION -c file://nodeConfig.yaml
   ```

1. 업그레이드한 후 노드에서 포드를 예약하도록 허용하려면 다음을 입력합니다. `NODE_NAME`을 노드의 이름으로 바꿉니다.

   ```
   kubectl uncordon NODE_NAME
   ```

1. 하이브리드 노드의 상태를 확인하고 노드가 종료될 때까지 기다렸다가 준비 상태로 새 Kubernetes 버전에서 다시 시작합니다.

   ```
   kubectl get nodes -o wide -w
   ```

# 하이브리드 노드의 패치 보안 업데이트
<a name="hybrid-nodes-security"></a>

이 주제에서는 하이브리드 노드에서 실행되는 특정 패키지 및 종속성에 대한 보안 업데이트의 실행 중 패치 적용을 수행하는 절차를 설명합니다. 가장 좋은 방법은 하이브리드 노드를 정기적으로 업데이트하여 CVE 및 보안 패치를 받는 것입니다.

Kubernetes 버전을 업그레이드하는 단계는 [클러스터의 하이브리드 노드 업그레이드](hybrid-nodes-upgrade.md) 섹션을 참조하세요.

보안 패치가 필요할 수 있는 소프트웨어의 예로는 `containerd`가 있습니다.

## `Containerd`
<a name="_containerd"></a>

 `containerd`는 EKS Hybrid Nodes의 표준 Kubernetes 컨테이너 런타임 및 핵심 종속성으로, 이미지 가져오기 및 컨테이너 실행 관리를 포함하여 컨테이너 수명 주기를 관리하는 데 사용됩니다. 하이브리드 노드에서는 [nodeadm CLI](https://docs.aws.amazon.com/eks/latest/userguide/hybrid-nodes-nodeadm.html)를 통해 또는 수동으로 `containerd`를 설치할 수 있습니다. 노드의 운영 체제에 따라 `nodeadm`은 OS 배포 패키지 또는 Docker 패키지에서 `containerd`를 설치합니다.

`containerd`의 CVE가 게시되면 하이브리드 노드에서 다음 옵션으로 패치된 버전의 `containerd`로 업그레이드합니다.

## 1단계: 패치가 패키지 관리자에 게시되었는지 확인
<a name="_step_1_check_if_the_patch_published_to_package_managers"></a>

해당 보안 게시판을 참조하여 `containerd` CVE 패치가 각 OS 패키지 관리자에 게시되었는지 확인할 수 있습니다.
+  [Amazon Linux 2023](https://alas.aws.amazon.com/alas2023.html) 
+  [RHEL](https://access.redhat.com/security/security-updates/security-advisories) 
+  [Ubuntu 22.04](https://ubuntu.com/security/notices?order=newest&release=focal) 
+  [Ubuntu 22.04](https://ubuntu.com/security/notices?order=newest&release=jammy) 
+  [Ubuntu 24.04](https://ubuntu.com/security/notices?order=newest&release=noble) 

Docker 리포지토리를 `containerd`의 소스로 사용하는 경우 [Docker 보안 공지](https://docs.docker.com/security/security-announcements/)를 확인하여 Docker 리포지토리에서 패치된 버전의 가용성을 식별할 수 있습니다.

## 2단계: 패치를 설치할 방법 선택
<a name="_step_2_choose_the_method_to_install_the_patch"></a>

노드에 보안 업그레이드를 패치하고 설치하는 세 가지 방법이 있습니다. 사용할 수 있는 방법은 패키지 관리자의 운영 체제에서 패치가 제공되는지 여부에 따라 다릅니다.

1. 패키지 관리자에 게시되는 `nodeadm upgrade`를 사용하여 패치를 설치합니다. [2단계 a](#hybrid-nodes-security-nodeadm)를 참조하세요.

1. 패키지 관리자를 사용하여 패치를 직접 설치합니다. [2단계 b](#hybrid-nodes-security-package)를 참조하세요.

1. 패키지 관리자에 게시되지 않은 사용자 지정 패치를 설치합니다. `containerd`의 사용자 지정 패치에는 특별한 고려 사항이 있습니다. [2단계 c](#hybrid-nodes-security-manual)를 참조하세요.

## 2단계 a: `nodeadm upgrade`를 사용하여 패치 적용
<a name="hybrid-nodes-security-nodeadm"></a>

`containerd` CVE 패치가 OS 또는 Docker 리포지토리(Apt 또는 RPM)에 게시되었는지 확인한 후 `nodeadm upgrade` 명령을 사용하여 `containerd`의 최신 버전으로 업그레이드할 수 있습니다. Kubernetes 버전 업그레이드가 아니므로 현재 Kubernetes 버전을 `nodeadm` 업그레이드 명령에 전달해야 합니다.

```
nodeadm upgrade K8S_VERSION --config-source file:///root/nodeConfig.yaml
```

## 2단계 b: 운영 체제 패키지 관리자로 패치 적용
<a name="hybrid-nodes-security-package"></a>

아니면 해당 패키지 관리자를 통해 업데이트하고 이를 사용하여 다음과 같이 `containerd` 패키지를 업그레이드할 수도 있습니다.

 **Amazon Linux 2023** 

```
sudo yum update -y
sudo yum install -y containerd
```

 **RHEL** 

```
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo yum update -y
sudo yum install -y containerd
```

 **Ubuntu** 

```
sudo mkdir -p /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update -y
sudo apt install -y --only-upgrade containerd.io
```

## 2단계 c: 패키지 관리자에 `Containerd` CVE 패치가 게시되지 않음
<a name="hybrid-nodes-security-manual"></a>

GitHub 릴리스와 같이 패키지 관리자가 아닌 다른 방법으로만 패치 적용된 `containerd` 버전이 제공된 경우 공식 GitHub 사이트에서 `containerd`를 설치할 수 있습니다.

1. 머신이 이미 클러스터에 하이브리드 노드로 조인한 경우 `nodeadm uninstall` 명령을 실행해야 합니다.

1. 공식 `containerd` 바이너리를 설치합니다. GitHub에서 단계 [공식 설치 단계](https://github.com/containerd/containerd/blob/main/docs/getting-started.md#option-1-from-the-official-binaries)를 사용할 수 있습니다.

1. `--containerd-source` 인수가 `none`로 설정된 상태에서 `nodeadm install` 명령을 실행하면 `nodeadm`를 통해 `containerd` 설치를 건너뜁니다. 노드가 실행 중인 모든 운영 체제에 대해 `containerd` 소스의 `none` 값을 사용할 수 있습니다.

   ```
   nodeadm install K8S_VERSION --credential-provider CREDS_PROVIDER --containerd-source none
   ```

# 하이브리드 노드 제거
<a name="hybrid-nodes-remove"></a>

이 주제에서는 Amazon EKS 클러스터에서 하이브리드 노드를 삭제하는 방법을 설명합니다. [kubectl](https://kubernetes.io/docs/reference/kubectl/)과 같은 Kubernetes 호환 도구를 선택하여 하이브리드 노드를 삭제해야 합니다. 노드 객체가 Amazon EKS 클러스터에서 제거되면 하이브리드 노드에 대한 요금 부과가 중지됩니다. 하이브리드 노드 요금에 대한 자세한 내용은 [Amazon EKS Pricing](https://aws.amazon.com/eks/pricing/)을 참조하세요.

**중요**  
노드를 제거하면 노드에서 실행되는 워크로드가 중단됩니다. 하이브리드 노드를 삭제하기 전에 먼저 노드를 드레이닝하여 포드를 다른 활성 노드로 이동하는 것이 좋습니다. 노드 드레이닝에 대한 자세한 내용은 Kubernetes 설명서의 [Safely Drain a Node](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/)을 참조하세요.

Amazon EKS 클러스터의 Kubernetes API 엔드포인트와 상호 작용하는 데 사용하는 로컬 시스템 또는 인스턴스에서 아래 kubectl 단계를 실행합니다. 특정 `kubeconfig` 파일을 사용하는 경우 `--kubeconfig` 플래그를 사용합니다.

## 1단계: 노드 나열
<a name="_step_1_list_your_nodes"></a>

```
kubectl get nodes
```

## 2단계: 노드 드레이닝
<a name="_step_2_drain_your_node"></a>

`kubectl drain` 명령에 대한 자세한 내용은 Kubernetes 설명서의 [kubectl drain](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_drain/)을 참조하세요.

```
kubectl drain --ignore-daemonsets <node-name>
```

## 3단계: 하이브리드 노드 아티팩트 중지 및 제거
<a name="_step_3_stop_and_uninstall_hybrid_nodes_artifacts"></a>

Amazon EKS Hybrid Nodes CLI(`nodeadm`)를 사용하여 호스트에서 하이브리드 노드 아티팩트를 중지하고 제거할 수 있습니다. root/sudo 권한이 있는 사용자와 함께 `nodeadm`을 실행해야 합니다. 노드에 포드가 남아 있는 경우 기본적으로 `nodeadm uninstall`이 진행되지 않습니다. AWS Systems Manager(SSM)를 자격 증명 공급자로 사용하는 경우 `nodeadm uninstall` 명령은 호스트를 AWS SSM 관리형 인스턴스로 등록 취소합니다. 자세한 내용은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md) 섹션을 참조하세요.

```
nodeadm uninstall
```

## 4단계: 클러스터에서 노드 삭제
<a name="_step_4_delete_your_node_from_the_cluster"></a>

하이브리드 노드 아티팩트가 중지 및 제거된 상태에서, 클러스터에서 노드 리소스를 제거합니다.

```
kubectl delete node <node-name>
```

## 5단계: 남은 아티팩트 확인
<a name="_step_5_check_for_remaining_artifacts"></a>

CNI 선택에 따라 위의 단계를 실행한 후 하이브리드 노드에 아티팩트가 남아 있을 수 있습니다. 자세한 내용은 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)를 참조하세요.

# 하이브리드 노드에 대한 애플리케이션 네트워킹, 추가 기능 및 웹후크 구성
<a name="hybrid-nodes-configure"></a>

하이브리드 노드용 EKS 클러스터를 생성한 후 애플리케이션 네트워킹을 위한 추가 기능(CNI, BGP, Ingress, 로드 밸런싱, 네트워크 정책), 추가 기능, 웹후크 및 프록시 설정을 위한 추가 기능을 구성합니다. 하이브리드 노드와 호환되는 EKS 및 커뮤니티 추가 기능의 전체 목록은 [하이브리드 노드에 대한 추가 기능 구성](hybrid-nodes-add-ons.md) 섹션을 참조하세요.

 **EKS 클러스터 인사이트** EKS에는 클러스터 또는 워크로드의 기능을 손상시킬 수 있는 하이브리드 노드 설정의 잘못된 구성에 대한 인사이트 검사가 포함됩니다. 클러스터 인사이트에 대한 자세한 내용은 [클러스터 인사이트를 사용한 Kubernetes 버전 업그레이드 준비 및 잘못된 구성 문제 해결](cluster-insights.md) 섹션을 참조하세요.

다음은 하이브리드 노드에서 사용할 수 있는 일반적인 기능 및 추가 기능입니다.
+  **CNI(컨테이너 네트워킹 인터페이스)**: AWS는 하이브리드 노드의 CNI로 [Cilium](https://docs.cilium.io/en/stable/index.html)을 지원합니다. 자세한 내용은 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md) 섹션을 참조하세요. AWS VPC CNI는 하이브리드 노드와 함께 사용할 수 없습니다.
+  **CoreDNS 및 `kube-proxy`**: CoreDNS 및 `kube-proxy`는 하이브리드 노드가 EKS 클러스터에 조인할 때 자동으로 설치됩니다. 이러한 추가 기능은 클러스터 생성 후 EKS 추가 기능으로 관리할 수 있습니다.
+  **Ingress 및 로드 밸런싱**: 하이브리드 노드에서 실행되는 워크로드에 대해 대상 유형이 `ip`인 AWS Load Balancer Controller 및 ALB(Application Load Balancer) 또는 NLB(Network Load Balancer)를 사용할 수 있습니다. AWS는 하이브리드 노드에서 실행되는 워크로드에 대해 Cilium의 내장 Ingress, Gateway 및 Kubernetes Service 로드 밸런싱 기능을 지원합니다. 자세한 내용은 [하이브리드 노드에 대한 Kubernetes Ingress 구성](hybrid-nodes-ingress.md) 및 [하이브리드 노드에 대한 LoadBalancer 유형의 Service 구성](hybrid-nodes-load-balancing.md)(을)를 참조하세요.
+  **지표**: 하이브리드 노드에서 Amazon Managed Service for Prometheus(AMP) 에이전트 없는 스크레이퍼, AWS Distro for Open Telemetry(ADOT), Amazon CloudWatch 관찰성 에이전트를 사용할 수 있습니다. 하이브리드 노드의 포드 지표에 AMP 에이전트 없는 스크레이퍼를 사용하려면 EKS 클러스터에 사용하는 VPC에서 포드에 액세스할 수 있어야 합니다.
+  **로그**: 하이브리드 노드 지원 클러스터에 대해 EKS 컨트롤 플레인 로깅을 활성화할 수 있습니다. 하이브리드 노드 및 포드 로깅에 ADOT EKS 추가 기능과 Amazon CloudWatch 관찰성 에이전트 EKS 추가 기능을 사용할 수 있습니다.
+  **Pod Identity 및 IRSA**: 하이브리드 노드에서 실행되는 애플리케이션과 함께 EKS Pod Identity와 서비스 계정에 대한 IAM 역할(IRSA)을 사용하여 다른 AWS 서비스의 하이브리드 노드에서 실행되는 포드에 대한 세분화된 액세스를 활성화할 수 있습니다.
+  **웹후크**: 웹후크를 실행하는 경우 온프레미스 포드 네트워크를 라우팅할 수 없을 때 선택적으로 클라우드 노드에서 웹후크를 실행하기 위한 고려 사항 및 단계는 [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md) 섹션을 참조하세요.
+  **프록시**: 데이터 센터 또는 엣지 환경에서 나가는 트래픽에 대해 온프레미스 환경에서 프록시 서버를 사용하는 경우 프록시 서버를 사용하도록 하이브리드 노드 및 클러스터를 구성할 수 있습니다. 자세한 내용은 [하이브리드 노드용 프록시 구성](hybrid-nodes-proxy.md) 섹션을 참조하세요.

**Topics**
+ [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)
+ [하이브리드 노드에 대한 추가 기능 구성](hybrid-nodes-add-ons.md)
+ [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md)
+ [하이브리드 노드용 프록시 구성](hybrid-nodes-proxy.md)
+ [하이브리드 노드에 대한 Cilium BGP 구성](hybrid-nodes-cilium-bgp.md)
+ [하이브리드 노드에 대한 Kubernetes Ingress 구성](hybrid-nodes-ingress.md)
+ [하이브리드 노드에 대한 LoadBalancer 유형의 Service 구성](hybrid-nodes-load-balancing.md)
+ [하이브리드 노드에 대한 Kubernetes 네트워크 정책 구성](hybrid-nodes-network-policies.md)

# 하이브리드 노드에 대한 CNI 구성
<a name="hybrid-nodes-cni"></a>

Cilium은 Amazon EKS Hybrid Nodes용 AWS 지원 CNI(컨테이너 네트워킹 인터페이스)입니다. 워크로드에 대비하려면 하이브리드 노드용 CNI를 설치해야 합니다. 하이브리드 노드는 CNI가 실행될 때까지 `Not Ready` 상태로 표시됩니다. Helm과 같은 도구를 선택하여 이러한 CNI를 관리할 수 있습니다. 이 페이지의 지침에서는 Cilium 수명 주기 관리(설치, 업그레이드, 삭제)를 설명합니다. Ingress, 로드 밸런싱 운영 모범 사례 및 네트워크 정책에 맞게 Cilium을 구성하는 방법은 [Cilium Ingress 및 Cilium Gateway 개요](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium), [Service 유형 LoadBalancer](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium-loadbalancer) 및 [하이브리드 노드에 대한 Kubernetes 네트워크 정책 구성](hybrid-nodes-network-policies.md) 섹션을 참조하세요.

Cilium은 AWS 클라우드의 노드에서 실행할 때 AWS에서 지원되지 않습니다. Amazon VPC CNI는 하이브리드 노드와 호환되지 않으며 VPC CNI는 `eks.amazonaws.com/compute-type: hybrid` 레이블에 대한 반선호도로 구성됩니다.

이 페이지에 있었던 Calico 문서는 [EKS Hybrid 예시 리포지토리](https://github.com/aws-samples/eks-hybrid-examples)로 옮겨졌습니다.

## 버전 호환성
<a name="hybrid-nodes-cilium-version-compatibility"></a>

Amazon EKS에서 지원되는 모든 Kubernetes 버전에서 EKS 하이브리드 노드에 대해 Cilium 버전 `v1.17.x` 및 `v1.18.x`가 지원됩니다.

**참고**  
 **Cilium v1.18.3 커널 요구 사항**: 커널 요구 사항(Linux 커널 5.10 이상)으로 인해 Cilium v1.18.3은 다음에서 지원되지 않습니다.
+ Ubuntu 20.04
+ Red Hat Enterprise Linux(RHEL) 8

시스템 요구 사항은 [Cilium 시스템 요구 사항](https://docs.cilium.io/en/stable/operations/system_requirements/)을 참조하세요.

Amazon EKS에서 지원되는 Kubernetes 버전 목록은 [Kubernetes 버전 지원](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)을 참조하세요. EKS Hybrid Nodes는 클라우드 노드가 있는 Amazon EKS 클러스터와 동일한 Kubernetes 버전 지원을 제공합니다.

## 지원되는 기능
<a name="hybrid-nodes-cilium-support"></a>

 AWS는 오픈 소스 [Cilium 프로젝트](https://github.com/cilium/cilium)를 기반으로 하는 Cilium for EKS Hybrid Nodes 빌드를 유지 관리합니다. Cilium에 대한 AWS의 지원을 받으려면 AWS에서 유지 관리하는 Cilium 빌드 및 지원되는 Cilium 버전을 사용해야 합니다.

 AWS는 EKS Hybrid Nodes에서 사용할 수 있는 Cilium의 다음 기능에 대한 기본 구성의 기술 지원을 제공합니다. AWS 지원 범위 외에 기능을 사용하려는 경우 해당 플러그인에 대한 대체 상용 지원을 받거나 Cilium 프로젝트의 문제를 해결하고 프로젝트 수정에 기여할 수 있는 전문 지식을 내부적으로 보유하는 것이 좋습니다.


| Cilium 기능 | AWS 지원  | 
| --- | --- | 
|  Kubernetes 네트워크 적합성  |  예  | 
|  코어 클러스터 연결  |  예  | 
|  IP 패밀리  |  IPv4  | 
|  수명 주기 관리  |  Helm  | 
|  네트워킹 모드  |  VXLAN 캡슐화  | 
|  IP 주소 관리(IPAM)  |  Cilium IPAM 클러스터 범위  | 
|  정책 네트워크  |  Kubernetes 네트워크 정책  | 
|  Border Gateway Protocol(BGP)  |  Cilium BGP Control Plane  | 
|  Kubernetes Ingress  |  Cilium Ingress, Cilium Gateway  | 
|  Service LoadBalancer IP 할당  |  Cilium Load Balancer IPAM  | 
|  Service LoadBalancer IP 주소 알림  |  Cilium BGP Control Plane  | 
|  kube-proxy 대체  |  예  | 

## Cilium 고려 사항
<a name="hybrid-nodes-cilium-considerations"></a>
+  **Helm 리포지토리** - AWS는 [Amazon EKS Cilium/Cilium](https://gallery.ecr.aws/eks/cilium/cilium)의 Amazon Elastic Container Registry Public(Amazon ECR Public)에서 Cilium Helm 차트를 호스팅합니다. 사용 가능한 버전으로 다음이 포함됩니다.
  + Cilium v1.17.9: `oci://public.ecr.aws/eks/cilium/cilium:1.17.9-0` 
  + Cilium v1.18.3: `oci://public.ecr.aws/eks/cilium/cilium:1.18.3-0` 

    이 주제의 명령에서는 이 리포지토리를 사용합니다. Amazon ECR Public의 Helm 리포지토리에는 특정 `helm repo` 명령이 유효하지 않으므로 로컬 Helm 리포지토리 이름에서 이 리포지토리를 참조할 수 없습니다. 대신 대부분의 명령에서 전체 URI를 사용합니다.
+ 기본적으로 Cilium은 [캡슐화 방법](https://docs.cilium.io/en/stable/network/concepts/routing/#encapsulation)으로 VXLAN을 사용하여 오버레이/터널 모드에서 실행되도록 구성됩니다. 이 모드는 기본 물리적 네트워크에 대한 요구 사항이 가장 적습니다.
+ 기본적으로 Cilium은 클러스터를 떠나는 모든 포드 트래픽의 소스 IP 주소를 노드의 IP 주소로 [매스커레이딩](https://docs.cilium.io/en/stable/network/concepts/masquerading/)합니다. 매스커레이딩을 비활성화하면 포드 CIDR은 온프레미스 네트워크에서 라우팅 가능해야 합니다.
+ 하이브리드 노드에서 웹후크를 실행하는 경우 포드 CIDR이 온프레미스 네트워크에서 라우팅 가능해야 합니다. 온프레미스 네트워크에서 포드 CIDR이 라우팅 가능하지 않은 경우 동일한 클러스터의 클라우드 노드에서 웹후크를 실행하는 것이 좋습니다. 자세한 내용은 [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md) 및 [하이브리드 노드용 네트워킹 준비](hybrid-nodes-networking.md) 섹션을 참조하세요.
+  AWS에서는 포드 CIDR이 온프레미스 네트워크에서 라우팅 가능하도록 Cilium의 내장 BGP 기능을 사용할 것을 권장합니다. 하이브리드 노드에서 Cilium BGP를 구성하는 방법에 대한 자세한 내용은 [하이브리드 노드에 대한 Cilium BGP 구성](hybrid-nodes-cilium-bgp.md) 섹션을 참조하세요.
+ Cilium의 기본 IP Address Management(IPAM)를 [Cluster Scope](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/)라고 하며, 여기서 Cilium 연산자는 사용자가 구성한 포드 CIDR을 기반으로 각 노드에 IP 주소를 할당합니다.

## 하이브리드 노드에 Cilium 설치
<a name="hybrid-nodes-cilium-install"></a>

### 절차
<a name="_procedure"></a>

1. `cilium-values.yaml`이라는 YAML 파일을 생성합니다. 다음 예시에서는 Cilium 에이전트 및 운영자에서 `eks.amazonaws.com/compute-type: hybrid` 레이블에 대한 선호도를 설정하여 하이브리드 노드에서만 실행되도록 Cilium을 구성합니다.
   + EKS 클러스터의 *원격 포드 네트워크*에 대해 구성한 것과 동일한 포드 CIDR로 `clusterPoolIpv4PodCIDRList`를 구성합니다. 예를 들어 `10.100.0.0/24`입니다. Cilium 운영자는 구성된 `clusterPoolIpv4PodCIDRList` IP 공간 내에서 IP 주소 조각을 할당합니다. 포드 CIDR이 온프레미스 노드 CIDR, VPC CIDR 또는 Kubernetes 서비스 CIDR과 겹치면 안 됩니다.
   + 노드당 필요한 포드를 기반으로 `clusterPoolIpv4MaskSize`를 구성합니다. 예를 들어, `25`로 구성하면 노드당 128개 포드의 세그먼트 크기는 /25가 됩니다.
   + 클러스터에 Cilium을 배포한 후에는 `clusterPoolIpv4PodCIDRList` 또는 `clusterPoolIpv4MaskSize`를 변경하지 마세요. 자세한 내용은 [Expanding the cluster pool](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/#expanding-the-cluster-pool)을 참조하세요.
   + kube-proxy 대체 모드에서 Cilium을 실행하는 경우 Helm 값에 `kubeProxyReplacement: "true"`를 설정하고 Cilium과 동일한 노드에서 실행 중인 기존 kube-proxy 배포가 없는지 확인합니다.
   + 아래 예시에서는 Cilium이 L7 네트워크 정책 및 수신에 사용하는 Envoy L7(계층 7) 프록시를 비활성화합니다. 자세한 내용은 [하이브리드 노드에 대한 Kubernetes 네트워크 정책 구성](hybrid-nodes-network-policies.md) 및 [Cilium Ingress 및 Cilium Gateway 개요](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium)(을)를 참조하세요.
   + 아래 예시에서는 서비스에 대해 구성한 경우 서비스 트래픽 분산이 올바르게 작동하도록 `loadBalancer.serviceTopology`를 `true`로 구성합니다. 자세한 내용은 [서비스 트래픽 분산 구성](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-service-traffic-distribution) 섹션을 참조하세요.
   + Cilium의 Helm 값 전체 목록은 Cilium 설명서의 [Helm reference](https://docs.cilium.io/en/stable/helm-reference/)를 참조하세요.

     ```
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: eks.amazonaws.com/compute-type
               operator: In
               values:
               - hybrid
     ipam:
       mode: cluster-pool
       operator:
         clusterPoolIPv4MaskSize: 25
         clusterPoolIPv4PodCIDRList:
         - POD_CIDR
     loadBalancer:
       serviceTopology: true
     operator:
       affinity:
         nodeAffinity:
           requiredDuringSchedulingIgnoredDuringExecution:
             nodeSelectorTerms:
             - matchExpressions:
               - key: eks.amazonaws.com/compute-type
                 operator: In
                 values:
                   - hybrid
       unmanagedPodWatcher:
         restart: false
     loadBalancer:
       serviceTopology: true
     envoy:
       enabled: false
     kubeProxyReplacement: "false"
     ```

1. 클러스터에 Cilium을 설치합니다.
   + `CILIUM_VERSION`을 Cilium 버전(예: `1.17.9-0` 또는 `1.18.3-0`)으로 바꾸세요. Cilium 마이너 버전에 대한 최신 패치 버전을 사용하는 것이 좋습니다.
   + 선택한 버전의 커널 요구 사항을 노드가 충족하는지 확인하세요. Cilium v1.18.3에는 Linux 커널 5.10 이상이 필요합니다.
   + 특정 kubeconfig 파일을 사용하는 경우 Helm 설치 명령과 함께 `--kubeconfig` 플래그를 사용합니다.

     ```
     helm install cilium oci://public.ecr.aws/eks/cilium/cilium \
         --version CILIUM_VERSION \
         --namespace kube-system \
         --values cilium-values.yaml
     ```

1. 다음 명령을 사용하여 Cilium 설치가 성공했는지 확인합니다. `cilium-operator` 배포와 각 하이브리드 노드에서 실행 중인 `cilium-agent`가 표시됩니다. 또한 하이브리드 노드는 이제 `Ready` 상태여야 합니다. 온프레미스 네트워크에 포드 CIDR을 알리도록 Cilium BGP를 구성하는 방법에 대한 자세한 내용은 [하이브리드 노드에 대한 Cilium BGP 구성](hybrid-nodes-cilium-bgp.md) 섹션을 참조하세요.

   ```
   kubectl get pods -n kube-system
   ```

   ```
   NAME                              READY   STATUS    RESTARTS   AGE
   cilium-jjjn8                      1/1     Running   0          11m
   cilium-operator-d4f4d7fcb-sc5xn   1/1     Running   0          11m
   ```

   ```
   kubectl get nodes
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION
   mi-04a2cf999b7112233   Ready    <none>   19m   v1.31.0-eks-a737599
   ```

## 하이브리드 노드에서 Cilium 업그레이드
<a name="hybrid-nodes-cilium-upgrade"></a>

Cilium 배포를 업그레이드하기 전에 [Cilium 업그레이드 설명서](https://docs.cilium.io/en/v1.17/operations/upgrade/)와 업그레이드 정보를 주의 깊게 검토하여 대상 Cilium 버전의 변경 사항을 이해합니다.

1. 명령줄 환경에 `helm` CLI를 설치했는지 확인합니다. 설치 지침은 [Helm 설명서](https://helm.sh/docs/intro/quickstart/)를 참조하세요.

1. Cilium 업그레이드 사전 검사를 실행합니다. `CILIUM_VERSION`을 대상 Cilium 버전으로 바꿉니다. Cilium 마이너 버전에 대한 최신 패치 버전을 실행하는 것이 좋습니다. 지정된 마이너 Cilium 릴리스에 대한 최신 패치 릴리스는 Cilium 설명서의 [안정적인 릴리스 섹션](https://github.com/cilium/cilium#stable-releases)에서 확인할 수 있습니다.

   ```
   helm install cilium-preflight oci://public.ecr.aws/eks/cilium/cilium --version CILIUM_VERSION \
     --namespace=kube-system \
     --set preflight.enabled=true \
     --set agent=false \
     --set operator.enabled=false
   ```

1. `cilium-preflight.yaml`을 적용한 후 `READY` 포드 수가 실행 중인 Cilium 포드 수와 동일한지 확인합니다.

   ```
   kubectl get ds -n kube-system | sed -n '1p;/cilium/p'
   ```

   ```
   NAME                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
   cilium                    2         2         2       2            2           <none>          1h20m
   cilium-pre-flight-check   2         2         2       2            2           <none>          7m15s
   ```

1. READY 포드 수가 같으면 Cilium 사전 배포도 READY 1/1로 표시되어야 합니다. READY 0/1이 표시되면 업그레이드를 계속하기 전에 [CNP 검증](https://docs.cilium.io/en/v1.17/operations/upgrade/#cnp-validation) 섹션을 참조하고 배포 관련 문제를 해결합니다.

   ```
   kubectl get deployment -n kube-system cilium-pre-flight-check -w
   ```

   ```
   NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
   cilium-pre-flight-check   1/1     1            0           12s
   ```

1. 사전 배포 삭제

   ```
   helm uninstall cilium-preflight --namespace kube-system
   ```

1. `helm upgrade` 명령을 실행하기 전에 `existing-cilium-values.yaml`에서 배포 값을 보존하거나 upgrade 명령을 실행할 때 설정에 `--set` 명령줄 옵션을 사용합니다. 업그레이드 작업은 Cilium ConfigMap을 덮어쓰므로 업그레이드할 때 구성 값을 전달하는 것이 중요합니다.

   ```
   helm get values cilium --namespace kube-system -o yaml > existing-cilium-values.yaml
   ```

1. 정상적인 클러스터 작업 중에는 모든 Cilium 구성 요소가 동일한 버전을 실행해야 합니다. 다음 단계에서는 모든 구성 요소를 하나의 안정적인 릴리스에서 이후 안정적인 릴리스로 업그레이드하는 방법을 설명합니다. 한 마이너 릴리스에서 다른 마이너 릴리스로 업그레이드할 때는 먼저 기존 Cilium 마이너 버전에 대한 최신 패치 릴리스로 업그레이드하는 것이 좋습니다. 중단을 최소화하려면 `upgradeCompatibility` 옵션을 이 클러스터에 설치된 초기 Cilium 버전으로 설정해야 합니다.

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium --version CILIUM_VERSION \
     --namespace kube-system \
     --set upgradeCompatibility=1.X \
     -f existing-cilium-values.yaml
   ```

1. (선택 사항) 문제로 인해 업그레이드를 롤백해야 하는 경우 다음 명령을 실행합니다.

   ```
   helm history cilium --namespace kube-system
   helm rollback cilium [REVISION] --namespace kube-system
   ```

## 하이브리드 노드에서 Cilium 삭제
<a name="hybrid-nodes-cilium-delete"></a>

1. 다음 명령을 실행하여 클러스터에서 모든 Cilium 구성 요소를 제거합니다. 참고로 CNI를 제거하면 노드 및 포드의 상태에 영향을 미칠 수 있으므로 프로덕션 클러스터에서 수행해서는 안 됩니다.

   ```
   helm uninstall cilium --namespace kube-system
   ```

   CNI가 클러스터에서 제거되면 Cilium에서 구성한 인터페이스 및 경로가 기본적으로 제거되지 않습니다. 자세한 내용은 [GitHub issue](https://github.com/cilium/cilium/issues/34289)를 참조하세요.

1. 온디스크 구성 파일 및 리소스를 정리하려면 표준 구성 디렉터리를 사용하는 경우 GitHub의 Cilium 리포지토리에서 [`cni-uninstall.sh` 스크립트](https://github.com/cilium/cilium/blob/main/plugins/cilium-cni/cni-uninstall.sh)에 표시된 대로 파일을 제거할 수 있습니다.

1. 클러스터에서 Cilium 사용자 지정 리소스 정의(CRD)를 제거하려면 다음 명령을 실행할 수 있습니다.

   ```
   kubectl get crds -oname | grep "cilium" | xargs kubectl delete
   ```

# 하이브리드 노드에 대한 추가 기능 구성
<a name="hybrid-nodes-add-ons"></a>

이 페이지에서는 Amazon EKS Hybrid Nodes에서 AWS 추가 기능 및 커뮤니티 추가 기능을 실행하기 위한 고려 사항을 설명합니다. Amazon EKS 추가 기능과 클러스터에서 추가 기능을 생성, 업그레이드, 제거하는 프로세스에 대한 자세한 내용은 [Amazon EKS 추가 기능](eks-add-ons.md) 섹션을 참조하세요. 이 페이지에서 별도로 명시되지 않는 한 Amazon EKS 추가 기능을 생성, 업그레이드, 제거하는 프로세스는 하이브리드 노드가 있는 Amazon EKS 클러스터의 경우 AWS 클라우드에서 실행 중인 노드가 있는 Amazon EKS 클러스터의 경우와 동일합니다. 이 페이지에 포함된 추가 기능만 Amazon EKS Hybrid Nodes와의 호환성이 검증되었습니다.

다음 AWS 추가 기능은 Amazon EKS Hybrid Nodes와 호환됩니다.


|  AWS 추가 기능 | 호환되는 추가 기능 버전 | 
| --- | --- | 
|  kube-proxy  |  v1.25.14-eksbuild.2 이상  | 
|  CoreDNS  |  v1.9.3-eksbuild.7 이상  | 
|   AWS Distro for OpenTelemetry(ADOT)  |  v0.102.1-eksbuild.2 이상  | 
|  CloudWatch Observability Agent  |  v2.2.1-eksbuild.1 이상  | 
|  EKS Pod Identity 에이전트  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/hybrid-nodes-add-ons.html)  | 
|  노드 모니터링 에이전트  |  v1.2.0-eksbuild.1 이상  | 
|  CSI 스냅샷 컨트롤러  |  v8.1.0-eksbuild.1 이상  | 
|   AWS Private CA Connector for Kubernetes  |  v1.6.0-eksbuild.1 이상  | 
|  Amazon FSx CSI 드라이버  |  v1.7.0-eksbuild.1 이상  | 
|   AWS Secrets Store CSI 드라이버 공급자  |  v2.1.1-eksbuild.1 이상  | 

다음 커뮤니티 추가 기능은 Amazon EKS Hybrid Nodes와 호환됩니다. 커뮤니티 추가 기능에 대한 자세한 내용은 [커뮤니티 추가 기능](community-addons.md) 섹션을 참조하세요.


| 커뮤니티 추가 기능 | 호환되는 추가 기능 버전 | 
| --- | --- | 
|  Kubernetes 지표 서버  |  v0.7.2-eksbuild.1 이상  | 
|  cert-manager  |  v1.17.2-eksbuild.1 이상  | 
|  Prometheus 익스포터  |  v1.9.1-eksbuild.2 이상  | 
|  kube-state-metrics  |  v2.15.0-eksbuild.4 이상  | 
|  외부 DNS  |  v0.19.0-eksbuild.1 이상  | 

위의 표에 있는 Amazon EKS 추가 기능 외에도 [Amazon Managed Service for Prometheus Collector](prometheus.md)와 [애플리케이션 수신](alb-ingress.md)(HTTP) 및 [로드 밸런싱](network-load-balancing.md)(TCP/UDP)용 [AWS 로드 밸런서 컨트롤러](aws-load-balancer-controller.md)는 하이브리드 노드와 호환됩니다.

Amazon EKS Hybrid Nodes와 호환되지 않는 AWS 추가 기능 및 커뮤니티 추가 기능이 있습니다. 이러한 추가 기능의 최신 버전에는 하이브리드 노드에 적용되는 기본 `eks.amazonaws.com/compute-type: hybrid` 레이블에 대한 반선호도 규칙이 있습니다. 이렇게 하면 클러스터에 배포할 때 하이브리드 노드에서 실행되지 않습니다. 클러스터에 하이브리드 노드와 AWS 클라우드에서 실행되는 노드가 모두 있는 경우 AWS 클라우드에서 실행되는 노드에 클러스터의 추가 기능을 배포할 수 있습니다. Amazon VPC CNI는 하이브리드 노드와 호환되지 않으며, Cilium 및 Calico는 Amazon EKS Hybrid Nodes용 컨테이너 네트워킹 인터페이스(CNI)로 지원됩니다. 자세한 정보는 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)을 참조하세요.

## AWS 추가 기능
<a name="hybrid-nodes-add-ons-aws-add-ons"></a>

다음 섹션에서는 다른 Amazon EKS 컴퓨팅 유형과 비교하여 하이브리드 노드에서 호환되는 AWS 추가 기능을 실행하는 것의 차이점을 설명합니다.

## kube-proxy 및 CoreDNS
<a name="hybrid-nodes-add-ons-core"></a>

EKS는 AWS CLI를 포함하여 AWS API 및 AWS SDK를 사용하여 EKS 클러스터를 생성할 때 기본적으로 kube-proxy 및 CoreDNS를 자체 관리형 추가 기능으로 설치합니다. 클러스터 생성 후 Amazon EKS 추가 기능으로 이러한 추가 기능을 덮어쓸 수 있습니다. [Amazon EKS 클러스터에서 `kube-proxy` 관리](managing-kube-proxy.md) 및 [Amazon EKS 클러스터에서 DNS에 대한 CoreDNS 관리](managing-coredns.md)에 대한 자세한 내용은 EKS 설명서를 참조하세요. 하이브리드 노드와 AWS 클라우드의 노드가 있는 혼합 모드 클러스터를 실행하는 경우 AWS에서는 하이브리드 노드에는 하나 이상의 CoreDNS 복제본을, AWS 클라우드의 노드에는 하나 이상의 CoreDNS 복제본을 사용하는 것을 권장합니다. 구성 단계는 [CoreDNS 복제본 구성](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-coredns) 섹션을 참조하세요.

## CloudWatch Observability Agent
<a name="hybrid-nodes-add-ons-cw"></a>

CloudWatch Observability Agent 연산자는 [웹후크](https://kubernetes.io/docs/reference/access-authn-authz/webhook/)를 사용합니다. 하이브리드 노드에서 연산자를 실행하는 경우 온프레미스 포드 CIDR은 온프레미스 네트워크에서 라우팅 가능해야 하며 원격 포드 네트워크로 EKS 클러스터를 구성해야 합니다. 자세한 내용은 [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md)을 참조하세요.

[CloudWatch Container Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ContainerInsights.html)가 노드 수준 지표에 대한 [인스턴스 메타데이터 서비스](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)(IMDS)의 가용성에 좌우되기 때문에 노드 수준 지표는 하이브리드 노드에 사용할 수 없습니다. 클러스터, 워크로드, 포드, 컨테이너 수준 지표는 하이브리드 노드에 사용할 수 있습니다.

[Amazon CloudWatch 관찰성을 사용하여 CloudWatch 에이전트 설치](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Observability-EKS-addon.html)에 설명된 단계에 따라 추가 기능을 설치한 후에 추가 기능 매니페스트를 업데이트해야 에이전트가 하이브리드 노드에서 성공적으로 실행될 수 있습니다. 클러스터의 `amazoncloudwatchagents` 리소스를 편집하여 아래와 같이 `RUN_WITH_IRSA` 환경 변수를 추가합니다.

```
kubectl edit amazoncloudwatchagents -n amazon-cloudwatch cloudwatch-agent
```

```
apiVersion: v1
items:
- apiVersion: cloudwatch.aws.amazon.com/v1alpha1
  kind: AmazonCloudWatchAgent
  metadata:
    ...
    name: cloudwatch-agent
    namespace: amazon-cloudwatch
    ...
  spec:
    ...
    env:
    - name: RUN_WITH_IRSA # <-- Add this
      value: "True" # <-- Add this
    - name: K8S_NODE_NAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
          ...
```

## 하이브리드 노드용 Amazon Managed Prometheus 관리형 수집기
<a name="hybrid-nodes-add-ons-amp"></a>

Amazon Managed Service for Prometheus(AMP) 관리형 수집기는 Amazon EKS 클러스터의 리소스에서 지표를 검색하고 수집하는 스크레이퍼로 구성됩니다. AMP가 스크레이퍼를 대신 관리하므로 인스턴스, 에이전트 또는 스크레이퍼를 직접 관리할 필요가 없습니다.

하이브리드 노드에 특정한 추가 구성 없이 AMP 관리형 수집기를 사용할 수 있습니다. 그러나 하이브리드 노드의 애플리케이션에 대한 지표 엔드포인트는 VPC에서 원격 포드 네트워크 CIDR로의 경로와 온프레미스 방화벽에서 열린 포트를 포함하여 VPC에서 연결할 수 있어야 합니다. 또한 클러스터에는 [프라이빗 클러스터 엔드포인트 액세스](cluster-endpoint.md) 권한이 있어야 합니다.

Amazon Managed Service for Prometheus 사용 설명서의 [AWS 관리형 수집기 사용](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-collector-how-to.html)의 단계를 따릅니다.

## AWS Distro for OpenTelemetry(ADOT)
<a name="hybrid-nodes-add-ons-adot"></a>

AWS Distro for OpenTelemetry(ADOT) 추가 기능을 사용하여 하이브리드 노드에서 실행되는 애플리케이션의 지표, 로그 및 추적 데이터를 수집할 수 있습니다. ADOT 연산자는 승인 [웹후크](https://kubernetes.io/docs/reference/access-authn-authz/webhook/)를 사용하여 수집기 사용자 지정 리소스 요청을 변경 및 검증합니다. 하이브리드 노드에서 ADOT 연산자를 실행하는 경우 온프레미스 포드 CIDR은 온프레미스 네트워크에서 라우팅 가능해야 하며 원격 포드 네트워크로 EKS 클러스터를 구성해야 합니다. 자세한 내용은 [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md)을 참조하세요.

*AWS Distro for OpenTelemetry* 설명서의 [EKS 추가 기능을 사용하여 AWS Distro for OpenTelemetry 시작하기](https://aws-otel.github.io/docs/getting-started/adot-eks-add-on)의 단계를 따릅니다.

## AWS 로드 밸런서 컨트롤러
<a name="hybrid-nodes-add-ons-lbc"></a>

하이브리드 노드의 워크로드에 대해 대상 유형이 `ip`인 [AWS Load Balancer Controller](aws-load-balancer-controller.md) 및 ALB(Application Load Balancer) 또는 NLB(Network Load Balancer)를 사용할 수 있습니다. ALB 또는 NLB에서 사용하는 IP 대상은 AWS에서 라우팅 가능해야 합니다. AWS Load Balancer Controller 역시 [웹후크](https://kubernetes.io/docs/reference/access-authn-authz/webhook/)를 사용합니다. 하이브리드 노드에서 AWS Load Balancer Controller 연산자를 실행하는 경우 온프레미스 포드 CIDR은 온프레미스 네트워크에서 라우팅 가능해야 하며 원격 포드 네트워크로 EKS 클러스터를 구성해야 합니다. 자세한 내용은 [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md)을 참조하세요.

AWS 로드 밸런서 컨트롤러를 설치하려면 [AWS Application Load Balancer](hybrid-nodes-ingress.md#hybrid-nodes-ingress-alb) 또는 [AWS Network Load Balancer](hybrid-nodes-load-balancing.md#hybrid-nodes-service-lb-nlb)의 단계를 따릅니다.

ALB로 수신하려면 아래 주석을 지정해야 합니다. 자세한 정보는 [Application Load Balancer를 사용하여 애플리케이션 및 HTTP 트래픽 라우팅](alb-ingress.md)을 참조하세요.

```
alb.ingress.kubernetes.io/target-type: ip
```

NLB로 로드 밸런싱하려면 아래 주석을 지정해야 합니다. 자세한 정보는 [Network Load Balancer를 사용하여 TCP 및 UDP 트래픽 라우팅](network-load-balancing.md)을 참조하세요.

```
service.beta.kubernetes.io/aws-load-balancer-type: "external"
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
```

## EKS Pod Identity 에이전트
<a name="hybrid-nodes-add-ons-pod-id"></a>

**참고**  
Bottlerocket을 실행하는 하이브리드 노드에 EKS Pod Identity Agent 추가 기능을 성공적으로 배포하려면 Bottlerocket 버전이 v1.39.0 이상이어야 합니다. 하이브리드 노드 환경의 이전 Bottlerocket 버전에서는 Pod Identity Agent가 지원되지 않습니다.

원래 Amazon EKS Pod Identity 에이전트 DaemonSet는 노드에서 EC2 IMDS를 사용하여 필요한 AWS ID를 얻습니다. 버전 1.3.3-eksbuild.1부터는 하이브리드 노드에서 IMDS를 사용할 수 없으므로 Pod Identity Agent 추가 기능은 필요한 자격 증명을 탑재하는 DaemonSet를 선택적으로 배포합니다. Bottlerocket을 실행하는 하이브리드 노드는 자격 증명을 탑재하려면 다른 방법이 필요하며, 버전 1.3.7-eksbuild.2부터 Pod Identity Agent 추가 기능은 선택적으로 Bottlerocket 하이브리드 노드를 특별히 대상으로 하는 DaemonSet를 배포합니다. 다음 섹션에서는 선택적 DaemonSets를 활성화하는 프로세스를 설명합니다.

### Ubuntu/RHEL/AL2023
<a name="_ubunturhelal2023"></a>

1. Ubuntu/RHEL/Al2023 하이브리드 노드에서 Pod Identity 에이전트를 사용하려면 아래와 같이 `nodeadm` 구성의 하이브리드 섹션에서 `enableCredentialsFile: true`를 설정합니다.

   ```
   apiVersion: node.eks.aws/v1alpha1
   kind: NodeConfig
   spec:
       hybrid:
           enableCredentialsFile: true # <-- Add this
   ```

   이렇게 하면 `/eks-hybrid/.aws/credentials`에서 노드에 구성할 자격 증명 파일을 생성하도록 `nodeadm`이 구성되며, 이 파일은 `eks-pod-identity-agent` 포드에서 사용됩니다. 이 자격 증명 파일에는 주기적으로 새로 고침되는 임시 AWS 자격 증명이 포함됩니다.

1. *각* 노드에서 `nodeadm` 구성을 업데이트한 후 `nodeConfig.yaml`을 사용하여 다음 `nodeadm init` 명령을 실행하고 하이브리드 노드를 Amazon EKS 클러스터에 조인합니다. 노드가 이전에 클러스터에 조인한 경우 `nodeadm init` 명령을 다시 실행합니다.

   ```
   nodeadm init -c file://nodeConfig.yaml
   ```

1. AWS CLI 또는 AWS Management Console을 사용하여 하이브리드 노드에 대한 지원이 활성화된 상태로 `eks-pod-identity-agent`를 설치합니다.

   1.  AWS CLI: 클러스터 관리에 사용하는 시스템에서 다음 명령을 실행하여 하이브리드 노드에 대한 지원이 활성화된 상태로 `eks-pod-identity-agent`를 설치합니다. `my-cluster`를 클러스터 이름으로 바꿉니다.

      ```
      aws eks create-addon \
          --cluster-name my-cluster \
          --addon-name eks-pod-identity-agent \
          --configuration-values '{"daemonsets":{"hybrid":{"create": true}}}'
      ```

   1.  AWS Management Console: AWS 콘솔을 통해 Pod Identity 에이전트 추가 기능을 설치하는 경우 선택적 구성에 다음을 추가하여 하이브리드 노드를 대상으로 하는 DaemonSet를 배포합니다.

      ```
      {"daemonsets":{"hybrid":{"create": true}}}
      ```

### Bottlerocket
<a name="_bottlerocket"></a>

1. Bottlerocket 하이브리드 노드에서 Pod Identity 에이전트를 사용하려면 [Bottlerocket을 실행하는 하이브리드 노드 연결](hybrid-nodes-bottlerocket.md)에 설명된 대로 Bottlerocket 부트스트랩 컨테이너 사용자 데이터에 사용되는 명령에 `--enable-credentials-file=true` 플래그를 추가합니다.

   1. SSM 자격 증명 공급자를 사용하는 경우 명령은 다음과 같아야 합니다.

      ```
      eks-hybrid-ssm-setup --activation-id=<activation-id> --activation-code=<activation-code> --region=<region> --enable-credentials-file=true
      ```

   1. IAM Roles Anywhere 자격 증명 공급자를 사용하는 경우 명령은 다음과 같아야 합니다.

      ```
      eks-hybrid-iam-ra-setup --certificate=<certificate> --key=<private-key> --enable-credentials-file=true
      ```

      이렇게 하면 `/var/eks-hybrid/.aws/credentials`에서 노드에 구성할 자격 증명 파일을 생성하도록 부트스트랩 스크립트가 구성되며, 이 파일은 `eks-pod-identity-agent` 포드에서 사용됩니다. 이 자격 증명 파일에는 주기적으로 새로 고침되는 임시 AWS 자격 증명이 포함됩니다.

1. AWS CLI 또는 AWS Management Console을 사용하여 Bottlerocket 하이브리드 노드에 대한 지원이 활성화된 상태로 `eks-pod-identity-agent`를 설치합니다.

   1.  AWS CLI: 클러스터 관리에 사용하는 시스템에서 다음 명령을 실행하여 Bottlerocket 하이브리드 노드에 대한 지원이 활성화된 상태로 `eks-pod-identity-agent`를 설치합니다. `my-cluster`를 클러스터 이름으로 바꿉니다.

      ```
      aws eks create-addon \
          --cluster-name my-cluster \
          --addon-name eks-pod-identity-agent \
          --configuration-values '{"daemonsets":{"hybrid-bottlerocket":{"create": true}}}'
      ```

   1.  AWS Management Console: AWS 콘솔을 통해 Pod Identity 에이전트 추가 기능을 설치하는 경우 선택적 구성에 다음을 추가하여 Bottlerocket 하이브리드 노드를 대상으로 하는 DaemonSet를 배포합니다.

      ```
      {"daemonsets":{"hybrid-bottlerocket":{"create": true}}}
      ```

## CSI 스냅샷 컨트롤러
<a name="hybrid-nodes-add-ons-csi-snapshotter"></a>

`v8.1.0-eksbuild.2` 버전 부터 [CSI 스냅샷 컨트롤러 추가 기능](csi-snapshot-controller.md)은 하이브리드 노드에 대해 소프트 반선호도 규칙을 적용하며, 컨트롤러 `deployment`가 Amazon EKS 컨트롤 플레인과 동일한 AWS 리전의 EC2에서 실행되는 것을 선호합니다. Amazon EKS 컨트롤 플레인과 동일한 AWS 리전에서 `deployment`를 공동 배치하면 지연 시간이 개선됩니다.

## 커뮤니티 추가 기능
<a name="hybrid-nodes-add-ons-community"></a>

다음 섹션에서는 다른 Amazon EKS 컴퓨팅 유형과 비교하여 하이브리드 노드에서 호환되는 커뮤니티 추가 기능을 실행하는 것의 차이점을 설명합니다.

## Kubernetes 지표 서버
<a name="hybrid-nodes-add-ons-metrics-server"></a>

컨트롤 플레인은 Metrics Server의 포드 IP(또는 hostNetwork가 활성화된 경우 노드 IP)에 도달해야 합니다. 따라서 hostNetwork 모드에서 Metrics Server를 실행하지 않는 한 Amazon EKS 클러스터를 생성할 때 원격 포드 네트워크를 구성해야 하고, 포드 IP 주소를 라우팅 가능하도록 설정해야 합니다. CNI를 사용하여 Border Gateway Protocol(BGP)을 구현하는 것은 포드 IP 주소를 라우팅 가능하도록 설정하는 일반적인 방법 중 하나입니다.

## cert-manager
<a name="hybrid-nodes-add-ons-cert-manager"></a>

 `cert-manager`는 [웹후크](https://kubernetes.io/docs/reference/access-authn-authz/webhook/)를 사용합니다. 하이브리드 노드에서 `cert-manager`를 실행하는 경우 온프레미스 포드 CIDR은 온프레미스 네트워크에서 라우팅 가능해야 하며 원격 포드 네트워크로 EKS 클러스터를 구성해야 합니다. 자세한 내용은 [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md)을 참조하세요.

# 하이브리드 노드용 웹후크 구성
<a name="hybrid-nodes-webhooks"></a>

이 페이지에서는 하이브리드 노드에서 웹후크를 실행하는 것과 관련된 고려 사항을 자세히 설명합니다. 웹후크는 Kubernetes 애플리케이션과 AWS 로드 밸런서 컨트롤러 및 CloudWatch 관찰성 에이전트와 같은 오픈 소스 프로젝트에서 런타임 시 변경 및 검증 기능을 수행하는 데 사용됩니다.

 **라우팅 가능한 포드 네트워크** 

온프레미스 네트워크에서 온프레미스 포드 CIDR을 라우팅할 수 있는 경우 하이브리드 노드에서 웹후크를 실행할 수 있습니다. Border Gateway Protocol(BGP), 정적 경로 또는 기타 사용자 지정 라우팅 솔루션을 포함하여 온프레미스 네트워크에서 온프레미스 포드 CIDR을 라우팅 가능하도록 하는 데 몇 가지 기법을 사용할 수 있습니다. BGP는 사용자 지정 또는 수동 라우팅 구성이 필요한 대체 솔루션보다 더 확장성이 뛰어나고 관리하기 쉽기 때문에 권장되는 솔루션입니다. AWS는 포드 CIDR을 알리는 데 Cilium 및 Calico의 BGP 기능을 지원합니다. 자세한 내용은 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md) 및 [라우팅 가능한 원격 포드 CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs) 섹션을 참조하세요.

 **라우팅 불가능한 포드 네트워크** 

온프레미스 네트워크에서 온프레미스 포드 CIDR을 라우팅 가능하도록 할 수 *없고* 웹후크를 실행해야 하는 경우 하이브리드 노드와 동일한 EKS 클러스터의 클라우드 노드에서 모든 웹후크를 실행하는 것이 좋습니다.

## 혼합 모드 클러스터 고려 사항
<a name="hybrid-nodes-considerations-mixed-mode"></a>

 *혼합 모드 클러스터*는 하이브리드 노드와 노드가 모두 AWS 클라우드에서 실행되는 EKS 클러스터로 정의됩니다. 혼합 모드 클러스터를 실행할 때는 다음 권장 사항을 고려하세요.
+ AWS 클라우드의 노드에서 VPC CNI를 실행하고 하이브리드 노드에서 Cilium 또는 Calico를 실행합니다. Cilium 및 Calico는 AWS 클라우드의 노드에서 실행할 때 AWS에서 지원되지 않습니다.
+ AWS 클라우드의 노드에서 실행되도록 웹후크를 구성합니다. AWS 및 커뮤니티 추가 기능용 웹후크를 구성하는 방법은 [추가 기능을 위한 웹후크 구성](#hybrid-nodes-webhooks-add-ons)을 참조하세요.
+ 애플리케이션이 하이브리드 노드에서 실행되는 포드와 직접 통신(‘동서 통신’)하기 위해 AWS 클라우드의 노드에서 실행되는 포드가 필요하고, 하이브리드 노드에서 AWS 클라우드 및 Cilium 또는 Calico의 노드에서 VPC CNI를 사용하는 경우 온프레미스 포드 CIDR은 온프레미스 네트워크에서 라우팅 가능해야 합니다.
+ AWS 클라우드의 노드에서 하나 이상의 CoreDNS 복제본을 실행하고 하이브리드 노드에서 하나 이상의 CoreDNS 복제본을 실행합니다.
+ 서비스 트래픽을 트래픽이 시작되는 영역에 로컬로 유지하도록 서비스 트래픽 분산을 구성합니다. 서비스 트래픽 분산에 대한 자세한 내용은 [서비스 트래픽 분산 구성](#hybrid-nodes-mixed-service-traffic-distribution)을 참조하세요.
+ 하이브리드 노드에서 실행되는 워크로드 트래픽에 AWS Application Load Balancer(ALB) 또는 Network Load Balancer(NLB)를 사용하는 경우 ALB 또는 NLB와 함께 사용되는 IP 대상이 AWS에서 라우팅 가능해야 합니다.
+ Metrics Server 추가 기능을 사용하려면 EKS 컨트롤 플레인에서 Metrics Server 포드 IP 주소로의 연결이 필요합니다. 하이브리드 노드에서 Metrics Server 추가 기능을 실행하는 경우 온프레미스 포드 CIDR이 온프레미스 네트워크에서 라우팅 가능해야 합니다.
+ Amazon Managed Service for Prometheus(AMP) 관리형 수집기를 사용하여 하이브리드 노드에 대한 지표를 수집하려면 온프레미스 포드 CIDR이 온프레미스 네트워크에서 라우팅 가능해야 합니다. 또는 AWS 클라우드에서 실행되는 EKS 컨트롤 플레인 지표와 리소스에 AMP 관리형 수집기를 사용하고, AWS Distro for OpenTelemetry(ADOT) 추가 기능을 사용하여 하이브리드 노드에 대한 지표를 수집할 수 있습니다.

## 혼합 모드 클러스터 구성
<a name="hybrid-nodes-mixed-mode"></a>

클러스터에서 실행되는 변형 및 검증 웹후크를 보려면 클러스터의 EKS 콘솔의 **리소스** 패널에서 **확장** 리소스 유형을 보거나 다음 명령을 사용할 수 있습니다. 또한 EKS는 클러스터 관찰성 대시보드에 웹후크 지표를 보고합니다. 자세한 내용은 [관찰성 대시보드를 사용하여 클러스터 모니터링](observability-dashboard.md) 섹션을 참조하세요.

```
kubectl get mutatingwebhookconfigurations
```

```
kubectl get validatingwebhookconfigurations
```

### 서비스 트래픽 분산 구성
<a name="hybrid-nodes-mixed-service-traffic-distribution"></a>

혼합 모드 클러스터를 실행할 때 [https://kubernetes.io/docs/reference/networking/virtual-ips/#traffic-distribution](https://kubernetes.io/docs/reference/networking/virtual-ips/#traffic-distribution)을 사용하여 서비스 트래픽을 트래픽이 시작되는 영역에 로컬로 유지하는 것이 좋습니다. 서비스 트래픽 분산(EKS의 Kubernetes 버전 1.31 이상에서 사용 가능)은 예측 가능성이 더 높기 때문에 [토폴로지 인식 라우팅](https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/)보다 권장되는 솔루션입니다. 서비스 트래픽 분산을 사용하면 영역 내의 정상 엔드포인트가 해당 영역의 모든 트래픽을 수신합니다. 토폴로지 인식 라우팅을 사용하면 각 서비스가 사용자 지정 라우팅을 적용하기 위해 해당 영역에서 여러 조건을 충족해야 합니다. 그렇지 않으면 모든 엔드포인트에 트래픽을 균등하게 라우팅합니다.

Cilium을 CNI로 사용하는 경우 `enable-service-topology`가 `true`로 설정된 CNI를 실행하여 서비스 트래픽 분산을 활성화해야 합니다. Helm 설치 플래그 `--set loadBalancer.serviceTopology=true`를 사용하여 이 구성을 전달하거나 Cilium CLI 명령 `cilium config set enable-service-topology true`를 사용하여 기존 설치를 업데이트할 수 있습니다. 기존 설치의 구성을 업데이트한 후 각 노드에서 실행되는 Cilium 에이전트를 다시 시작해야 합니다.

다음 섹션에서는 CoreDNS 서비스에 대한 서비스 트래픽 분산을 구성하는 방법의 예를 보여줍니다. 의도치 않은 교차 환경 트래픽을 방지하기 위해 클러스터의 모든 서비스에 대해 동일한 설정을 활성화하는 것이 좋습니다.

### CoreDNS 복제본 구성
<a name="hybrid-nodes-mixed-coredns"></a>

하이브리드 노드와 AWS 클라우드의 노드가 있는 혼합 모드 클러스터를 실행하는 경우 하이브리드 노드에는 하나 이상의 CoreDNS 복제본을, AWS 클라우드의 노드에는 하나 이상의 CoreDNS 복제본을 사용하는 것이 좋습니다. 혼합 모드 클러스터 설정에서 지연 및 네트워크 문제를 방지하려면 [서비스 트래픽 분산](https://kubernetes.io/docs/reference/networking/virtual-ips/#traffic-distribution)을 사용하여 가장 가까운 CoreDNS 복제본을 선호하도록 CoreDNS 서비스를 구성할 수 있습니다.

 *서비스 트래픽 분산*(EKS의 Kubernetes 버전 1.31 이상에서 사용 가능)은 예측 가능성이 더 높기 때문에 [토폴로지 인식 라우팅](https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/)보다 권장되는 솔루션입니다. 서비스 트래픽 분산에서는 영역 내의 정상 엔드포인트는 해당 영역의 모든 트래픽을 수신합니다. 토폴로지 인식 라우팅에서는 사용자 지정 라우팅을 적용하려면 각 서비스가 해당 영역의 여러 조건을 충족해야 합니다. 그렇지 않으면 트래픽을 모든 엔드포인트로 균등하게 라우팅합니다. 다음 단계에서는 서비스 트래픽 분산을 구성합니다.

Cilium을 CNI로 사용하는 경우 `enable-service-topology`가 `true`로 설정된 CNI를 실행하여 서비스 트래픽 분산을 활성화해야 합니다. Helm 설치 플래그 `--set loadBalancer.serviceTopology=true`를 사용하여 이 구성을 전달하거나 Cilium CLI 명령 `cilium config set enable-service-topology true`를 사용하여 기존 설치를 업데이트할 수 있습니다. 기존 설치의 구성을 업데이트한 후 각 노드에서 실행되는 Cilium 에이전트를 다시 시작해야 합니다.

1. `topology.kubernetes.io/zone: onprem`과 같이 각 하이브리드 노드에 대한 토폴로지 영역 레이블을 추가합니다. 또는 `nodeadm` 구성에서 레이블을 지정하여 `nodeadm init` 단계에서 레이블을 설정할 수 있습니다. [kubelet 사용자 지정을 위한 노드 구성(선택 사항)](hybrid-nodes-nodeadm.md#hybrid-nodes-nodeadm-kubelet) 섹션을 참조하세요. AWS 클라우드에서 실행되는 노드는 노드의 가용 영역(AZ)에 해당하는 토폴로지 영역 레이블이 자동 적용됩니다.

   ```
   kubectl label node hybrid-node-name topology.kubernetes.io/zone=zone
   ```

1. 토폴로지 영역 키가 있는 CoreDNS 배포에 `podAntiAffinity`를 추가합니다. 또는 설치 중에 EKS 추가 기능을 사용하여 CoreDNS 배포를 구성할 수 있습니다.

   ```
   kubectl edit deployment coredns -n kube-system
   ```

   ```
   spec:
     template:
       spec:
         affinity:
          ...
           podAntiAffinity:
             preferredDuringSchedulingIgnoredDuringExecution:
             - podAffinityTerm:
                 labelSelector:
                   matchExpressions:
                   - key: k8s-app
                     operator: In
                     values:
                     - kube-dns
                 topologyKey: kubernetes.io/hostname
               weight: 100
             - podAffinityTerm:
                 labelSelector:
                   matchExpressions:
                   - key: k8s-app
                     operator: In
                     values:
                     - kube-dns
                 topologyKey: topology.kubernetes.io/zone
               weight: 50
         ...
   ```

1. 서비스 트래픽 분배를 활성화하려면 `kube-dns` 서비스 구성에 `trafficDistribution: PreferClose` 설정을 추가합니다.

   ```
   kubectl patch svc kube-dns -n kube-system --type=merge -p '{
     "spec": {
       "trafficDistribution": "PreferClose"
     }
   }'
   ```

1. `kube-dns` 서비스의 엔드포인트 조각을 확인하여 서비스 트래픽 분산이 활성화되었는지 확인할 수 있습니다. 엔드포인트 조각에 서비스 트래픽 분산이 활성화되었음을 확인하는 토폴로지 영역 레이블의 `hints`가 표시되어야 합니다. 각 엔드포인트 주소에 대해 `hints`가 표시되지 않으면 서비스 트래픽 분산이 활성화되지 않은 것입니다.

   ```
   kubectl get endpointslice -A | grep "kube-dns"
   ```

   ```
   kubectl get endpointslice [.replaceable]`kube-dns-<id>`  -n kube-system -o yaml
   ```

   ```
   addressType: IPv4
   apiVersion: discovery.k8s.io/v1
   endpoints:
   - addresses:
     - <your-hybrid-node-pod-ip>
     hints:
       forZones:
       - name: onprem
     nodeName: <your-hybrid-node-name>
     zone: onprem
   - addresses:
     - <your-cloud-node-pod-ip>
     hints:
       forZones:
       - name: us-west-2a
     nodeName: <your-cloud-node-name>
     zone: us-west-2a
   ```

### 추가 기능을 위한 웹후크 구성
<a name="hybrid-nodes-webhooks-add-ons"></a>

다음 추가 기능은 웹후크를 사용하고 하이브리드 노드에서 사용할 수 있습니다.
+  AWS 로드 밸런서 컨트롤러
+ CloudWatch 관찰성 에이전트
+  AWS Distro for OpenTelemetry(ADOT)
+  `cert-manager` 

이러한 추가 기능이 AWS 클라우드의 노드에서 실행하도록 사용하는 웹후크를 구성하려면 다음 섹션을 참조하세요.

#### AWS 로드 밸런서 컨트롤러
<a name="hybrid-nodes-mixed-lbc"></a>

혼합 모드 클러스터 설정에서 AWS 로드 밸런서 컨트롤러를 사용하려면 AWS 클라우드의 노드에서 컨트롤러를 실행해야 합니다. 이렇게 하려면 Helm 값 구성에 다음을 추가하거나 EKS 추가 기능 구성을 사용하여 값을 지정합니다.

```
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: eks.amazonaws.com/compute-type
          operator: NotIn
          values:
          - hybrid
```

#### CloudWatch 관찰성 에이전트
<a name="hybrid-nodes-mixed-cwagent"></a>

CloudWatch 관찰성 에이전트 추가 기능에는 웹후크를 사용하는 Kubernetes 연산자가 있습니다. 혼합 모드 클러스터 설정의 AWS 클라우드에 있는 노드에서 연산자를 실행하려면 CloudWatch Observability Agent 연산자 구성을 편집합니다. Helm 및 EKS 추가 기능을 사용하여 설치하는 동안에는 연산자 선호도를 구성할 수 없습니다([컨테이너-로드맵 문제 \$12431](https://github.com/aws/containers-roadmap/issues/2431) 참조).

```
kubectl edit -n amazon-cloudwatch deployment amazon-cloudwatch-observability-controller-manager
```

```
spec:
  ...
  template:
    ...
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: eks.amazonaws.com/compute-type
                operator: NotIn
                values:
                - hybrid
```

#### AWS Distro for OpenTelemetry(ADOT)
<a name="hybrid-nodes-mixed-adot"></a>

AWS Distro for OpenTelemetry(ADOT) 추가 기능에는 웹후크를 사용하는 Kubernetes 연산자가 있습니다. 혼합 모드 클러스터 설정의 AWS 클라우드에 있는 노드에서 연산자를 실행하려면 Helm 값 구성에 다음을 추가하거나 EKS 추가 기능 구성을 사용하여 값을 지정합니다.

```
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: eks.amazonaws.com/compute-type
          operator: NotIn
          values:
          - hybrid
```

포드 CIDR이 온프레미스 네트워크에서 라우팅 가능하지 않은 경우 하이브리드 노드 및 해당 노드에서 실행 중인 워크로드에서 지표를 스크레이프할 수 있도록 ADOT Collector가 하이브리드 노드에서 실행되어야 합니다. 이렇게 하려면 사용자 지정 리소스 정의(CRD)를 편집합니다.

```
kubectl -n opentelemetry-operator-system edit opentelemetrycollectors.opentelemetry.io adot-col-prom-metrics
```

```
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: In
            values:
            - hybrid
```

ADOT Collector CRD 구성의 각 `scrape_configs`에 다음 `relabel_configs`를 추가하여 하이브리드 노드 및 하이브리드 노드에서 실행되는 리소스의 지표만 스크레이프하도록 ADOT Collector를 구성할 수 있습니다.

```
relabel_configs:
  - action: keep
    regex: hybrid
    source_labels:
    - __meta_kubernetes_node_label_eks_amazonaws_com_compute_type
```

ADOT 추가 기능에는 ADOT 연산자 웹후크에서 사용하는 TLS 인증서에 대해`cert-manager`를 설치하기 위한 사전 요구 사항이 있습니다. 또한 `cert-manager`는 웹후크를 실행하고 다음 Helm 값 구성을 사용하여 AWS 클라우드의 노드에서 실행되도록 구성할 수 있습니다.

```
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: eks.amazonaws.com/compute-type
          operator: NotIn
          values:
          - hybrid
webhook:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
cainjector:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
startupapicheck:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
```

#### `cert-manager`
<a name="hybrid-nodes-mixed-cert-manager"></a>

또한 `cert-manager` 추가 기능은 웹후크를 실행하며, 다음 Helm 값 구성을 사용하여 AWS 클라우드의 노드에서 실행되도록 구성할 수 있습니다.

```
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: eks.amazonaws.com/compute-type
          operator: NotIn
          values:
          - hybrid
webhook:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
cainjector:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
startupapicheck:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
```

# 하이브리드 노드용 프록시 구성
<a name="hybrid-nodes-proxy"></a>

데이터 센터 또는 엣지 환경에서 나가는 트래픽에 대해 온프레미스 환경에서 프록시 서버를 사용하는 경우 프록시 서버를 사용하려면 노드와 클러스터를 개별적으로 구성해야 합니다.

클러스터  
클러스터에서 프록시 서버를 사용하도록 `kube-proxy`를 구성해야 합니다. Amazon EKS 클러스터를 생성한 후 `kube-proxy`를 구성해야 합니다.

노드  
노드에서 프록시 서버를 사용하도록 운영 체제, `containerd`, `kubelet` 및 Amazon SSM 에이전트를 구성해야 합니다. 운영 체제 이미지의 빌드 프로세스 중에 또는 각 하이브리드 노드에서 `nodeadm init`을 실행하기 전에 변경할 수 있습니다.

## 노드 수준 구성
<a name="_node_level_configuration"></a>

운영 체제 이미지에 또는 각 하이브리드 노드에서 `nodeadm init`를 실행하기 전에 다음 구성을 적용해야 합니다.

### `containerd` 프록시 구성
<a name="_containerd_proxy_configuration"></a>

 `containerd`는 Kubernetes의 기본 컨테이너 관리 런타임입니다. 인터넷 액세스에 프록시를 사용하는 경우 Kubernetes 및 Amazon EKS에 필요한 컨테이너 이미지를 가져올 수 있도록 `containerd`를 구성해야 합니다.

`/etc/systemd/system/containerd.service.d` 디렉터리의 `http-proxy.conf`라는 각 하이브리드 노드에 다음 콘텐츠로 파일을 생성합니다. `proxy-domain`과 `port`를 해당 환경의 값으로 바꿉니다.

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

#### 사용자 데이터의 `containerd` 구성
<a name="_containerd_configuration_from_user_data"></a>

이 파일에 대해 `containerd.service.d` 디렉터리를 생성해야 합니다. 재부팅하지 않고 구성 파일을 픽업하려면 systemd를 다시 로드해야 합니다. AL2023에서는 스크립트가 실행될 때 서비스가 이미 실행 중일 수 있으므로 서비스를 다시 시작해야 합니다.

```
mkdir -p /etc/systemd/system/containerd.service.d
echo '[Service]' > /etc/systemd/system/containerd.service.d/http-proxy.conf
echo 'Environment="HTTP_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/containerd.service.d/http-proxy.conf
echo 'Environment="HTTPS_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/containerd.service.d/http-proxy.conf
echo 'Environment="NO_PROXY=localhost"' >> /etc/systemd/system/containerd.service.d/http-proxy.conf
systemctl daemon-reload
systemctl restart containerd
```

### `kubelet` 프록시 구성
<a name="_kubelet_proxy_configuration"></a>

 `kubelet`는 각 Kubernetes 노드에서 실행되는 Kubernetes 노드 에이전트이며 해당 노드에서 실행되는 노드 및 포드를 관리할 책임이 있습니다. 온프레미스 환경에서 프록시를 사용하는 경우 Amazon EKS 클러스터의 퍼블릭 또는 프라이빗 엔드포인트와 통신할 수 있도록 `kubelet`를 구성해야 합니다.

`/etc/systemd/system/kubelet.service.d/` 디렉터리의 `http-proxy.conf`라는 각 하이브리드 노드에 다음 콘텐츠로 파일을 생성합니다. `proxy-domain`과 `port`를 해당 환경의 값으로 바꿉니다.

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

#### `kubelet` 사용자 데이터의 구성
<a name="_kubelet_configuration_from_user_data"></a>

이 파일에 대한 `kubelet.service.d` 디렉터리를 생성해야 합니다. 재부팅하지 않고 구성 파일을 픽업하려면 systemd를 다시 로드해야 합니다. AL2023에서는 스크립트가 실행될 때 서비스가 이미 실행 중일 수 있으므로 서비스를 다시 시작해야 합니다.

```
mkdir -p /etc/systemd/system/kubelet.service.d
echo '[Service]' > /etc/systemd/system/kubelet.service.d/http-proxy.conf
echo 'Environment="HTTP_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/kubelet.service.d/http-proxy.conf
echo 'Environment="HTTPS_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/kubelet.service.d/http-proxy.conf
echo 'Environment="NO_PROXY=localhost"' >> /etc/systemd/system/kubelet.service.d/http-proxy.conf
systemctl daemon-reload
systemctl restart kubelet
```

### `ssm` 프록시 구성
<a name="_ssm_proxy_configuration"></a>

 `ssm`은 하이브리드 노드를 초기화하는 데 사용할 수 있는 자격 증명 공급자 중 하나입니다. `ssm`은 AWS를 사용하여 인증하고 `kubelet`에서 사용하는 임시 자격 증명을 생성할 책임이 있습니다. 온프레미스 환경에서 프록시를 사용하고 노드에서 자격 증명 공급자로 `ssm`을 사용하는 경우 Amazon SSM 서비스 엔드포인트와 통신할 수 있도록 `ssm`을 구성해야 합니다.

운영 체제에 따라 아래 경로에서 `http-proxy.conf`라는 파일을 각 하이브리드 노드에 생성합니다.
+ Ubuntu - `/etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service.d/http-proxy.conf` 
+ Amazon Linux 2023 및 Red Hat Enterprise Linux - `/etc/systemd/system/amazon-ssm-agent.service.d/http-proxy.conf` 

다음 콘텐츠로 파일을 채웁니다. `proxy-domain`과 `port`를 해당 환경의 값으로 바꿉니다.

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

#### `ssm` 사용자 데이터의 구성
<a name="_ssm_configuration_from_user_data"></a>

이 파일에 대한 `ssm` systemd 서비스 파일 디렉터리를 생성해야 합니다. 디렉터리 경로는 노드에서 사용되는 운영 체제에 따라 다릅니다.
+ Ubuntu - `/etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service.d` 
+ Amazon Linux 2023 및 Red Hat Enterprise Linux - `/etc/systemd/system/amazon-ssm-agent.service.d` 

노드에서 사용되는 운영 체제에 따라 아래 재시작 명령의 시스템 서비스 이름을 바꿉니다.
+ Ubuntu - `snap.amazon-ssm-agent.amazon-ssm-agent` 
+ Amazon Linux 2023 및 Red Hat Enterprise Linux - `amazon-ssm-agent` 

```
mkdir -p systemd-service-file-directory
echo '[Service]' > [.replaceable]#systemd-service-file-directory/http-proxy.conf
echo 'Environment="HTTP_PROXY=http://[.replaceable]#proxy-domain:port"' >> systemd-service-file-directory/http-proxy.conf
echo 'Environment="HTTPS_PROXY=http://[.replaceable]#proxy-domain:port"' >> [.replaceable]#systemd-service-file-directory/http-proxy.conf
echo 'Environment="NO_PROXY=localhost"' >> [.replaceable]#systemd-service-file-directory/http-proxy.conf
systemctl daemon-reload
systemctl restart [.replaceable]#systemd-service-name
```

### 운영 체제 프록시 구성
<a name="_operating_system_proxy_configuration"></a>

인터넷 액세스에 프록시를 사용하는 경우 운영 체제의 패키지 관리자에서 하이브리드 노드 종속성을 가져올 수 있도록 운영 체제를 구성해야 합니다.

 **Ubuntu** 

1. 다음 명령으로 프록시를 사용하도록 `snap`을 구성합니다.

   ```
   sudo snap set system proxy.https=http://proxy-domain:port
   sudo snap set system proxy.http=http://proxy-domain:port
   ```

1. `apt`에 대한 프록시를 활성화하려면 `/etc/apt/` 디렉터리에서 `apt.conf`라는 파일을 생성합니다. 프록시 도메인과 포트를 해당 환경의 값으로 바꿉니다.

   ```
   Acquire::http::Proxy "http://proxy-domain:port";
   Acquire::https::Proxy "http://proxy-domain:port";
   ```

 **Amazon Linux 2023** 

1. 프록시를 사용하도록 `dnf`을 구성합니다. 환경의 프록시 도메인 및 포트 값을 사용하여 `/etc/dnf/dnf.conf` 파일을 생성합니다.

   ```
   proxy=http://proxy-domain:port
   ```

 **Red Hat Enterprise Linux** 

1. 프록시를 사용하도록 `yum`을 구성합니다. 환경의 프록시 도메인 및 포트 값을 사용하여 `/etc/yum.conf` 파일을 생성합니다.

   ```
   proxy=http://proxy-domain:port
   ```

### IAM Roles Anywhere 프록시 구성
<a name="_iam_roles_anywhere_proxy_configuration"></a>

IAM Roles Anywhere 자격 증명 공급자 서비스는 `enableCredentialsFile` 플래그와 함께 IAM Roles Anywhere를 사용할 때 자격 증명을 새로 고치는 역할을 합니다([EKS Pod Identity 에이전트](hybrid-nodes-add-ons.md#hybrid-nodes-add-ons-pod-id) 참조). 온프레미스 환경에서 프록시를 사용하는 경우 IAM Roles Anywhere 엔드포인트와 통신할 수 있도록 서비스를 구성해야 합니다.

각 하이브리드 노드의 `/etc/systemd/system/aws_signing_helper_update.service.d/` 디렉터리에 다음 콘텐츠로 `http-proxy.conf`라는 파일을 생성합니다. `proxy-domain`과 `port`를 해당 환경의 값으로 바꿉니다.

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

## 클러스터 전체 구성
<a name="_cluster_wide_configuration"></a>

이 섹션의 구성은 Amazon EKS 클러스터를 생성한 후 각 하이브리드 노드에서 `nodeadm init`를 실행하기 전에 적용해야 합니다.

### kube-proxy 프록시 구성
<a name="_kube_proxy_proxy_configuration"></a>

Amazon EKS는 하이브리드 노드가 클러스터에 조인할 때 각 하이브리드 노드에 DaemonSet로 `kube-proxy`를 자동으로 설치합니다. `kube-proxy`를 사용하면 Amazon EKS 클러스터의 포드가 지원하는 서비스 간에 라우팅할 수 있습니다. 각 호스트를 구성하려면 `kube-proxy`에서 Amazon EKS 클러스터 엔드포인트에 대한 DNS 확인이 필요합니다.

1. 다음 명령을 사용하여 `kube-proxy` DaemonSet를 편집합니다.

   ```
   kubectl -n kube-system edit ds kube-proxy
   ```

   그러면 구성된 편집기에서 `kube-proxy` DaemonSet 정의가 열립니다.

1. `HTTP_PROXY` 및 `HTTPS_PROXY`에 대한 환경 변수를 추가합니다. `NODE_NAME` 환경 변수가 구성에 이미 있어야 합니다. `proxy-domain`과 `port`를 해당 환경의 값으로 바꿉니다.

   ```
   containers:
     - command:
       - kube-proxy
       - --v=2
       - --config=/var/lib/kube-proxy-config/config - --hostname-override=$(NODE_NAME)
       env:
       - name: HTTP_PROXY
         value: http://proxy-domain:port
       - name: HTTPS_PROXY
         value: http://proxy-domain:port
       - name: NODE_NAME
         valueFrom:
           fieldRef:
             apiVersion: v1
             fieldPath: spec.nodeName
   ```

# 하이브리드 노드에 대한 Cilium BGP 구성
<a name="hybrid-nodes-cilium-bgp"></a>

이 주제에서는 Amazon EKS Hybrid Nodes에 대한 Cilium Border Gateway Protocol(BGP)을 구성하는 방법을 설명합니다. Cilium의 BGP 기능은 [Cilium BGP Control Plane](https://docs.cilium.io/en/stable/network/bgp-control-plane/bgp-control-plane/)이라고 하며 포드 및 서비스 주소를 온프레미스 네트워크에 알리는 데 사용할 수 있습니다. 온프레미스 네트워크에서 포드 CIDR을 라우팅 가능하도록 하는 다른 방법은 [라우팅 가능한 원격 포드 CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs) 섹션을 참조하세요.

## Cilium BGP 구성
<a name="hybrid-nodes-cilium-bgp-configure"></a>

### 사전 조건
<a name="_prerequisites"></a>
+ [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)의 지침에 따라 Cilium이 설치되어 있습니다.

### 절차
<a name="_procedure"></a>

1. BGP를 Cilium과 함께 사용하여 온프레미스 네트워크에 포드 또는 서비스 주소를 알리려면 `bgpControlPlane.enabled: true`로 Cilium을 설치해야 합니다. 기존 Cilium 배포에 대해 BGP를 활성화하는 경우 BGP가 이전에 활성화되지 않은 경우 BGP 구성을 적용하려면 Cilium 연산자를 다시 시작해야 합니다. Helm 값에서 `operator.rollOutPods`를 `true`로 설정하여 Helm 설치/업그레이드 프로세스의 일부로 Cilium 연산자를 다시 시작할 수 있습니다.

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     --set bgpControlPlane.enabled=true
   ```

1. Cilium 운영자와 에이전트가 다시 시작되어 실행 중인지 확인합니다.

   ```
   kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
   ```

   ```
   NAME                               READY   STATUS    RESTARTS   AGE
   cilium-grwlc                       1/1     Running   0          4m12s
   cilium-operator-68f7766967-5nnbl   1/1     Running   0          4m20s
   cilium-operator-68f7766967-7spfz   1/1     Running   0          4m20s
   cilium-pnxcv                       1/1     Running   0          6m29s
   cilium-r7qkj                       1/1     Running   0          4m12s
   cilium-wxhfn                       1/1     Running   0          4m1s
   cilium-z7hlb                       1/1     Running   0          6m30s
   ```

1. `CiliumBGPClusterConfig` 정의를 포함하여 `cilium-bgp-cluster.yaml` 파일을 생성합니다. 네트워크 관리자로부터 다음 정보를 얻어야 할 수 있습니다.
   + Cilium을 실행하는 노드의 ASN으로 `localASN`을 구성합니다.
   + 온프레미스 라우터의 ASN으로 `peerASN`을 구성합니다.
   + Cilium을 실행하는 각 노드가 피어링할 온프레미스 라우터 IP로 `peerAddress`을 구성합니다.

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumBGPClusterConfig
     metadata:
       name: cilium-bgp
     spec:
       nodeSelector:
         matchExpressions:
         - key: eks.amazonaws.com/compute-type
           operator: In
           values:
           - hybrid
       bgpInstances:
       - name: "rack0"
         localASN: NODES_ASN
         peers:
         - name: "onprem-router"
           peerASN: ONPREM_ROUTER_ASN
           peerAddress: ONPREM_ROUTER_IP
           peerConfigRef:
             name: "cilium-peer"
     ```

1. 클러스터에 Cilium BGP 클러스터 구성을 적용합니다.

   ```
   kubectl apply -f cilium-bgp-cluster.yaml
   ```

1. BGP 피어 구성을 정의하는 `CiliumBGPPeerConfig` 리소스를 포함하여 `cilium-bgp-peer.yaml` 파일을 생성합니다. 여러 피어가 동일한 구성을 공유하고 공통 `CiliumBGPPeerConfig` 리소스에 대한 참조를 제공할 수 있습니다. 구성 옵션의 전체 목록은 Cilium 문서의 [BGP Peer configuration](https://docs.cilium.io/en/latest/network/bgp-control-plane/bgp-control-plane-v2/#bgp-peer-configuration) 페이지를 참조하세요.

   다음 Cilium 피어 설정의 값은 피어링하려는 온프레미스 라우터의 값과 일치해야 합니다.
   + 세션의 중단 상태를 선언하기 전에 BGP 피어가 킵얼라이브 또는 업데이트 메시지를 기다리는 시간을 결정하는 `holdTimeSeconds`를 구성합니다. 기본값은 90초입니다.
   + BGP 피어가 계속 연결할 수 있고 BGP 세션이 활성 상태인지 여부를 결정하는 `keepAliveTimeSeconds`를 구성합니다. 기본값은 30초입니다.
   + 재시작 후 Cilium의 BGP Control Plane에서 BGP 세션을 다시 설정할 것으로 예상되는 시간을 결정하는 `restartTimeSeconds`를 구성합니다. 기본값은 120초입니다.

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumBGPPeerConfig
     metadata:
       name: cilium-peer
     spec:
       timers:
         holdTimeSeconds: 90
         keepAliveTimeSeconds: 30
       gracefulRestart:
         enabled: true
         restartTimeSeconds: 120
       families:
         - afi: ipv4
           safi: unicast
           advertisements:
             matchLabels:
               advertise: "bgp"
     ```

1. 클러스터에 Cilium BGP 피어 구성을 적용합니다.

   ```
   kubectl apply -f cilium-bgp-peer.yaml
   ```

1. `CiliumBGPAdvertisement` 리소스를 포함하는 `cilium-bgp-advertisement-pods.yaml` 파일을 생성하여 포드 CIDR을 온프레미스 네트워크에 알립니다.
   + `CiliumBGPAdvertisement` 리소스는 광고 유형 및 이와 관련된 속성을 정의하는 데 사용됩니다. 아래 예시에서는 포드 CIDR만 알리도록 Cilium을 구성합니다. 서비스 주소를 알리도록 Cilium을 구성하는 방법에 대한 자세한 내용은 [Service 유형 LoadBalancer](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium-loadbalancer) 및 [Cilium 클러스터 내 로드 밸런싱](hybrid-nodes-load-balancing.md#hybrid-nodes-service-lb-cilium)의 예시를 참조하세요.
   + Cilium 에이전트를 실행하는 각 하이브리드 노드는 업스트림 BGP 지원 라우터와 피어링됩니다. 각 노드는 아래 예시와 같이 Cilium의 `advertisementType`이 `PodCIDR`로 설정된 경우 소유한 포드 CIDR 범위를 알립니다. 자세한 내용은 Cilium 문서의 [BGP Advertisements configuration](https://docs.cilium.io/en/stable/network/bgp-control-plane/bgp-control-plane-v2/#bgp-advertisements)을 참조하세요.

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumBGPAdvertisement
     metadata:
       name: bgp-advertisement-pods
       labels:
         advertise: bgp
     spec:
       advertisements:
         - advertisementType: "PodCIDR"
     ```

1. 클러스터에 Cilium BGP 광고 구성을 적용합니다.

   ```
   kubectl apply -f cilium-bgp-advertisement-pods.yaml
   ```

1. `cilium bgp peers` 명령을 사용하여 [Cilium CLI](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/#install-the-cilium-cli)에서 작동하는 BGP 피어링을 확인할 수 있습니다. 환경에 대한 출력에 올바른 값이 표시되고 세션 상태가 `established`로 설정되어야 합니다. 문제 해결에 대한 자세한 내용은 Cilium 설명서의 [Troubleshooting and Operations Guide](https://docs.cilium.io/en/latest/network/bgp-control-plane/bgp-control-plane/#troubleshooting-and-operation-guide)를 참조하세요.

   아래 예시에서는 Cilium 에이전트를 실행하는 하이브리드 노드가 5개 있으며 각 노드는 소유한 포드 CIDR 범위를 알리고 있습니다.

   ```
   cilium bgp peers
   ```

   ```
   Node                   Local AS    Peer AS               Peer Address        Session State   Uptime     Family         Received   Advertised
   mi-026d6a261e355fba7   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h18m58s   ipv4/unicast   1          2
   mi-082f73826a163626e   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h19m12s   ipv4/unicast   1          2
   mi-09183e8a3d755abf6   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h18m47s   ipv4/unicast   1          2
   mi-0d78d815980ed202d   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h19m12s   ipv4/unicast   1          2
   mi-0daa253999fe92daa   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h18m58s   ipv4/unicast   1          2
   ```

   ```
   cilium bgp routes
   ```

   ```
   Node                   VRouter       Prefix           NextHop   Age         Attrs
   mi-026d6a261e355fba7   NODES_ASN     10.86.2.0/26     0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-082f73826a163626e   NODES_ASN     10.86.2.192/26   0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-09183e8a3d755abf6   NODES_ASN     10.86.2.64/26    0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-0d78d815980ed202d   NODES_ASN     10.86.2.128/26   0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-0daa253999fe92daa   NODES_ASN     10.86.3.0/26     0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   ```

# 하이브리드 노드에 대한 Kubernetes Ingress 구성
<a name="hybrid-nodes-ingress"></a>

이 주제에서는 Amazon EKS Hybrid Nodes에서 실행되는 워크로드에 대해 Kubernetes Ingress를 구성하는 방법을 설명합니다. [Kubernetes Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/)는 클러스터 외부의 HTTP 및 HTTPS 경로를 클러스터 내의 서비스로 노출합니다. Ingress 리소스를 사용하려면 네트워크 트래픽을 처리하는 네트워킹 인프라 및 구성 요소 설정을 위해 Kubernetes Ingress 컨트롤러가 필요합니다.

 AWS는 EKS Hybrid Nodes에서 실행되는 워크로드에 대해 AWS ALB(Application Load Balancer) 및 Cilium for Kubernetes Ingress를 지원합니다. ALB 또는 Cilium for Ingress 중 무엇을 사용할지는 애플리케이션 트래픽의 소스를 기반으로 합니다. 애플리케이션 트래픽이 AWS 리전에서 발생하는 경우 AWS는 AWS ALB 및 AWS Load Balancer Controller 사용을 권장합니다. 애플리케이션 트래픽이 로컬 온프레미스 또는 엣지 환경에서 발생하는 경우 AWS는 환경에서 로드 밸런서 인프라 유무와 무관하게 사용할 수 있는 Cilium의 내장 Ingress 기능을 사용할 것을 권장합니다.

![\[EKS Hybrid Nodes Ingress\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-nodes-ingress.png)


## AWS Application Load Balancer
<a name="hybrid-nodes-ingress-alb"></a>

하이브리드 노드에서 실행되는 워크로드의 대상 유형 `ip`에서 [AWS Load Balancer Controller](aws-load-balancer-controller.md) 및 ALB(Application Load Balancer)를 사용할 수 있습니다. 대상 유형 `ip`를 사용하는 경우 ALB는 Service 계층 네트워크 경로를 우회하여 트래픽을 포드로 직접 전달합니다. ALB가 하이브리드 노드의 포드 IP 대상에 도달하려면 온프레미스 포드 CIDR이 온프레미스 네트워크에서 라우팅 가능해야 합니다. 추가로 AWS Load Balancer Controller는 웹후크를 사용하며 EKS 컨트롤 플레인과의 직접 통신이 필요합니다. 자세한 내용은 [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md) 섹션을 참조하세요.

### 고려 사항
<a name="_considerations"></a>
+ AWS Application Load Balancer 및 AWS Load Balancer Controller에 대한 자세한 내용은 [Application Load Balancer를 사용하여 애플리케이션 및 HTTP 트래픽 라우팅](alb-ingress.md) 및 [Helm을 사용하여 AWS Load Balancer Controller 설치](lbc-helm.md) 섹션을 참조하세요.
+ [로드 밸런싱 운영 모범 사례](https://docs.aws.amazon.com/eks/latest/best-practices/load-balacing.html) 섹션에서 AWS Application Load Balancer와 AWS Network Load Balancer 사이에서 선택하는 방법을 참조하세요.
+ [AWS Load Balancer Controller Ingress annotations](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/annotations/) 섹션에서 AWS Application Load Balancer로 Ingress 리소스에 대해 구성할 수 있는 주석 목록을 참조하세요.

### 사전 조건
<a name="_prerequisites"></a>
+ [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)의 지침에 따라 Cilium이 설치되어 있습니다.
+ [하이브리드 노드에 대한 Cilium BGP 구성](hybrid-nodes-cilium-bgp.md)의 지침에 따라 Cilium BGP 컨트롤 플레인이 활성화되어 있습니다. BGP를 사용하지 않으려면 다른 방법을 사용하여 온프레미스 포드 CIDR이 온프레미스 네트워크에서 라우팅할 수 있도록 해야 합니다. 온프레미스 포드 CIDR을 라우팅할 수 있도록 하지 않으면 ALB가 포드 IP 대상을 등록하거나 연결할 수 없습니다.
+ 명령줄 환경에 설치된 Helm에 대한 자세한 내용은 [Helm 설정 지침](helm.md)을 참조하세요.
+ 명령줄 환경에 설치된 eksctl에 대한 자세한 내용은 [eksctl 설정 지침](install-kubectl.md#eksctl-install-update)을 참조하세요.

### 절차
<a name="_procedure"></a>

1. 사용자 대신 AWS API를 직접 호출할 수 있는 AWS 로드 밸런서 컨트롤러의 IAM 정책을 다운로드합니다.

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
   ```

1. 이전 단계에서 다운로드한 정책을 사용하여 IAM 정책을 만듭니다.

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```

1. 클러스터 이름(`CLUSTER_NAME`), AWS 리전(`AWS_REGION`) 및 AWS 계정 ID(`AWS_ACCOUNT_ID`)의 값을 사용자 설정에 맞춰 바꾸고 다음 명령을 실행합니다.

   ```
   eksctl create iamserviceaccount \
       --cluster=CLUSTER_NAME \
       --namespace=kube-system \
       --name=aws-load-balancer-controller \
       --attach-policy-arn=arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \
       --override-existing-serviceaccounts \
       --region AWS_REGION \
       --approve
   ```

1. eks-charts Helm 차트 리포지토리를 추가하고 최신 차트가 적용되도록 로컬 Helm 리포지토리를 업데이트합니다.

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

   ```
   helm repo update eks
   ```

1. AWS 로드 밸런서 컨트롤러를 설치합니다. 클러스터 이름(`CLUSTER_NAME`), AWS 리전(`AWS_REGION`), VPC ID(`VPC_ID`) 및 AWS Load Balancer Controller Helm 차트 버전(`AWS_LBC_HELM_VERSION`)의 값을 사용자 설정에 맞춰 바꾸고 다음 명령을 실행합니다. 하이브리드 노드와 AWS 클라우드의 노드가 모두 있는 혼합 모드 클러스터를 실행하는 경우 [AWS 로드 밸런서 컨트롤러](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-lbc)의 지침에 따라 클라우드 노드에서 AWS Load Balancer Controller를 실행할 수 있습니다.
   + `helm search repo eks/aws-load-balancer-controller --versions`를 실행하여 최신 버전의 Helm 차트를 찾을 수 있습니다.

     ```
     helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
       -n kube-system \
       --version AWS_LBC_HELM_VERSION \
       --set clusterName=CLUSTER_NAME \
       --set region=AWS_REGION \
       --set vpcId=VPC_ID \
       --set serviceAccount.create=false \
       --set serviceAccount.name=aws-load-balancer-controller
     ```

1. AWS Load Balancer Controller가 성공적으로 설치되었는지 확인합니다.

   ```
   kubectl get -n kube-system deployment aws-load-balancer-controller
   ```

   ```
   NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
   aws-load-balancer-controller   2/2     2            2           84s
   ```

1. 샘플 애플리케이션을 생성합니다. 아래 예시에서는 [Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) 샘플 마이크로서비스 애플리케이션을 사용합니다.

   ```
   kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
   ```

1. 다음 콘텐츠를 가진 `my-ingress-alb.yaml`이라는 파일을 생성합니다:

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
     annotations:
       alb.ingress.kubernetes.io/load-balancer-name: "my-ingress-alb"
       alb.ingress.kubernetes.io/target-type: "ip"
       alb.ingress.kubernetes.io/scheme: "internet-facing"
       alb.ingress.kubernetes.io/healthcheck-path: "/details/1"
   spec:
     ingressClassName: alb
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

1. 클러스터에 Ingress 구성을 적용합니다.

   ```
   kubectl apply -f my-ingress-alb.yaml
   ```

1. Ingress 리소스에 ALB를 프로비저닝하는 데 몇 분 정도 걸릴 수 있습니다. ALB가 프로비저닝되면 Ingress 리소스에 NLB 배포의 DNS 이름에 해당하는 주소가 할당됩니다. 주소 형식은 `<alb-name>-<random-string>.<region>.elb.amazonaws.com`입니다.

   ```
   kubectl get ingress my-ingress
   ```

   ```
   NAME         CLASS   HOSTS   ADDRESS                                                     PORTS   AGE
   my-ingress   alb     *       my-ingress-alb-<random-string>.<region>.elb.amazonaws.com   80      23m
   ```

1. ALB의 주소를 사용하여 Service에 액세스합니다.

   ```
   curl -s http//my-ingress-alb-<random-string>.<region>.elb.amazonaws.com:80/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
     "details": "This is the details page"
   }
   ```

## Cilium Ingress 및 Cilium Gateway 개요
<a name="hybrid-nodes-ingress-cilium"></a>

Cilium의 Ingress 기능은 Cilium의 아키텍처에 내장되어 있으며 Kubernetes Ingress API 또는 Gateway API로 관리할 수 있습니다. 기존 Ingress 리소스가 없는 경우 AWS에서는 Kubernetes 네트워킹 리소스를 정의하고 관리하는 보다 표현적이고 유연한 방법이므로 Gateway API로 시작할 것을 권장합니다. [Kubernetes Gateway API](https://gateway-api.sigs.k8s.io/)는 Kubernetes 클러스터에서 Ingress, 로드 밸런싱 및 서비스 메시에 대한 네트워킹 리소스를 정의 및 관리하는 방법을 표준화하는 것을 목표로 합니다.

Cilium의 Ingress 또는 Gateway 기능을 활성화하면 Cilium 운영자는 클러스터의 Ingress/Gateway 객체를 조정하고 각 노드의 Envoy 프록시는 L7(계층 7) 네트워크 트래픽을 처리합니다. Cilium은 로드 밸런서와 같은 Ingress/Gateway 인프라를 직접 프로비저닝하지 않습니다. 로드 밸런서에서 Cilium Ingress/Gateway를 사용하려는 경우 일반적으로 Ingress 또는 Gateway 컨트롤러인 로드 밸런서의 도구를 사용하여 로드 밸런서의 인프라를 배포 및 관리해야 합니다.

Ingress/Gateway 트래픽의 경우 Cilium은 코어 네트워크 트래픽 및 L3/L4 정책 적용을 처리하고, 통합 Envoy 프록시는 L7 네트워크 트래픽을 처리합니다. Cilium Ingress/Gateway를 통해 Envoy는 L7 라우팅 규칙, 정책 및 요청 조작, 트래픽 분할 및 미러링과 같은 고급 트래픽 관리, TLS 종료 및 발신을 적용할 책임이 있습니다. Cilium의 Envoy 프록시는 기본적으로 별도의 DaemonSet(`cilium-envoy`)로 배포되므로 Envoy와 Cilium 에이전트를 별도로 업데이트, 확장 및 관리할 수 있습니다.

Cilium Ingress 및 Cilium Gateway의 작동 방식에 대한 자세한 내용은 Cilium 문서에서 [Cilium Ingress](https://docs.cilium.io/en/stable/network/servicemesh/ingress/) 및 [Cilium Gateway](https://docs.cilium.io/en/stable/network/servicemesh/gateway-api/gateway-api/) 페이지를 참조하세요.

## Cilium Ingress 및 Gateway 비교
<a name="hybrid-nodes-ingress-cilium-comparison"></a>

아래 표에는 **Cilium 버전 1.17.x**의 Cilium Ingress 및 Cilium Gateway 기능이 요약되어 있습니다.


| Feature | Ingress | 게이트웨이 | 
| --- | --- | --- | 
|  Service 유형 LoadBalancer  |  예  |  예  | 
|  Service 유형 NodePort  |  예  |  아니요1   | 
|  호스트 네트워크  |  예  |  예  | 
|  공유 로드 밸런서  |  예  |  예  | 
|  전용 로드 밸런서  |  예  |  아니요2   | 
|  네트워크 정책  |  예  |  예  | 
|  프로토콜  |  계층 7(HTTP(S), gRPC)  |  계층 7(HTTP(S), gRPC)3   | 
|  TLS 패스스루  |  예  |  예  | 
|  트래픽 관리  |  경로 및 호스트 라우팅  |  경로 및 호스트 라우팅, URL 리디렉션 및 재작성, 트래픽 분할, 헤더 수정  | 

 1 Cilium 버전 1.18.x에서 NodePort 서비스에 대한 Cilium Gateway 지원이 계획되어 있음([\$127273](https://github.com/cilium/cilium/pull/27273))

 2 전용 로드 밸런서에 대한 Cilium Gateway 지원([\$125567](https://github.com/cilium/cilium/issues/25567))

 3 TCP/UDP에 대한 Cilium Gateway 지원([\$121929](https://github.com/cilium/cilium/issues/21929))

## Cilium Gateway 설치
<a name="hybrid-nodes-ingress-cilium-gateway-install"></a>

### 고려 사항
<a name="_considerations_2"></a>
+ 아래 예시와 같이 `nodePort.enabled`가 `true`로 설정된 상태에서 Cilium을 구성해야 합니다. Cilium의 kube-proxy 대체 기능을 사용하는 경우 `nodePort.enabled`를 `true`로 설정할 필요가 없습니다.
+ 아래 예시와 같이 `envoy.enabled`가 `true`로 설정된 상태에서 Cilium을 구성해야 합니다.
+ Cilium Gateway는 로드 밸런서(기본값) 또는 호스트 네트워크 모드로 배포할 수 있습니다.
+ 로드 밸런서 모드에서 Cilium Gateway를 사용하는 경우 레거시 AWS 클라우드 공급자가 Cilium이 Gateway 리소스에 대해 생성하는 LoadBalancer 유형의 Service에 대해 Classic Load Balancer를 생성하지 못하도록 Gateway 리소스에 `service.beta.kubernetes.io/aws-load-balancer-type: "external"` 주석이 설정되어야 합니다.
+ 호스트 네트워크 모드에서 Cilium Gateway를 사용하는 경우 LoadBalancer 유형의 Service가 비활성화됩니다. 호스트 네트워크 모드는 로드 밸런서 인프라가 없는 환경에 유용합니다. 자세한 내용은 [호스트 네트워크](#hybrid-nodes-ingress-cilium-host-network) 섹션을 참조하세요.

### 사전 조건
<a name="_prerequisites_2"></a>

1. 명령줄 환경에 Helm이 설치되어 있습니다. [Helm 설정 지침](helm.md)을 참조하세요.

1. [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)의 지침에 따라 Cilium이 설치되어 있습니다.

### 절차
<a name="_procedure_2"></a>

1. Kubernetes Gateway API CRD(사용자 지정 리소스 정의)를 설치합니다.

   ```
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_gatewayclasses.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_gateways.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_httproutes.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_referencegrants.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_grpcroutes.yaml
   ```

1. 다음 콘텐츠를 가진 `cilium-gateway-values.yaml`이라는 파일을 생성합니다: 아래 예시에서는 기본 로드 밸런서 모드를 사용하고 하이브리드 노드에서만 실행되도록 구성된 별도의 Envoy 프록시용 `cilium-envoy` DaemonSet를 사용하도록 Cilium Gateway를 구성합니다.

   ```
   gatewayAPI:
     enabled: true
     # uncomment to use host network mode
     # hostNetwork:
     #   enabled: true
   nodePort:
     enabled: true
   envoy:
     enabled: true
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: eks.amazonaws.com/compute-type
               operator: In
               values:
               - hybrid
   ```

1. Helm 값 파일을 클러스터에 적용합니다.

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     --values cilium-gateway-values.yaml
   ```

1. Cilium 운영자, 에이전트 및 Envoy 포드가 실행 중인지 확인합니다.

   ```
   kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
   ```

   ```
   NAME                               READY   STATUS    RESTARTS   AGE
   cilium-envoy-5pgnd                 1/1     Running   0          6m31s
   cilium-envoy-6fhg4                 1/1     Running   0          6m30s
   cilium-envoy-jskrk                 1/1     Running   0          6m30s
   cilium-envoy-k2xtb                 1/1     Running   0          6m31s
   cilium-envoy-w5s9j                 1/1     Running   0          6m31s
   cilium-grwlc                       1/1     Running   0          4m12s
   cilium-operator-68f7766967-5nnbl   1/1     Running   0          4m20s
   cilium-operator-68f7766967-7spfz   1/1     Running   0          4m20s
   cilium-pnxcv                       1/1     Running   0          6m29s
   cilium-r7qkj                       1/1     Running   0          4m12s
   cilium-wxhfn                       1/1     Running   0          4m1s
   cilium-z7hlb                       1/1     Running   0          6m30s
   ```

## Cilium Gateway 구성
<a name="hybrid-nodes-ingress-cilium-gateway-configure"></a>

Cilium Gateway는 `gatewayClassName`을 `cilium`으로 설정하여 Gateway 객체에서 활성화됩니다. Cilium이 Gateway 리소스에 대해 생성하는 Service는 Gateway 객체의 필드로 구성할 수 있습니다. Gateway 컨트롤러가 로드 밸런서 인프라를 구성하는 데 사용하는 일반적인 주석은 Gateway 객체의 `infrastructure` 필드를 사용하여 구성할 수 있습니다. Cilium의 LoadBalancer IPAM을 사용하는 경우([Service 유형 LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer)의 예시 참조), LoadBalancer 유형의 Service에 사용할 IP 주소를 Gateway 객체의 `addresses` 필드에 구성할 수 있습니다. Gateway 구성에 대한 자세한 내용은 [Kubernetes Gateway API specification](https://gateway-api.sigs.k8s.io/reference/spec/#gateway) 페이지를 참조하세요.

```
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
spec:
  gatewayClassName: cilium
  infrastructure:
    annotations:
      service.beta.kubernetes.io/...
      service.kuberentes.io/...
  addresses:
  - type: IPAddress
    value: <LoadBalancer IP address>
  listeners:
  ...
```

Cilium 및 Kubernetes Gateway 사양에서는 GatewayClass, Gateway, HTTPRoute, GRPCRoute 및 ReferenceGrant 리소스를 지원합니다.
+ 사용 가능한 필드 목록은 [HTTPRoute](https://gateway-api.sigs.k8s.io/api-types/httproute/HTTPRoute) 및 [GRPCRoute](https://gateway-api.sigs.k8s.io/api-types/grpcroute/GRPCRoute) 사양을 참조하세요.
+ 이러한 리소스를 사용하고 구성하는 방법은 아래 [Cilium Gateway 배포](#hybrid-nodes-ingress-cilium-gateway-deploy) 섹션의 예시와 [Cilium 문서](https://docs.cilium.io/en/stable/network/servicemesh/gateway-api/gateway-api/#examples)의 예시를 참조하세요.

## Cilium Gateway 배포
<a name="hybrid-nodes-ingress-cilium-gateway-deploy"></a>

1. 샘플 애플리케이션을 생성합니다. 아래 예시에서는 [Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) 샘플 마이크로서비스 애플리케이션을 사용합니다.

   ```
   kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
   ```

1. 애플리케이션이 성공적으로 실행 중인지 확인합니다.

   ```
   kubectl get pods
   ```

   ```
   NAME                              READY   STATUS    RESTARTS   AGE
   details-v1-766844796b-9965p       1/1     Running   0          81s
   productpage-v1-54bb874995-jmc8j   1/1     Running   0          80s
   ratings-v1-5dc79b6bcd-smzxz       1/1     Running   0          80s
   reviews-v1-598b896c9d-vj7gb       1/1     Running   0          80s
   reviews-v2-556d6457d-xbt8v        1/1     Running   0          80s
   reviews-v3-564544b4d6-cpmvq       1/1     Running   0          80s
   ```

1. 다음 콘텐츠를 가진 `my-gateway.yaml`이라는 파일을 생성합니다: 아래 예시에서는 `service.beta.kubernetes.io/aws-load-balancer-type: "external"` 주석을 사용하여 레거시 AWS 클라우드 공급자가 Cilium이 Gateway 리소스에 대해 생성하는 LoadBalancer 유형의 Service에 대한 Classic Load Balancer를 생성하지 못하도록 합니다.

   ```
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: Gateway
   metadata:
     name: my-gateway
   spec:
     gatewayClassName: cilium
     infrastructure:
       annotations:
         service.beta.kubernetes.io/aws-load-balancer-type: "external"
     listeners:
     - protocol: HTTP
       port: 80
       name: web-gw
       allowedRoutes:
         namespaces:
           from: Same
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: HTTPRoute
   metadata:
     name: http-app-1
   spec:
     parentRefs:
     - name: my-gateway
       namespace: default
     rules:
     - matches:
       - path:
           type: PathPrefix
           value: /details
       backendRefs:
       - name: details
         port: 9080
   ```

1. Gateway 리소스를 클러스터에 적용합니다.

   ```
   kubectl apply -f my-gateway.yaml
   ```

1. Gateway 리소스와 해당 Service가 생성되었는지 확인합니다. 이 단계에서는 Gateway 리소스의 `ADDRESS` 필드가 IP 주소 또는 호스트 이름으로 채워지지 않고, Gateway 리소스에 대한 LoadBalancer 유형의 Service에 IP 주소 또는 호스트 이름이 할당되지 않을 것으로 예상됩니다.

   ```
   kubectl get gateway my-gateway
   ```

   ```
   NAME         CLASS    ADDRESS   PROGRAMMED   AGE
   my-gateway   cilium             True         10s
   ```

   ```
   kubectl get svc cilium-gateway-my-gateway
   ```

   ```
   NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
   cilium-gateway-my-gateway   LoadBalancer   172.16.227.247   <pending>     80:30912/TCP   24s
   ```

1. [Service 유형 LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer)에서 Cilium LoadBalancer IPAM에 의해 할당된 IP 주소를 사용하도록 Gateway 리소스를 구성하고, [Service 유형 NodePort](#hybrid-nodes-ingress-cilium-nodeport) 또는 [호스트 네트워크](#hybrid-nodes-ingress-cilium-host-network)에서 NodePort 또는 호스트 네트워크 주소를 사용하도록 Gateway 리소스를 구성합니다.

## Cilium Ingress 설치
<a name="hybrid-nodes-ingress-cilium-ingress-install"></a>

### 고려 사항
<a name="_considerations_3"></a>
+ 아래 예시와 같이 `nodePort.enabled`가 `true`로 설정된 상태에서 Cilium을 구성해야 합니다. Cilium의 kube-proxy 대체 기능을 사용하는 경우 `nodePort.enabled`를 `true`로 설정할 필요가 없습니다.
+ 아래 예시와 같이 `envoy.enabled`가 `true`로 설정된 상태에서 Cilium을 구성해야 합니다.
+ `ingressController.loadbalancerMode`가 `dedicated`로 설정되면 Cilium은 각 Ingress 리소스에 대한 전용 Service를 생성합니다. `ingressController.loadbalancerMode`가 `shared`로 설정되면 Cilium은 클러스터의 모든 Ingress 리소스에 대해 LoadBalancer 유형의 공유 Service를 생성합니다. `shared` 로드 밸런서 모드를 사용하는 경우 `labels`, `annotations`, `type` 및 `loadBalancerIP` 등 공유 Service에 대한 설정이 Helm 값의 `ingressController.service` 섹션에 구성됩니다. 자세한 내용은 [Cilium Helm values reference](https://github.com/cilium/cilium/blob/v1.17.6/install/kubernetes/cilium/values.yaml#L887) 페이지를 참조하세요.
+ `ingressController.default`가 `true`로 설정되면 Cilium이 클러스터의 기본 Ingress 컨트롤러로 구성되고 `ingressClassName`가 Ingress 리소스에 지정되지 않은 경우에도 Ingress 항목을 생성합니다.
+ Cilium Ingress는 로드 밸런서(기본값), 노드 포트 또는 호스트 네트워크 모드에서 배포될 수 있습니다. 호스트 네트워크 모드에서 Cilium이 설치되면 LoadBalancer 유형의 Service 및 NodePort 유형의 Service가 비활성화됩니다. 자세한 정보는 [호스트 네트워크](#hybrid-nodes-ingress-cilium-host-network)을 참조하세요.
+ 레거시 AWS 클라우드 공급자가 [Cilium Helm 차트](https://github.com/cilium/cilium/blob/main/install/kubernetes/cilium/templates/cilium-ingress-service.yaml)에서 생성된 기본 `cilium-ingress` 서비스에 대해 Classic Load Balancer를 생성하지 못하도록 항상 Helm 값에서 `ingressController.service.annotations`를 `service.beta.kubernetes.io/aws-load-balancer-type: "external"`로 설정합니다.

### 사전 조건
<a name="_prerequisites_3"></a>

1. 명령줄 환경에 Helm이 설치되어 있습니다. [Helm 설정 지침](helm.md)을 참조하세요.

1. [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)의 지침에 따라 Cilium이 설치되어 있습니다.

### 절차
<a name="_procedure_3"></a>

1. 다음 콘텐츠를 가진 `cilium-ingress-values.yaml`이라는 파일을 생성합니다: 아래 예시에서는 기본 로드 밸런서 `dedicated` 모드를 사용하고 하이브리드 노드에서만 실행되도록 구성된 별도의 Envoy 프록시용 `cilium-envoy` DaemonSet를 사용하도록 Cilium Ingress를 구성합니다.

   ```
   ingressController:
     enabled: true
     loadbalancerMode: dedicated
     service:
       annotations:
         service.beta.kubernetes.io/aws-load-balancer-type: "external"
   nodePort:
     enabled: true
   envoy:
     enabled: true
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: eks.amazonaws.com/compute-type
               operator: In
               values:
               - hybrid
   ```

1. Helm 값 파일을 클러스터에 적용합니다.

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     --values cilium-ingress-values.yaml
   ```

1. Cilium 운영자, 에이전트 및 Envoy 포드가 실행 중인지 확인합니다.

   ```
   kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
   ```

   ```
   NAME                               READY   STATUS    RESTARTS   AGE
   cilium-envoy-5pgnd                 1/1     Running   0          6m31s
   cilium-envoy-6fhg4                 1/1     Running   0          6m30s
   cilium-envoy-jskrk                 1/1     Running   0          6m30s
   cilium-envoy-k2xtb                 1/1     Running   0          6m31s
   cilium-envoy-w5s9j                 1/1     Running   0          6m31s
   cilium-grwlc                       1/1     Running   0          4m12s
   cilium-operator-68f7766967-5nnbl   1/1     Running   0          4m20s
   cilium-operator-68f7766967-7spfz   1/1     Running   0          4m20s
   cilium-pnxcv                       1/1     Running   0          6m29s
   cilium-r7qkj                       1/1     Running   0          4m12s
   cilium-wxhfn                       1/1     Running   0          4m1s
   cilium-z7hlb                       1/1     Running   0          6m30s
   ```

## Cilium Ingress 구성
<a name="hybrid-nodes-ingress-cilium-ingress-configure"></a>

Cilium Ingress는 `ingressClassName`을 `cilium`으로 설정하여 Ingress 객체에서 활성화됩니다. Cilium이 Ingress 리소스에 대해 생성하는 Service는 `dedicated` 로드 밸런서 모드를 사용할 때 Ingress 객체의 주석으로, 그리고 `shared` 로드 밸런서 모드를 사용할 때 Cilium/Helm 구성으로 구성할 수 있습니다. 이러한 주석은 일반적으로 Ingress 컨트롤러에서 로드 밸런서 인프라, 또는 서비스 유형, 로드 밸런서 모드, 포트 및 TLS 패스스루 등 Service의 기타 속성을 구성하는 데 사용됩니다. 주요 주석은 아래에서 설명합니다. 지원되는 주석의 전체 목록은 Cilium 문서의 [Cilium Ingress annotations](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#supported-ingress-annotations) 페이지를 참조하세요.


| Annotation | 설명 | 
| --- | --- | 
|   `ingress.cilium.io/loadbalancer-mode`   |   `dedicated`: 각 Ingress 리소스에 대한 LoadBalancer 유형의 전용 Service입니다(기본값).  `shared`: 모든 Ingress 리소스에 대해 LoadBalancer 유형의 단일 Service입니다.  | 
|   `ingress.cilium.io/service-type`   |   `LoadBalancer`: Service는 LoadBalancer 유형입니다(기본값).  `NodePort`: Service는 NodePort 유형입니다.  | 
|   `service.beta.kubernetes.io/aws-load-balancer-type`   |   `"external"`: 레거시 AWS 클라우드 공급자가 LoadBalancer 유형의 Service에 대해 Classic Load Balancer를 프로비저닝할 수 없습니다.  | 
|   `lbipam.cilium.io/ips`   |  Cilium LoadBalancer IPAM에서 할당할 IP 주소 목록  | 

Cilium 및 Kubernetes Ingress 사양은 Ingress 경로에 대해 정확, 접두사 및 구현별 일치 규칙을 지원합니다. Cilium은 정규식을 구현별 일치 규칙으로 지원합니다. 자세한 내용은 Cilium 문서의 [Ingress path types and precedence](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#ingress-path-types-and-precedence) 및 [Path types examples](https://docs.cilium.io/en/stable/network/servicemesh/path-types/) 페이지와 이 페이지의 [Cilium Ingress 배포](#hybrid-nodes-ingress-cilium-ingress-deploy) 섹션에 있는 예시를 참조하세요.

다음은 Cilium Ingress 객체의 예시입니다.

```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    service.beta.kuberentes.io/...
    service.kuberentes.io/...
spec:
  ingressClassName: cilium
  rules:
  ...
```

## Cilium Ingress 배포
<a name="hybrid-nodes-ingress-cilium-ingress-deploy"></a>

1. 샘플 애플리케이션을 생성합니다. 아래 예시에서는 [Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) 샘플 마이크로서비스 애플리케이션을 사용합니다.

   ```
   kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
   ```

1. 애플리케이션이 성공적으로 실행 중인지 확인합니다.

   ```
   kubectl get pods
   ```

   ```
   NAME                              READY   STATUS    RESTARTS   AGE
   details-v1-766844796b-9965p       1/1     Running   0          81s
   productpage-v1-54bb874995-jmc8j   1/1     Running   0          80s
   ratings-v1-5dc79b6bcd-smzxz       1/1     Running   0          80s
   reviews-v1-598b896c9d-vj7gb       1/1     Running   0          80s
   reviews-v2-556d6457d-xbt8v        1/1     Running   0          80s
   reviews-v3-564544b4d6-cpmvq       1/1     Running   0          80s
   ```

1. 다음 콘텐츠를 가진 `my-ingress.yaml`이라는 파일을 생성합니다: 아래 예시에서는 `service.beta.kubernetes.io/aws-load-balancer-type: "external"` 주석을 사용하여 레거시 AWS 클라우드 공급자가 Cilium이 Ingress 리소스에 대해 생성하는 LoadBalancer 유형의 Service에 대한 Classic Load Balancer를 생성하지 못하도록 합니다.

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
     annotations:
       service.beta.kubernetes.io/aws-load-balancer-type: "external"
   spec:
     ingressClassName: cilium
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

1. 클러스터에 Ingress 리소스를 적용합니다.

   ```
   kubectl apply -f my-ingress.yaml
   ```

1. Ingress 리소스와 해당 Service가 생성되었는지 확인합니다. 이 단계에서는 Ingress 리소스의 `ADDRESS` 필드가 IP 주소 또는 호스트 이름으로 채워지지 않고, Ingress 리소스에 대한 LoadBalancer 유형의 공유 또는 전용 Service에 IP 주소 또는 호스트 이름이 할당되지 않을 것으로 예상됩니다.

   ```
   kubectl get ingress my-ingress
   ```

   ```
   NAME         CLASS    HOSTS   ADDRESS   PORTS   AGE
   my-ingress   cilium   *                 80      8s
   ```

   로드 밸런서 모드 `shared` 

   ```
   kubectl -n kube-system get svc cilium-ingress
   ```

   ```
   NAME             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
   cilium-ingress   LoadBalancer   172.16.217.48   <pending>     80:32359/TCP,443:31090/TCP   10m
   ```

   로드 밸런서 모드 `dedicated` 

   ```
   kubectl -n default get svc cilium-ingress-my-ingress
   ```

   ```
   NAME                        TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
   cilium-ingress-my-ingress   LoadBalancer   172.16.193.15   <pending>     80:32088/TCP,443:30332/TCP   25s
   ```

1. [Service 유형 LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer)에서 Cilium LoadBalancer IPAM에 의해 할당된 IP 주소를 사용하도록 Ingress 리소스를 구성하고, [Service 유형 NodePort](#hybrid-nodes-ingress-cilium-nodeport) 또는 [호스트 네트워크](#hybrid-nodes-ingress-cilium-host-network)에서 NodePort 또는 호스트 네트워크 주소를 사용하도록 Ingress 리소스를 구성합니다.

## Service 유형 LoadBalancer
<a name="hybrid-nodes-ingress-cilium-loadbalancer"></a>

### 기존 로드 밸런서 인프라
<a name="_existing_load_balancer_infrastructure"></a>

기본적으로 Cilium Ingress 및 Cilium Gateway 모두에서 Cilium은 Ingress/Gateway 리소스에 대해 LoadBalancer 유형의 Kubernetes Service를 생성합니다. Cilium에서 생성하는 Service의 속성은 Ingress 및 Gateway 리소스를 통해 구성할 수 있습니다. Ingress 또는 Gateway 리소스를 생성할 때 Ingress 또는 Gateway에 대해 외부에 노출된 IP 주소 또는 호스트 이름은 일반적으로 Ingress 또는 Gateway 컨트롤러에 의해 프로비저닝되는 로드 밸런서 인프라에서 할당됩니다.

많은 Ingress 및 Gateway 컨트롤러가 주석을 사용하여 로드 밸런서 인프라를 감지 및 구성합니다. 이러한 Ingress 및 Gateway 컨트롤러에 대한 주석은 위의 이전 예시와 같이 Ingress 또는 Gateway 리소스에 구성됩니다. 지원되는 주석은 Ingress 또는 Gateway 컨트롤러 문서를 참조하고, 주로 사용하는 컨트롤러 목록은 [Kubernetes Ingress 문서](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/) 및 [Kubernetes Gateway 문서](https://gateway-api.sigs.k8s.io/implementations/)를 참조하세요.

**중요**  
Cilium Ingress 및 Gateway는 EKS Hybrid Nodes와 함께 AWS Load Balancer Controller 및 AWS NLB(Network Load Balancer)에서 사용할 수 없습니다. 함께 사용하려고 하면 NLB의 `target-type`이 `ip`로 설정된 경우 NLB가 LoadBalancer 유형의 Service를 지원하는 포드 IP에 직접 연결하려고 시도하므로 등록되지 않은 대상이 됩니다(ETS Hybrid Nodes에서 실행되는 워크로드에서 NLB를 사용하는 경우의 요구 사항).

### 로드 밸런서 인프라 없음
<a name="_no_load_balancer_infrastructure"></a>

환경에 로드 밸런서 인프라 및 해당 Ingress/Gateway 컨트롤러가 없는 경우 Cilium의 [LB IAM(로드 밸런서 IP 주소 관리)](https://docs.cilium.io/en/stable/network/lb-ipam/)을 사용하도록 Ingress/Gateway 리소스와 해당하는 LoadBalancer 유형의 Service를 구성할 수 있습니다. Cilium LB IPAM은 온프레미스 환경의 알려진 IP 주소 범위로 구성할 수 있고, Cilium의 기본 제공 Border Gateway Protocol(BGP) 지원 또는 L2 알림을 사용하여 LoadBalancer IP 주소를 온프레미스 네트워크에 알릴 수 있습니다.

아래 예시에서는 Ingress/Gateway 리소스에 사용할 IP 주소로 Cilium의 LB IPAM을 구성하는 방법과 온프레미스 네트워크로 LoadBalancer IP 주소를 알리도록 Cilium BGP Control Plane을 구성하는 방법을 보여줍니다. Cilium의 LB IPAM 기능은 기본적으로 활성화되어 있지만 `CiliumLoadBalancerIPPool` 리소스가 생성될 때까지 활성화되지 않습니다.

#### 사전 조건
<a name="_prerequisites_4"></a>
+ [Cilium Ingress 설치](#hybrid-nodes-ingress-cilium-ingress-install) 또는 [Cilium Gateway 설치](#hybrid-nodes-ingress-cilium-gateway-install)의 지침에 따라 설치된 Cilium Ingress 또는 Gateway가 설치되어 있습니다.
+ [Cilium Ingress 배포](#hybrid-nodes-ingress-cilium-ingress-deploy) 또는 [Cilium Gateway 배포](#hybrid-nodes-ingress-cilium-gateway-deploy)의 지침에 따라 Cilium Ingress 또는 Gateway 리소스에 샘플 애플리케이션이 배포되어 있습니다.
+ [하이브리드 노드에 대한 Cilium BGP 구성](hybrid-nodes-cilium-bgp.md)의 지침에 따라 Cilium BGP 컨트롤 플레인이 활성화되어 있습니다. BGP를 사용하지 않으려는 경우 이 사전 조건을 건너뛸 수 있지만 Cilium LB IPAM에서 할당한 LoadBalancer IP 주소가 온프레미스 네트워크에서 라우팅될 때까지 Ingress 또는 Gateway 리소스에 액세스할 수 없습니다.

#### 절차
<a name="_procedure_4"></a>

1. 선택적으로 Ingress 또는 Gateway 리소스 패치를 적용하여 LoadBalancer 유형의 Service에 사용할 특정 IP 주소를 요청합니다. 특정 IP 주소를 요청하지 않으면 Cilium은 후속 단계에서 `CiliumLoadBalancerIPPool` 리소스에 구성된 IP 주소 범위에서 IP 주소를 할당합니다. 아래 명령에서 `LB_IP_ADDRESS`를 LoadBalancer 유형의 Service에 요청할 IP 주소로 바꿉니다.

    **Gateway** 

   ```
   kubectl patch gateway -n default my-gateway --type=merge -p '{
     "spec": {
       "addresses": [{"type": "IPAddress", "value": "LB_IP_ADDRESS"}]
     }
   }'
   ```

    **Ingress** 

   ```
   kubectl patch ingress my-ingress --type=merge -p '{
     "metadata": {"annotations": {"lbipam.cilium.io/ips": "LB_IP_ADDRESS"}}
   }'
   ```

1. Ingress/Gateway 리소스에 대한 로드 밸런서 IP 주소 범위를 구성하는 `CiliumLoadBalancerIPPool` 리소스를 포함하여 `cilium-lbip-pool-ingress.yaml` 파일을 생성합니다.
   + Cilium Ingress를 사용하는 경우 Cilium은 Ingress 리소스에 대해 생성한 Service에 `cilium.io/ingress: "true"` 레이블을 자동으로 적용합니다. `CiliumLoadBalancerIPPool` 리소스 정의의 `serviceSelector` 필드에서 이 레이블을 사용하여 LB IPAM에 적합한 Service를 선택할 수 있습니다.
   + Cilium Gateway를 사용하는 경우 `CiliumLoadBalancerIPPool` 리소스 정의의 `serviceSelector` 필드에 있는 `gateway.networking.k8s.io/gateway-name` 레이블을 사용하여 LB IPAM에 적합한 Gateway 리소스를 선택할 수 있습니다.
   + `LB_IP_CIDR`을 로드 밸런서 IP 주소에 사용할 IP 주소 범위로 바꿉니다. 단일 IP 주소를 선택하려면 `/32` CIDR을 사용합니다. 자세한 내용은 Cilium 설명서의 [LoadBalancer IP Address Management](https://docs.cilium.io/en/stable/network/lb-ipam/) 섹션을 참조하세요.

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumLoadBalancerIPPool
     metadata:
       name: bookinfo-pool
     spec:
       blocks:
       - cidr: "LB_IP_CIDR"
       serviceSelector:
         # if using Cilium Gateway
         matchExpressions:
           - { key: gateway.networking.k8s.io/gateway-name, operator: In, values: [ my-gateway ] }
         # if using Cilium Ingress
         matchLabels:
           cilium.io/ingress: "true"
     ```

1. 클러스터에 `CiliumLoadBalancerIPPool` 리소스를 적용합니다.

   ```
   kubectl apply -f cilium-lbip-pool-ingress.yaml
   ```

1. Ingress/Gateway 리소스에 대해 Cilium LB IPAM에서 IP 주소가 할당되었는지 확인합니다.

    **Gateway** 

   ```
   kubectl get gateway my-gateway
   ```

   ```
   NAME         CLASS    ADDRESS        PROGRAMMED   AGE
   my-gateway   cilium   LB_IP_ADDRESS    True         6m41s
   ```

    **Ingress** 

   ```
   kubectl get ingress my-ingress
   ```

   ```
   NAME         CLASS    HOSTS   ADDRESS        PORTS   AGE
   my-ingress   cilium   *       LB_IP_ADDRESS   80      10m
   ```

1. Ingress/Gateway 리소스에 대한 LoadBalancer IP 주소를 알리는 `CiliumBGPAdvertisement` 리소스를 포함하여 `cilium-bgp-advertisement-ingress.yaml` 파일을 생성합니다. Cilium BGP를 사용하지 않는 경우 이 단계를 건너뛸 수 있습니다. Ingress/Gateway 리소스에 사용되는 LoadBalancer IP 주소는 마지막 단계에서 서비스를 쿼리할 수 있도록 온프레미스 네트워크에서 라우팅 가능해야 합니다.

   ```
   apiVersion: cilium.io/v2alpha1
   kind: CiliumBGPAdvertisement
   metadata:
     name: bgp-advertisement-lb-ip
     labels:
       advertise: bgp
   spec:
     advertisements:
       - advertisementType: "Service"
         service:
           addresses:
             - LoadBalancerIP
         selector:
           # if using Cilium Gateway
           matchExpressions:
             - { key: gateway.networking.k8s.io/gateway-name, operator: In, values: [ my-gateway ] }
           # if using Cilium Ingress
           matchLabels:
             cilium.io/ingress: "true"
   ```

1. 클러스터에 `CiliumBGPAdvertisement` 리소스를 적용합니다.

   ```
   kubectl apply -f cilium-bgp-advertisement-ingress.yaml
   ```

1. Cilium LB IPAM에서 할당된 IP 주소를 사용하여 Service에 액세스합니다.

   ```
   curl -s http://LB_IP_ADDRESS:80/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

## Service 유형 NodePort
<a name="hybrid-nodes-ingress-cilium-nodeport"></a>

환경에 로드 밸런서 인프라와 해당 Ingress 컨트롤러가 없는 경우, 또는 로드 밸런서 인프라를 자체 관리하거나 DNS 기반 로드 밸런싱을 사용하는 경우 Cilium Ingress를 구성하여 Ingress 리소스에 대해 NodePort 유형의 Service를 생성할 수 있습니다. Cilium Ingress에서 NodePort를 사용하는 경우 NodePort 유형의 Service는 포트 범위 30000-32767의 각 노드에 있는 포트에 노출됩니다. 이 모드에서 트래픽이 NodePort의 클러스터에 있는 노드에 도달하면 동일한 노드 또는 다른 노드에 있을 수 있는 서비스를 지원하는 포드로 전달됩니다.

**참고**  
Cilium 버전 1.18.x에서 NodePort 서비스에 대한 Cilium Gateway 지원이 계획되어 있음([\$127273](https://github.com/cilium/cilium/pull/27273))

### 사전 조건
<a name="_prerequisites_5"></a>
+ [Cilium Ingress 설치](#hybrid-nodes-ingress-cilium-ingress-install)의 지침에 따라 설치된 Cilium Ingress가 설치되어 있습니다.
+ [Cilium Ingress 배포](#hybrid-nodes-ingress-cilium-ingress-deploy)의 지침에 따라 Cilium Ingress 리소스에 샘플 애플리케이션이 배포되어 있습니다.

### 절차
<a name="_procedure_5"></a>

1. 기존 Ingress 리소스 `my-ingress`에 패치를 적용하여 Service 유형을 LoadBalancer에서 NodePort로 변경합니다.

   ```
   kubectl patch ingress my-ingress --type=merge -p '{
       "metadata": {"annotations": {"ingress.cilium.io/service-type": "NodePort"}}
   }'
   ```

   Ingress 리소스를 생성하지 않은 경우 다음 Ingress 정의를 클러스터에 적용하여 생성할 수 있습니다. 아래 Ingress 정의는 [Cilium Ingress 배포](#hybrid-nodes-ingress-cilium-ingress-deploy)에서 설명하는 Istio Bookinfo 샘플 애플리케이션을 사용합니다.

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
     annotations:
       service.beta.kubernetes.io/aws-load-balancer-type: "external"
       "ingress.cilium.io/service-type": "NodePort"
   spec:
     ingressClassName: cilium
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

1. Service 유형 NodePort를 사용하도록 Ingress 리소스에 대한 Service가 업데이트되었는지 확인합니다. 출력에서 HTTP 프로토콜의 포트를 기록합니다. 아래 예시에서 이 HTTP 포트는 `32353`이고, 이는 후속 단계에서 Service를 쿼리하는 데 사용됩니다. NodePort 유형의 Service에서 Cilium Ingress를 사용하면 Ingress 트래픽에 대한 네트워크 정책뿐만 아니라 경로 및 호스트 기반 라우팅을 적용할 수 있으며, Ingress가 없는 NodePort 유형의 표준 Service에서는 적용할 수 없습니다.

   ```
   kubectl -n default get svc cilium-ingress-my-ingress
   ```

   ```
   NAME                        TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
   cilium-ingress-my-ingress   NodePort   172.16.47.153   <none>        80:32353/TCP,443:30253/TCP   27m
   ```

1. 클러스터에서 노드의 IP 주소를 가져옵니다.

   ```
   kubectl get nodes -o wide
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
   mi-026d6a261e355fba7   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.150   <none>        Ubuntu 22.04.5 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-082f73826a163626e   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.32    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-09183e8a3d755abf6   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.33    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0d78d815980ed202d   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.97    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0daa253999fe92daa   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.100   <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   ```

1. 노드의 IP 주소와 위에서 캡처한 NodePort를 사용하여 NodePort 유형의 Service에 액세스합니다. 아래 예시에서 사용된 노드 IP 주소는 `10.80.146.32`이고 NodePort는 `32353`입니다. 이 값을 해당 환경의 값으로 바꿉니다.

   ```
   curl -s http://10.80.146.32:32353/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

## 호스트 네트워크
<a name="hybrid-nodes-ingress-cilium-host-network"></a>

NodePort 유형의 Service와 마찬가지로 로드 밸런서 인프라와 Ingress 또는 Gateway 컨트롤러가 없는 경우, 또는 외부 로드 밸런서를 사용하여 로드 밸런싱을 자체 관리하는 경우 호스트 네트워크에서 직접 Ingress 및 Gateway 리소스를 노출하도록 Cilium Ingress 및 Cilium Gateway를 구성할 수 있습니다. Ingress 또는 Gateway 리소스에 대해 호스트 네트워크 모드가 활성화되면 LoadBalancer 유형의 Service 및 NodePort 모드가 자동으로 비활성화되고, 호스트 네트워크 모드는 각 Ingress 또는 Gateway 리소스에 대해 이러한 대체 모드와 상호 배타적입니다. NodePort 유형의 Service에 비해 호스트 네트워크 모드는 추가로 유연하게 포트 범위를 사용할 수 있고(30000-32767의 NodePort 범위로 제한되지 않음) 호스트 네트워크에서 Envoy 프록시가 실행되는 노드의 하위 집합을 구성할 수 있습니다.

### 사전 조건
<a name="_prerequisites_6"></a>
+ [Cilium Ingress 설치](#hybrid-nodes-ingress-cilium-ingress-install) 또는 [Cilium Gateway 설치](#hybrid-nodes-ingress-cilium-gateway-install)의 지침에 따라 설치된 Cilium Ingress 또는 Gateway가 설치되어 있습니다.

### 절차
<a name="_procedure_6"></a>

#### 게이트웨이
<a name="_gateway"></a>

1. 다음 콘텐츠가 포함된 `cilium-gateway-host-network.yaml`이라는 파일을 생성합니다.

   ```
   gatewayAPI:
     enabled: true
     hostNetwork:
       enabled: true
       # uncomment to restrict nodes where Envoy proxies run on the host network
       # nodes:
       #   matchLabels:
       #     role: gateway
   ```

1. 호스트 네트워크 Cilium Gateway 구성을 클러스터에 적용합니다.

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     -f cilium-gateway-host-network.yaml
   ```

   Gateway 리소스를 생성하지 않은 경우 다음 Gateway 정의를 클러스터에 적용하여 생성할 수 있습니다. 아래 Gateway 정의는 [Cilium Gateway 배포](#hybrid-nodes-ingress-cilium-gateway-deploy)에서 설명하는 Istio Bookinfo 샘플 애플리케이션을 사용합니다. 아래 예시에서 Gateway 리소스는 호스트 네트워크에서 실행되는 Envoy 프록시의 공유 리스너 포트인 HTTP 리스너의 `8111` 포트를 사용하도록 구성됩니다. Gateway 리소스에 대한 권한 있는 포트(1023 미만)를 사용하는 경우 지침은 [Cilium 문서](https://docs.cilium.io/en/stable/network/servicemesh/gateway-api/gateway-api/#bind-to-privileged-port)를 참조하세요.

   ```
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: Gateway
   metadata:
     name: my-gateway
   spec:
     gatewayClassName: cilium
     listeners:
     - protocol: HTTP
       port: 8111
       name: web-gw
       allowedRoutes:
         namespaces:
           from: Same
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: HTTPRoute
   metadata:
     name: http-app-1
   spec:
     parentRefs:
     - name: my-gateway
       namespace: default
     rules:
     - matches:
       - path:
           type: PathPrefix
           value: /details
       backendRefs:
       - name: details
         port: 9080
   ```

   다음 명령을 사용하여 적용된 Cilium Envoy 구성을 관찰할 수 있습니다.

   ```
   kubectl get cec cilium-gateway-my-gateway -o yaml
   ```

   다음 명령을 사용하여 `cilium-gateway-my-gateway` Service에 대한 Envoy 리스너 포트를 가져올 수 있습니다. 이 예시에서 공유 리스너 포트는 `8111`입니다.

   ```
   kubectl get cec cilium-gateway-my-gateway -o jsonpath={.spec.services[0].ports[0]}
   ```

1. 클러스터에서 노드의 IP 주소를 가져옵니다.

   ```
   kubectl get nodes -o wide
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
   mi-026d6a261e355fba7   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.150   <none>        Ubuntu 22.04.5 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-082f73826a163626e   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.32    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-09183e8a3d755abf6   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.33    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0d78d815980ed202d   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.97    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0daa253999fe92daa   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.100   <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   ```

1. 노드의 IP 주소와 `cilium-gateway-my-gateway` 리소스의 리스너 포트를 사용하여 Service에 액세스합니다. 아래 예시에서 사용된 노드 IP 주소는 `10.80.146.32`이고 리스너 포트는 `8111`입니다. 이 값을 해당 환경의 값으로 바꿉니다.

   ```
   curl -s http://10.80.146.32:8111/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

#### Ingress
<a name="_ingress"></a>

업스트림 Cilium 문제([\$134028](https://github.com/cilium/cilium/issues/34028))로 인해 호스트 네트워크 모드의 Cilium Ingress에는 `loadbalancerMode: shared` 사용이 필요하고, 이로 인해 클러스터의 모든 Ingress 리소스에 대해 ClusterIP 유형의 단일 Service가 생성됩니다. Ingress 리소스에 대한 권한 있는 포트(1023 미만)를 사용하는 경우 지침은 [Cilium 문서](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#bind-to-privileged-port)를 참조하세요.

1. 다음 콘텐츠가 포함된 `cilium-ingress-host-network.yaml`이라는 파일을 생성합니다.

   ```
   ingressController:
     enabled: true
     loadbalancerMode: shared
     # This is a workaround for the upstream Cilium issue
     service:
       externalTrafficPolicy: null
       type: ClusterIP
     hostNetwork:
       enabled: true
       # ensure the port does not conflict with other services on the node
       sharedListenerPort: 8111
       # uncomment to restrict nodes where Envoy proxies run on the host network
       # nodes:
       #   matchLabels:
       #     role: ingress
   ```

1. 호스트 네트워크 Cilium Ingress 구성을 클러스터에 적용합니다.

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     -f cilium-ingress-host-network.yaml
   ```

   Ingress 리소스를 생성하지 않은 경우 다음 Ingress 정의를 클러스터에 적용하여 생성할 수 있습니다. 아래 Ingress 정의는 [Cilium Ingress 배포](#hybrid-nodes-ingress-cilium-ingress-deploy)에서 설명하는 Istio Bookinfo 샘플 애플리케이션을 사용합니다.

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
   spec:
     ingressClassName: cilium
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

   다음 명령을 사용하여 적용된 Cilium Envoy 구성을 관찰할 수 있습니다.

   ```
   kubectl get cec -n kube-system cilium-ingress -o yaml
   ```

   다음 명령을 사용하여 `cilium-ingress` Service에 대한 Envoy 리스너 포트를 가져올 수 있습니다. 이 예시에서 공유 리스너 포트는 `8111`입니다.

   ```
   kubectl get cec -n kube-system cilium-ingress -o jsonpath={.spec.services[0].ports[0]}
   ```

1. 클러스터에서 노드의 IP 주소를 가져옵니다.

   ```
   kubectl get nodes -o wide
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
   mi-026d6a261e355fba7   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.150   <none>        Ubuntu 22.04.5 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-082f73826a163626e   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.32    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-09183e8a3d755abf6   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.33    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0d78d815980ed202d   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.97    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0daa253999fe92daa   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.100   <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   ```

1. 노드의 IP 주소와 `cilium-ingress` 리소스의 `sharedListenerPort`를 사용하여 Service에 액세스합니다. 아래 예시에서 사용된 노드 IP 주소는 `10.80.146.32`이고 리스너 포트는 `8111`입니다. 이 값을 해당 환경의 값으로 바꿉니다.

   ```
   curl -s http://10.80.146.32:8111/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

# 하이브리드 노드에 대한 LoadBalancer 유형의 Service 구성
<a name="hybrid-nodes-load-balancing"></a>

이 주제에서는 Amazon EKS Hybrid Nodes에서 실행되는 애플리케이션에 대해 계층 4(L4) 로드 밸런싱을 구성하는 방법을 설명합니다. LoadBalancer 유형의 Kubernetes Service는 클러스터 외부에 Kubernetes 애플리케이션을 노출하는 데 사용됩니다. LoadBalancer 유형의 Service는 일반적으로 클라우드 또는 온프레미스 환경의 물리적 로드 밸런서 인프라에서 사용되어 워크로드의 트래픽을 처리합니다. 이 로드 밸런서 인프라는 일반적으로 환경별 컨트롤러로 프로비저닝됩니다.

 AWS는 EKS Hybrid Nodes에서 실행되는 LoadBalancer 유형의 Service에 대해 AWS Network Load Balancer(NLB) 및 Cilium을 지원합니다. NLB 또는 Cilium 중 무엇을 사용할지는 애플리케이션 트래픽의 소스를 기반으로 합니다. 애플리케이션 트래픽이 AWS 리전에서 발생하는 경우 AWS는 AWS NLB 및 AWS Load Balancer Controller 사용을 권장합니다. 애플리케이션 트래픽이 로컬 온프레미스 또는 엣지 환경에서 발생하는 경우 AWS는 환경에서 로드 밸런서 인프라 유무와 무관하게 사용할 수 있는 Cilium의 내장 로드 밸런싱 기능을 사용할 것을 권장합니다.

계층 7(L7) 애플리케이션 트래픽 로드 밸런싱은 [하이브리드 노드에 대한 Kubernetes Ingress 구성](hybrid-nodes-ingress.md) 섹션을 참조하세요. EKS를 사용한 로드 밸런싱에 대한 일반적인 정보는 [로드 밸런싱 운영 모범 사례](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html) 섹션을 참조하세요.

## AWS Network Load Balancer
<a name="hybrid-nodes-service-lb-nlb"></a>

하이브리드 노드에서 실행되는 워크로드의 대상 유형 `ip`에서 [AWS Load Balancer Controller](aws-load-balancer-controller.md) 및 NLB를 사용할 수 있습니다. 대상 유형 `ip`를 사용하는 경우 NLB는 Service 계층 네트워크 경로를 우회하여 트래픽을 포드로 직접 전달합니다. NLB가 하이브리드 노드의 포드 IP 대상에 도달하려면 온프레미스 포드 CIDR이 온프레미스 네트워크에서 라우팅 가능해야 합니다. 추가로 AWS Load Balancer Controller는 웹후크를 사용하며 EKS 컨트롤 플레인과의 직접 통신이 필요합니다. 자세한 내용은 [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md) 섹션을 참조하세요.
+ 서브넷 구성 요구 사항은 [Network Load Balancer를 사용하여 TCP 및 UDP 트래픽 라우팅](network-load-balancing.md) 섹션을 참조하고, [Helm을 사용하여 AWS Load Balancer Controller 설치](lbc-helm.md) 및 [로드 밸런싱 운영 모범 사례](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html) 섹션에서 AWS Network Load Balancer 및 AWS Load Balancer Controller에 대한 추가 정보를 참조하세요.
+ [AWS Load Balancer Controller NLB configurations](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/nlb/) 섹션에서 AWS Network Load Balancer를 사용하는 `LoadBalancer` 유형의 Service에 적용할 수 있는 구성을 참조하세요.

### 사전 조건
<a name="_prerequisites"></a>
+ [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)의 지침에 따라 Cilium이 설치되어 있습니다.
+ [하이브리드 노드에 대한 Cilium BGP 구성](hybrid-nodes-cilium-bgp.md)의 지침에 따라 Cilium BGP 컨트롤 플레인이 활성화되어 있습니다. BGP를 사용하지 않으려면 다른 방법을 사용하여 온프레미스 포드 CIDR이 온프레미스 네트워크에서 라우팅할 수 있도록 해야 합니다. 자세한 내용은 [라우팅 가능한 원격 포드 CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs) 섹션을 참조하세요.
+ 명령줄 환경에 Helm이 설치되어 있습니다. [Helm 설정 지침](helm.md)을 참조하세요.
+ 명령줄 환경에 eksctl이 설치되어 있습니다. [eksctl 설정 지침](install-kubectl.md#eksctl-install-update)을 참조하세요.

### 절차
<a name="_procedure"></a>

1. 사용자 대신 AWS API를 직접 호출할 수 있는 AWS 로드 밸런서 컨트롤러의 IAM 정책을 다운로드합니다.

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
   ```

1. 이전 단계에서 다운로드한 정책을 사용하여 IAM 정책을 만듭니다.

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```

1. 클러스터 이름(`CLUSTER_NAME`), AWS 리전(`AWS_REGION`) 및 AWS 계정 ID(`AWS_ACCOUNT_ID`)의 값을 사용자 설정에 맞춰 바꾸고 다음 명령을 실행합니다.

   ```
   eksctl create iamserviceaccount \
       --cluster=CLUSTER_NAME \
       --namespace=kube-system \
       --name=aws-load-balancer-controller \
       --attach-policy-arn=arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \
       --override-existing-serviceaccounts \
       --region AWS_REGION \
       --approve
   ```

1. eks-charts Helm 차트 리포지토리를 추가합니다. AWS에서는 이 리포지토리를 GitHub에 유지합니다.

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

1. 최신 차트가 적용되도록 로컬 Helm 리포지토리를 업데이트합니다.

   ```
   helm repo update eks
   ```

1. AWS 로드 밸런서 컨트롤러를 설치합니다. 클러스터 이름(`CLUSTER_NAME`), AWS 리전(`AWS_REGION`), VPC ID(`VPC_ID`) 및 AWS Load Balancer Controller Helm 차트 버전(`AWS_LBC_HELM_VERSION`)의 값을 사용자 설정에 맞춰 바꿉니다. `helm search repo eks/aws-load-balancer-controller --versions`를 실행하여 최신 버전의 Helm 차트를 찾을 수 있습니다. 하이브리드 노드와 AWS 클라우드의 노드가 모두 있는 혼합 모드 클러스터를 실행하는 경우 [AWS 로드 밸런서 컨트롤러](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-lbc)의 지침에 따라 클라우드 노드에서 AWS Load Balancer Controller를 실행할 수 있습니다.

   ```
   helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
     -n kube-system \
     --version AWS_LBC_HELM_VERSION \
     --set clusterName=CLUSTER_NAME \
     --set region=AWS_REGION \
     --set vpcId=VPC_ID \
     --set serviceAccount.create=false \
     --set serviceAccount.name=aws-load-balancer-controller
   ```

1. AWS Load Balancer Controller가 성공적으로 설치되었는지 확인합니다.

   ```
   kubectl get -n kube-system deployment aws-load-balancer-controller
   ```

   ```
   NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
   aws-load-balancer-controller   2/2     2            2           84s
   ```

1. `tcp-sample-app.yaml` 파일에서 샘플 애플리케이션을 정의합니다. 아래 예시에서는 TCP 포트와 함께 간단한 NGINX 배포를 사용합니다.

   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: tcp-sample-app
     namespace: default
   spec:
     replicas: 3
     selector:
       matchLabels:
         app: nginx
     template:
       metadata:
         labels:
           app: nginx
       spec:
         containers:
           - name: nginx
             image: public.ecr.aws/nginx/nginx:1.23
             ports:
               - name: tcp
                 containerPort: 80
   ```

1. 배포를 클러스터에 적용합니다.

   ```
   kubectl apply -f tcp-sample-app.yaml
   ```

1. `tcp-sample-service.yaml` 파일에서 배포에 대한 LoadBalancer 유형의 Service를 정의합니다.

   ```
   apiVersion: v1
   kind: Service
   metadata:
     name: tcp-sample-service
     namespace: default
     annotations:
       service.beta.kubernetes.io/aws-load-balancer-type: external
       service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
       service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
   spec:
     ports:
       - port: 80
         targetPort: 80
         protocol: TCP
     type: LoadBalancer
     selector:
       app: nginx
   ```

1. 클러스터에 Service 구성을 적용합니다.

   ```
   kubectl apply -f tcp-sample-service.yaml
   ```

1. Service에 대한 NLB를 프로비저닝하는 데 몇 분 정도 걸릴 수 있습니다. NLB가 프로비저닝되면 Service에 NLB 배포의 DNS 이름에 해당하는 주소가 할당됩니다.

   ```
   kubectl get svc tcp-sample-service
   ```

   ```
   NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP                                                                    PORT(S)        AGE
   tcp-sample-service   LoadBalancer   172.16.115.212   k8s-default-tcpsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.<region>.amazonaws.com   80:30396/TCP   8s
   ```

1. NLB의 주소를 사용하여 Service에 액세스합니다.

   ```
   curl k8s-default-tcpsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.<region>.amazonaws.com
   ```

   출력 예시는 아래와 같습니다.

   ```
   <!DOCTYPE html>
   <html>
   <head>
   <title>Welcome to nginx!</title>
   [...]
   ```

1. 생성한 리소스를 정리합니다.

   ```
   kubectl delete -f tcp-sample-service.yaml
   kubectl delete -f tcp-sample-app.yaml
   ```

## Cilium 클러스터 내 로드 밸런싱
<a name="hybrid-nodes-service-lb-cilium"></a>

Cilium은 EKS Hybrid Nodes에서 실행되는 워크로드의 클러스터 내 로드 밸런서로 사용할 수 있으며, 로드 밸런서 인프라가 없는 환경에 유용할 수 있습니다. Cilium의 로드 밸런싱 기능은 kube-proxy 대체, LoadBalancer IPAM(IP Address Management) 및 BGP Control Plane을 포함한 Cilium 기능의 조합을 기반으로 합니다. 이러한 기능의 책임은 아래에서 자세히 설명합니다.
+  **Cilium kube-proxy 대체**: 백엔드 포드로 Service 트래픽 라우팅을 처리합니다.
+  **Cilium LoadBalancer IPAM**: `LoadBalancer` 유형의 Service에 할당할 수 있는 IP 주소를 관리합니다.
+  **Cilium BGP Control Plane**: LoadBalancer IPAM이 할당한 IP 주소를 온프레미스 네트워크에 알립니다.

Cilium의 kube-proxy 대체를 사용하지 않는 경우에도 Cilium LoadBalancer IPAM 및 BGP Control Plane을 사용하여 LoadBalancer 유형의 Service에 IP 주소를 할당할 수 있습니다. Cilium의 kube-proxy 대체를 사용하지 않는 경우 백엔드 포드에 대한 Service의 로드 밸런싱은 기본적으로 EKS의 kube-proxy 및 iptables 규칙으로 처리됩니다.

### 사전 조건
<a name="_prerequisites_2"></a>
+ kube-proxy 대체 활성화 여부와 무관하게 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)의 지침에 따라 Cilium이 설치되어 있습니다. Cilium의 kube-proxy 대체 기능을 사용하려면 최소한 v4.19.57, v5.1.16 또는 v5.2.0과 같은 최신 Linux 커널을 사용하여 운영 체제를 실행해야 합니다. 하이브리드 노드에서의 사용이 지원되는 모든 최신 버전의 운영 체제는 Red Hat Enterprise Linux(RHEL) 8.x를 제외하고 이 기준을 충족합니다.
+ [하이브리드 노드에 대한 Cilium BGP 구성](hybrid-nodes-cilium-bgp.md)의 지침에 따라 Cilium BGP 컨트롤 플레인이 활성화되어 있습니다. BGP를 사용하지 않으려면 다른 방법을 사용하여 온프레미스 포드 CIDR이 온프레미스 네트워크에서 라우팅할 수 있도록 해야 합니다. 자세한 내용은 [라우팅 가능한 원격 포드 CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs) 섹션을 참조하세요.
+ 명령줄 환경에 Helm이 설치되어 있습니다. [Helm 설정 지침](helm.md)을 참조하세요.

### 절차
<a name="_procedure_2"></a>

1. LoadBalancer 유형의 Service에 대한 로드 밸런서 IP 주소 범위를 구성하는 `CiliumLoadBalancerIPPool` 리소스를 포함하여 `cilium-lbip-pool-loadbalancer.yaml` 파일을 생성합니다.
   + `LB_IP_CIDR`을 로드 밸런서 IP 주소에 사용할 IP 주소 범위로 바꿉니다. 단일 IP 주소를 선택하려면 `/32` CIDR을 사용합니다. 자세한 내용은 Cilium 설명서의 [LoadBalancer IP Address Management](https://docs.cilium.io/en/stable/network/lb-ipam/) 섹션을 참조하세요.
   + `serviceSelector` 필드는 후속 단계에서 생성할 Service의 이름과 일치하도록 구성됩니다. 이 구성을 사용하면 이 풀의 IP는 이름이 `tcp-sample-service`인 Service에만 할당됩니다.

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumLoadBalancerIPPool
     metadata:
       name: tcp-service-pool
     spec:
       blocks:
       - cidr: "LB_IP_CIDR"
       serviceSelector:
         matchLabels:
           io.kubernetes.service.name: tcp-sample-service
     ```

1. 클러스터에 `CiliumLoadBalancerIPPool` 리소스를 적용합니다.

   ```
   kubectl apply -f cilium-lbip-pool-loadbalancer.yaml
   ```

1. 풀에 사용 가능한 IP 주소가 하나 이상 있는지 확인합니다.

   ```
   kubectl get ciliumloadbalancerippools.cilium.io
   ```

   ```
   NAME               DISABLED   CONFLICTING   IPS AVAILABLE   AGE
   tcp-service-pool   false      False         1               24m
   ```

1. `CiliumBGPAdvertisement` 리소스가 포함된 `cilium-bgp-advertisement-loadbalancer.yaml` 파일을 생성하여 다음 단계에서 생성할 Service의 로드 밸런서 IP 주소를 알립니다. Cilium BGP를 사용하지 않는 경우 이 단계를 건너뛸 수 있습니다. Service에 사용되는 로드 밸런서 IP 주소는 마지막 단계에서 서비스를 쿼리할 수 있도록 온프레미스 네트워크에서 라우팅 가능해야 합니다.
   + `advertisementType` 필드는 `Service`로 설정되고 `service.addresses`는 `LoadBalancer` 유형의 Service에 대한 `LoadBalancerIP`만 알리도록 `LoadBalancerIP`로 설정됩니다.
   + `selector` 필드는 후속 단계에서 생성할 Service의 이름과 일치하도록 구성됩니다. 이 구성을 사용하면 이름이 `tcp-sample-service`인 Service의 `LoadBalancerIP`만 알립니다.

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumBGPAdvertisement
     metadata:
       name: bgp-advertisement-tcp-service
       labels:
         advertise: bgp
     spec:
       advertisements:
         - advertisementType: "Service"
           service:
             addresses:
               - LoadBalancerIP
           selector:
             matchLabels:
               io.kubernetes.service.name: tcp-sample-service
     ```

1. 클러스터에 `CiliumBGPAdvertisement` 리소스를 적용합니다. Cilium BGP를 사용하지 않는 경우 이 단계를 건너뛸 수 있습니다.

   ```
   kubectl apply -f cilium-bgp-advertisement-loadbalancer.yaml
   ```

1. `tcp-sample-app.yaml` 파일에서 샘플 애플리케이션을 정의합니다. 아래 예시에서는 TCP 포트와 함께 간단한 NGINX 배포를 사용합니다.

   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: tcp-sample-app
     namespace: default
   spec:
     replicas: 3
     selector:
       matchLabels:
         app: nginx
     template:
       metadata:
         labels:
           app: nginx
       spec:
         containers:
           - name: nginx
             image: public.ecr.aws/nginx/nginx:1.23
             ports:
               - name: tcp
                 containerPort: 80
   ```

1. 배포를 클러스터에 적용합니다.

   ```
   kubectl apply -f tcp-sample-app.yaml
   ```

1. `tcp-sample-service.yaml` 파일에서 배포에 대한 LoadBalancer 유형의 Service를 정의합니다.
   + Service 객체의 `lbipam.cilium.io/ips` 주석을 사용하여 로드 밸런서 IP 풀에서 특정 IP 주소를 요청할 수 있습니다. Service에 대한 특정 IP 주소를 요청하지 않으려면 이 주석을 제거할 수 있습니다.
   + `loadBalancerClass` 사양 필드는 레거시 AWS 클라우드 공급자가 Service에 대한 Classic Load Balancer를 생성하지 못하도록 하는 경우 필요합니다. 아래 예시에서는 Cilium의 BGP 컨트롤 플레인을 로드 밸런서 클래스로 사용하도록 `io.cilium/bgp-control-plane`가 구성됩니다. 또는 Cilium의 [L2 Announcements 기능](https://docs.cilium.io/en/latest/network/l2-announcements/)(현재 베타 버전이며, AWS에서 공식적으로 지원되지 않음)을 사용하도록 `io.cilium/l2-announcer`에 이 필드를 구성할 수 있습니다.

     ```
     apiVersion: v1
     kind: Service
     metadata:
       name: tcp-sample-service
       namespace: default
       annotations:
         lbipam.cilium.io/ips: "LB_IP_ADDRESS"
     spec:
       loadBalancerClass: io.cilium/bgp-control-plane
       ports:
         - port: 80
           targetPort: 80
           protocol: TCP
       type: LoadBalancer
       selector:
         app: nginx
     ```

1. Service를 클러스터에 적용합니다. Service는 애플리케이션에 액세스하는 데 사용할 수 있는 외부 IP 주소로 생성됩니다.

   ```
   kubectl apply -f tcp-sample-service.yaml
   ```

1. Service가 성공적으로 생성되었고 이전 단계에서 생성된 `CiliumLoadBalancerIPPool`에서 IP가 할당되었는지 확인합니다.

   ```
   kubectl get svc tcp-sample-service
   ```

   ```
   NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
   tcp-sample-service   LoadBalancer   172.16.117.76   LB_IP_ADDRESS   80:31129/TCP   14m
   ```

1. kube-proxy 대체 모드에서 Cilium을 사용하는 경우 다음 명령을 실행하여 Cilium이 Service에 대한 로드 밸런싱을 처리하고 있는지 확인할 수 있습니다. 아래 출력에서 `10.86.2.x` 주소는 Service에 대한 백엔드 포드의 포드 IP 주소입니다.

   ```
   kubectl -n kube-system exec ds/cilium -- cilium-dbg service list
   ```

   ```
   ID   Frontend               Service Type   Backend
   ...
   41   LB_IP_ADDRESS:80/TCP   LoadBalancer   1 => 10.86.2.76:80/TCP (active)
                                              2 => 10.86.2.130:80/TCP (active)
                                              3 => 10.86.2.141:80/TCP (active)
   ```

1. Cilium이 BGP를 통해 온프레미스 네트워크에 IP 주소를 알리는지 확인합니다. 아래 예시에는 5개의 하이브리드 노드가 있고, 각 노드는 `tcp-sample-service` Service에 대한 `LB_IP_ADDRESS`를 온프레미스 네트워크에 알립니다.

   ```
   Node                   VRouter      Prefix             NextHop   Age     Attrs
   mi-026d6a261e355fba7   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-082f73826a163626e   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-09183e8a3d755abf6   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-0d78d815980ed202d   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-0daa253999fe92daa   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   ```

1. 할당된 로드 밸런서 IP 주소를 사용하여 Service에 액세스합니다.

   ```
   curl LB_IP_ADDRESS
   ```

   출력 예시는 아래와 같습니다.

   ```
   <!DOCTYPE html>
   <html>
   <head>
   <title>Welcome to nginx!</title>
   [...]
   ```

1. 생성한 리소스를 정리합니다.

   ```
   kubectl delete -f tcp-sample-service.yaml
   kubectl delete -f tcp-sample-app.yaml
   kubectl delete -f cilium-lb-ip-pool.yaml
   kubectl delete -f cilium-bgp-advertisement.yaml
   ```

# 하이브리드 노드에 대한 Kubernetes 네트워크 정책 구성
<a name="hybrid-nodes-network-policies"></a>

 AWS는 Cilium을 EKS Hybrid Nodes에서 CNI로 사용할 때 포드 수신 및 송신 트래픽에 대해 Kubernetes 네트워크 정책(계층 3/계층 4)을 지원합니다. AWS 클라우드의 노드에서 EKS 클러스터를 실행하는 경우 AWS는 [Amazon VPC CNI for Kubernetes 네트워크 정책](cni-network-policy.md)을 지원합니다.

이 주제에서는 EKS Hybrid Nodes를 사용하여 Cilium 및 Kubernetes 네트워크 정책을 구성하는 방법을 설명합니다. Kubernetes 네트워크 정책에 대한 자세한 내용은 Kubernetes 문서의 [Kubernetes 네트워크 정책](https://kubernetes.io/docs/concepts/services-networking/network-policies/)을 참조하세요.

## 네트워크 정책 구성
<a name="hybrid-nodes-configure-network-policies"></a>

### 고려 사항
<a name="_considerations"></a>
+  AWS는 포드 수신 및 송신에 업스트림 Kubernetes 네트워크 정책 및 사양을 지원합니다. AWS는 현재 `CiliumNetworkPolicy` 또는 `CiliumClusterwideNetworkPolicy`를 지원하지 않습니다.
+ `policyEnforcementMode` Helm 값을 사용하여 기본 Cilium 정책 시행 동작을 제어할 수 있습니다. 기본 동작은 모든 송신 및 수신 트래픽을 허용합니다. 네트워크 정책에서 엔드포인트를 선택하면 엔드포인트는 명시적으로 허용된 트래픽만 허용되는 default-deny 상태로 전환됩니다. [기본 정책 모드](https://docs.cilium.io/en/stable/security/policy/intro/#policy-mode-default) 및 [정책 시행 모드](https://docs.cilium.io/en/stable/security/policy/intro/#policy-enforcement-modes)에 대한 자세한 내용은 Cilium 문서를 참조하세요.
+ 기존 Cilium 설치에 대해 `policyEnforcementMode`를 변경하는 경우 Cilium 에이전트 DaemonSet를 다시 시작하여 새 정책 시행 모드를 적용해야 합니다.
+ `namespaceSelector` 및 `podSelector`를 사용하여 일치하는 레이블이 있는 네임스페이스 및 포드와의 트래픽을 허용하거나 거부합니다. `namespaceSelector` 및 `podSelector`를 `matchLabels` 또는 `matchExpressions`와 함께 사용하여 레이블을 기반으로 네임스페이스 및 포드를 선택할 수 있습니다.
+ `ingress.ports` 및 `egress.ports`를 사용하여 포트 및 프로토콜과의 트래픽을 허용하거나 거부합니다.
+ `ipBlock` 필드는 포드 IP 주소([\$19209](https://github.com/cilium/cilium/issues/9209))와의 트래픽을 선택적으로 허용하거나 거부하는 데 사용할 수 없습니다. 노드 IP에 `ipBlock` 선택기를 사용하는 것은 Cilium에서 베타 기능으로 AWS에서 지원되지 않습니다.
+ Kubernetes 네트워크 정책에 사용 가능한 필드에 대한 자세한 내용은 Kubernetes 문서의 [NetworkPolicy 리소스](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource)를 참조하세요.

### 사전 조건
<a name="_prerequisites"></a>
+ [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)의 지침에 따라 Cilium이 설치되어 있습니다.
+ 명령줄 환경에 Helm이 설치되어 있습니다. [Helm 설정 지침](helm.md)을 참조하세요.

### 절차
<a name="_procedure"></a>

다음 절차에서는 구성 요소가 애플리케이션이 작동하는 데 필요한 다른 구성 요소와만 통신할 수 있도록 샘플 마이크로서비스 애플리케이션에 대한 네트워크 정책을 설정합니다. 이 절차에서는 [Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) 샘플 마이크로서비스 애플리케이션을 사용합니다.

Bookinfo 애플리케이션은 다음과 같은 관계가 있는 4개의 개별 마이크로서비스로 구성됩니다.
+  **productpage**. productpage 마이크로서비스는 세부 정보를 호출하고 마이크로서비스를 검토하여 페이지를 채웁니다.
+  **details**. details 마이크로서비스에는 책 정보가 포함됩니다.
+  **reviews**. reviews 마이크로서비스에는 책 리뷰가 포함됩니다. 또한 ratings 마이크로서비스를 호출합니다.
+  **ratings**. ratings 마이크로서비스에는 책 리뷰와 함께 제공되는 책 순위 정보가 포함됩니다.

  1. 샘플 애플리케이션을 생성합니다.

     ```
     kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
     ```

  1. 애플리케이션이 성공적으로 실행되고 있는지 확인하고 productpage 마이크로서비스의 포드 IP 주소를 기록합니다. 이 포드 IP 주소를 사용하여 후속 단계에서 각 마이크로서비스를 쿼리합니다.

     ```
     kubectl get pods -o wide
     ```

     ```
     NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE
     details-v1-766844796b-9wff2       1/1     Running   0          7s    10.86.3.7     mi-0daa253999fe92daa
     productpage-v1-54bb874995-lwfgg   1/1     Running   0          7s    10.86.2.193   mi-082f73826a163626e
     ratings-v1-5dc79b6bcd-59njm       1/1     Running   0          7s    10.86.2.232   mi-082f73826a163626e
     reviews-v1-598b896c9d-p2289       1/1     Running   0          7s    10.86.2.47    mi-026d6a261e355fba7
     reviews-v2-556d6457d-djktc        1/1     Running   0          7s    10.86.3.58    mi-0daa253999fe92daa
     reviews-v3-564544b4d6-g8hh4       1/1     Running   0          7s    10.86.2.69    mi-09183e8a3d755abf6
     ```

  1. 전체적으로 네트워크 정책을 테스트하는 데 사용할 포드를 생성합니다. 포드는 레이블이 `access: true`가 있는 `default` 네임스페이스에 생성됩니다.

     ```
     kubectl run curl-pod --image=curlimages/curl -i --tty --labels=access=true --namespace=default --overrides='{"spec": { "nodeSelector": {"eks.amazonaws.com/compute-type": "hybrid"}}}' -- /bin/sh
     ```

  1. productpage 마이크로서비스에 대한 액세스를 테스트합니다. 아래 예시에서는 productpage 포드(`10.86.2.193`)의 포드 IP 주소를 사용하여 마이크로서비스를 쿼리합니다. 이를 환경에 있는 productpage 포드의 포드 IP 주소로 바꿉니다.

     ```
     curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>"
     ```

     ```
     <title>Simple Bookstore App</title>
     ```

  1. `exit`를 입력하여 테스트 curl 포드를 종료하고 다음 명령을 실행하여 포드에 다시 연결할 수 있습니다.

     ```
     kubectl attach curl-pod -c curl-pod -i -t
     ```

  1. 다음 단계에서 네트워크 정책의 효과를 보여주기 위해 먼저 BookInfo 마이크로서비스에 대한 모든 트래픽을 거부하는 네트워크 정책을 생성합니다. deny 네트워크 정책을 정의하는 `network-policy-deny-bookinfo.yaml` 파일을 생성합니다.

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: deny-bookinfo
       namespace: default
     spec:
       podSelector:
         matchExpressions:
         - key: app
           operator: In
           values: ["productpage", "details", "reviews", "ratings"]
       policyTypes:
       - Ingress
       - Egress
     ```

  1. 클러스터에 deny 네트워크 정책을 적용합니다.

     ```
     kubectl apply -f network-policy-default-deny-bookinfo.yaml
     ```

  1. BookInfo 애플리케이션에 대한 액세스를 테스트합니다. 아래 예시에서는 productpage 포드(`10.86.2.193`)의 포드 IP 주소를 사용하여 마이크로서비스를 쿼리합니다. 이를 환경에 있는 productpage 포드의 포드 IP 주소로 바꿉니다.

     ```
     curl http://10.86.2.193:9080/productpage --max-time 10
     ```

     ```
     curl: (28) Connection timed out after 10001 milliseconds
     ```

  1. productpage 네트워크 정책을 정의하는 `network-policy-productpage.yaml` 파일을 생성합니다. 이 정책에는 다음 규칙이 있습니다.
     + 레이블 `access: true`가 있는 포드(이전 단계에서 생성된 curl 포드)의 수신 트래픽 허용
     + details, reviews 및 ratings 마이크로서비스의 경우 포트 `9080`에서 송신 TCP 트래픽 허용
     + `kube-system` 네임스페이스에서 실행되는 CoreDNS의 경우 포트 `53`에서 송신 TCP/UDP 트래픽 허용

       ```
       apiVersion: networking.k8s.io/v1
       kind: NetworkPolicy
       metadata:
         name: productpage-policy
         namespace: default
       spec:
         podSelector:
           matchLabels:
             app: productpage
         policyTypes:
         - Ingress
         - Egress
         ingress:
         - from:
           - podSelector:
               matchLabels:
                 access: "true"
         egress:
         - to:
           - podSelector:
               matchExpressions:
               - key: app
                 operator: In
                 values: ["details", "reviews", "ratings"]
           ports:
           - port: 9080
             protocol: TCP
         - to:
           - namespaceSelector:
               matchLabels:
                 kubernetes.io/metadata.name: kube-system
             podSelector:
               matchLabels:
                 k8s-app: kube-dns
           ports:
           - port: 53
             protocol: UDP
           - port: 53
             protocol: TCP
       ```

  1. 클러스터에 productpage 네트워크 정책을 적용합니다.

     ```
     kubectl apply -f network-policy-productpage.yaml
     ```

  1. curl 포드에 연결하고 Bookinfo 애플리케이션에 대한 액세스를 테스트합니다. 이제 productpage 마이크로서비스에 대한 액세스가 허용되지만 다른 마이크로서비스는 여전히 deny 네트워크 정책의 적용 대상이므로 여전히 거부됩니다. 아래 예시에서는 productpage 포드(`10.86.2.193`)의 포드 IP 주소를 사용하여 마이크로서비스를 쿼리합니다. 이를 환경에 있는 productpage 포드의 포드 IP 주소로 바꿉니다.

     ```
     kubectl attach curl-pod -c curl-pod -i -t
     ```

     ```
     curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>"
     <title>Simple Bookstore App</title>
     ```

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1
     {"error": "Sorry, product details are currently unavailable for this book."}
     ```

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/reviews
     {"error": "Sorry, product reviews are currently unavailable for this book."}
     ```

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/ratings
     {"error": "Sorry, product ratings are currently unavailable for this book."}
     ```

  1. details 네트워크 정책을 정의하는 `network-policy-details.yaml` 파일을 생성합니다. 이 정책은 productpage 마이크로서비스의 수신 트래픽만 허용합니다.

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: details-policy
       namespace: default
     spec:
       podSelector:
         matchLabels:
           app: details
       policyTypes:
       - Ingress
       ingress:
       - from:
         - podSelector:
             matchLabels:
               app: productpage
     ```

  1. reviews 네트워크 정책을 정의하는 `network-policy-reviews.yaml` 파일을 생성합니다. 이 정책은 productpage 마이크로서비스의 수신 트래픽만 허용하고 ratings 마이크로서비스 및 CoreDNS로의 송신 트래픽만 허용합니다.

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: reviews-policy
       namespace: default
     spec:
       podSelector:
         matchLabels:
           app: reviews
       policyTypes:
       - Ingress
       - Egress
       ingress:
       - from:
         - podSelector:
             matchLabels:
               app: productpage
       egress:
       - to:
         - podSelector:
             matchLabels:
               app: ratings
       - to:
         - namespaceSelector:
             matchLabels:
               kubernetes.io/metadata.name: kube-system
           podSelector:
             matchLabels:
               k8s-app: kube-dns
         ports:
         - port: 53
           protocol: UDP
         - port: 53
           protocol: TCP
     ```

  1. ratings 네트워크 정책을 정의하는 `network-policy-ratings.yaml` 파일을 생성합니다. 이 정책은 productpage 및 reviews 마이크로서비스의 수신 트래픽만 허용합니다.

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: ratings-policy
       namespace: default
     spec:
       podSelector:
         matchLabels:
           app: ratings
       policyTypes:
       - Ingress
       ingress:
       - from:
         - podSelector:
             matchExpressions:
             - key: app
               operator: In
               values: ["productpage", "reviews"]
     ```

  1. details, reviews 및 ratings 네트워크 정책을 클러스터에 적용합니다.

     ```
     kubectl apply -f network-policy-details.yaml
     kubectl apply -f network-policy-reviews.yaml
     kubectl apply -f network-policy-ratings.yaml
     ```

  1. curl 포드에 연결하고 Bookinfo 애플리케이션에 대한 액세스를 테스트합니다. 아래 예시에서는 productpage 포드(`10.86.2.193`)의 포드 IP 주소를 사용하여 마이크로서비스를 쿼리합니다. 이를 환경에 있는 productpage 포드의 포드 IP 주소로 바꿉니다.

     ```
     kubectl attach curl-pod -c curl-pod -i -t
     ```

     details 마이크로서비스를 테스트합니다.

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1
     ```

     ```
     {"id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890"}
     ```

     reviews 마이크로서비스를 테스트합니다.

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/reviews
     ```

     ```
     {"id": "1", "podname": "reviews-v1-598b896c9d-p2289", "clustername": "null", "reviews": [{"reviewer": "Reviewer1", "text": "An extremely entertaining play by Shakespeare. The slapstick humour is refreshing!"}, {"reviewer": "Reviewer2", "text": "Absolutely fun and entertaining. The play lacks thematic depth when compared to other plays by Shakespeare."}]}
     ```

     ratings 마이크로서비스를 테스트합니다.

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/ratings
     ```

     ```
     {"id": 1, "ratings": {"Reviewer1": 5, "Reviewer2": 4}}
     ```

  1. 절차 도중 생성한 리소스를 정리합니다.

     ```
     kubectl delete -f network-policy-deny-bookinfo.yaml
     kubectl delete -f network-policy-productpage.yaml
     kubectl delete -f network-policy-details.yaml
     kubectl delete -f network-policy-reviews.yaml
     kubectl delete -f network-policy-ratings.yaml
     kubectl delete -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
     kubectl delete pod curl-pod
     ```

# 하이브리드 노드의 개념
<a name="hybrid-nodes-concepts"></a>

*Amazon EKS Hybrid Nodes*를 사용하면 온프레미스 또는 엣지 환경에서 실행되는 물리적 또는 가상 머신을 AWS 클라우드에서 실행되는 Amazon EKS 클러스터에 조인할 수 있습니다. 이 접근 방식은 많은 이점을 제공하지만 단일 네트워크 환경에서 Kubernetes 클러스터를 실행하는 데 익숙한 사용자를 위한 새로운 네트워킹 개념과 아키텍처도 도입합니다.

다음 섹션에서는 EKS Hybrid Nodes의 Kubernetes 및 네트워킹 개념을 자세히 살펴보고 하이브리드 아키텍처를 통해 트래픽이 흐르는 방식을 자세히 설명합니다. 이 섹션에서는 포드, 노드, 서비스, Kubernetes 컨트롤 플레인, kubelet 및 kube-proxy의 개념과 같은 기본 Kubernetes 네트워킹 지식을 숙지해야 합니다.

[하이브리드 노드의 네트워킹 개념](hybrid-nodes-concepts-networking.md)부터 시작하여, [하이브리드 노드에 대한 Kubernetes 개념](hybrid-nodes-concepts-kubernetes.md), 마지막으로 [하이브리드 노드의 네트워크 트래픽 흐름](hybrid-nodes-concepts-traffic-flows.md) 순으로 이 페이지를 읽는 것이 좋습니다.

**Topics**
+ [하이브리드 노드의 네트워킹 개념](hybrid-nodes-concepts-networking.md)
+ [하이브리드 노드에 대한 Kubernetes 개념](hybrid-nodes-concepts-kubernetes.md)
+ [하이브리드 노드의 네트워크 트래픽 흐름](hybrid-nodes-concepts-traffic-flows.md)

# 하이브리드 노드의 네트워킹 개념
<a name="hybrid-nodes-concepts-networking"></a>

이 섹션에서는 EKS Hybrid Nodes용 네트워크 토폴로지를 설계할 때 고려해야 하는 핵심 네트워킹 개념과 제약 조건을 자세히 설명합니다.

## EKS Hybrid Nodes의 네트워킹 개념
<a name="_networking_concepts_for_eks_hybrid_nodes"></a>

![\[개략적인 하이브리드 노드 네트워크 다이어그램\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-nodes-highlevel-network.png)


 **네트워크 허브로서의 VPC** 

클라우드 경계를 통과하는 모든 트래픽은 VPC를 통해 라우팅됩니다. 여기에는 AWS에서 실행되는 EKS 컨트롤 플레인 또는 포드와 해당 포드에서 실행되는 하이브리드 노드 또는 포드 간의 트래픽이 포함됩니다. 클러스터의 VPC는 ​​하이브리드 노드와 나머지 클러스터 사이의 네트워크 허브라고 생각할 수 있습니다. 이 아키텍처를 사용하면 트래픽과 라우팅을 완벽하게 제어할 수 있지만 VPC에 대한 경로, 보안 그룹 및 방화벽을 올바르게 구성하는 것도 사용자의 책임입니다.

 **VPC에 대한 EKS 컨트롤 플레인** 

EKS 컨트롤 플레인은 VPC에 **탄력적 네트워크 인터페이스(ENI)**를 연결합니다. 이러한 ENI는 EKS API 서버와의 트래픽을 처리합니다. EKS는 클러스터 생성 시 전달한 서브넷에 ENI를 연결하므로 클러스터를 구성할 때 EKS 컨트롤 플레인 ENI의 배치를 제어할 수 있습니다.

EKS는 서브넷에 연결하는 ENI에 보안 그룹을 연결합니다. 이러한 보안 그룹은 ENI를 통해 EKS 컨트롤 플레인을 오가는 트래픽을 허용합니다. 이는 EKS Hybrid Nodes에 중요합니다. 하이브리드 노드와 해당 노드에서 실행되는 포드에서 EKS 컨트롤 플레인 ENI로의 트래픽을 허용해야 하기 때문입니다.

 **원격 노드 네트워크** 

원격 노드 네트워크, 특히 원격 노드 CIDR은 하이브리드 노드로 사용하는 머신에 할당된 IP의 범위입니다. 하이브리드 노드를 프로비저닝하면 해당 노드는 EKS 컨트롤 플레인 및 VPC와 다른 네트워크 도메인인 온프레미스 데이터 센터 또는 엣지 로케이션에 상주합니다. 각 하이브리드 노드에는 VPC의 서브넷과 구별되는 원격 노드 CIDR의 IP 주소 또는 주소가 있습니다.

EKS가 kubelet API에 대한 요청과 같이 클러스터 VPC를 통해 하이브리드 노드 IP로 향하는 모든 트래픽을 라우팅하는 것을 알도록 이러한 원격 노드 CIDR로 EKS 클러스터를 구성합니다. `kubelet` API에 대한 연결은 `kubectl attach`, `kubectl cp`, `kubectl exec`, `kubectl logs`, `kubectl port-forward` 명령에서 사용됩니다.

 **원격 포드 네트워크** 

원격 포드 네트워크는 하이브리드 노드에서 실행되는 포드에 할당된 IP의 범위입니다. 일반적으로 이러한 범위로 CNI를 구성하면 CNI의 IP Address Manager(IPAM) 기능이 이러한 범위의 조각을 각 하이브리드 노드에 할당합니다. 포드를 생성하면 CNI는 포드가 예약된 노드에 할당된 조각에서 포드에 IP를 할당합니다.

이러한 원격 포드 CIDR로 EKS 클러스터를 구성하면 EKS 컨트롤 플레인이 웹후크와의 통신과 같이 클러스터의 VPC를 통해 하이브리드 노드에서 실행되는 포드로 향하는 모든 트래픽을 라우팅하는 것을 압니다.

![\[원격 포드 네트워크\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-nodes-remote-pod-cidrs.png)


 **온프레미스에서 VPC로** 

하이브리드 노드에 사용하는 온프레미스 네트워크는 EKS 클러스터에 사용하는 VPC로 라우팅해야 합니다. 온프레미스 네트워크를 VPC에 연결하는 데 사용할 수 있는 여러 가지 [네트워크-Amazon VPC 연결 옵션](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)이 있습니다. 자체 VPN 솔루션을 사용할 수도 있습니다.

VPC와 온프레미스 네트워크의 AWS 클라우드 측에서 라우팅을 올바르게 구성하는 것이 중요합니다. 이렇게 하면 두 네트워크 모두 두 네트워크의 연결을 통해 올바른 트래픽을 라우팅할 수 있습니다.

VPC에서 원격 노드 및 원격 포드 네트워크로 이동하는 모든 트래픽은 연결을 통해 온프레미스 네트워크(‘게이트웨이’라고 함)로 라우팅되어야 합니다. 일부 서브넷의 라우팅 테이블이 다른 경우 하이브리드 노드의 경로와 해당 노드에서 실행되는 포드로 각 라우팅 테이블을 구성해야 합니다. 이는 EKS 컨트롤 플레인 ENI가 연결된 서브넷과 하이브리드 노드와 통신해야 하는 EC2 노드 또는 포드가 포함된 서브넷에 해당합니다.

온프레미스 네트워크에서 EKS 클러스터의 VPC 및 하이브리드 노드에 필요한 기타 AWS 서비스와의 트래픽을 허용하도록 네트워크를 구성해야 합니다. EKS 클러스터의 트래픽은 게이트웨이를 양방향으로 통과합니다.

## 네트워킹 제약 조건
<a name="_networking_constraints"></a>

 **완전히 라우팅된 네트워크** 

주요 제약 조건은 EKS 컨트롤 플레인과 모든 노드, 클라우드 또는 하이브리드 노드가 **완전히 라우팅**된 네트워크를 구성해야 한다는 것입니다. 즉, 모든 노드가 IP 주소를 기준으로 계층 3에서 서로 연결할 수 있어야 합니다.

EKS 컨트롤 플레인과 클라우드 노드는 일반 네트워크(VPC)에 있기 때문에 이미 서로 연결할 수 있습니다. 그러나 하이브리드 노드는 다른 네트워크 도메인에 있습니다. 따라서 하이브리드 노드와 클러스터의 나머지 부분 간에 트래픽을 라우팅하려면 VPC 및 온프레미스 네트워크에서 추가 라우팅을 구성해야 합니다. 하이브리드 노드가 서로 및 VPC에서 연결 가능한 경우 하이브리드 노드는 단일 일반 네트워크 또는 여러 세그먼트 네트워크에 있을 수 있습니다.

 **라우팅 가능한 원격 포드 CIDR** 

EKS 컨트롤 플레인이 하이브리드 노드(예: 웹후크 또는 지표 서버)에서 실행되는 포드와 통신하거나 클라우드 노드에서 실행되는 포드가 하이브리드 노드에서 실행되는 포드와 통신하려면(워크로드 동서 통신) 원격 포드 CIDR이 VPC에서 라우팅 가능해야 합니다. 즉, VPC는 게이트웨이를 통해 온프레미스 네트워크로 포드 CIDR로 트래픽을 라우팅할 수 있어야 하며 온프레미스 네트워크는 포드의 트래픽을 올바른 노드로 라우팅할 수 있어야 합니다.

VPC의 포드 라우팅 요구 사항과 온프레미스의 포드 라우팅 요구 사항을 구분하는 것이 중요합니다. VPC는 원격 포드로 이동하는 모든 트래픽이 게이트웨이를 통과해야 한다는 것을 알기만 하면 됩니다. 원격 포드 CIDR이 하나만 있는 경우 경로가 하나만 필요합니다.

이 요구 사항은 온프레미스 네트워크의 모든 홉에서 하이브리드 노드와 동일한 서브넷의 로컬 라우터까지 적용됩니다. 이는 각 노드에 할당된 포드 CIDR 조각을 인식해야 하는 유일한 라우터로, 특정 포드에 대한 트래픽이 포드가 예약된 노드로 전달되도록 합니다.

로컬 온프레미스 라우터에서 VPC 라우팅 테이블로 온프레미스 포드 CIDR에 대한 이러한 경로를 전파하도록 선택할 수 있지만 반드시 그럴 필요는 없습니다. 온프레미스 포드 CIDR이 자주 변경되고 VPC 라우팅 테이블을 변경된 포드 CIDR을 반영하도록 업데이트해야 하는 경우 온프레미스 포드 CIDR을 VPC 라우팅 테이블로 전파하는 것이 좋지만 이는 흔하지 않습니다.

온프레미스 포드 CIDR을 라우팅 가능하게 만드는 제약 조건은 선택 사항입니다. 하이브리드 노드에서 웹후크를 실행할 필요가 없거나 클라우드 노드의 포드가 하이브리드 노드의 포드와 통신하는 경우 온프레미스 네트워크에서 포드 CIDR에 대한 라우팅을 구성할 필요가 없습니다.

 *온프레미스 포드 CIDR을 하이브리드 노드로 라우팅해야 하는 이유는 무엇인가요?*

클라우드 노드에 VPC CNI와 함께 EKS를 사용하는 경우 VPC CNI는 VPC에서 포드에 IP를 직접 할당합니다. 즉, 클라우드 포드와 EKS 컨트롤 플레인 모두 포드 IP에 직접 도달할 수 있으므로 특별한 라우팅이 필요하지 않습니다.

온프레미스 및 클라우드의 다른 CNI에서 실행하는 경우 포드는 일반적으로 격리된 오버레이 네트워크에서 실행되고 CNI는 포드 간 트래픽 전달을 처리합니다. 이는 일반적으로 캡슐화를 통해 수행됩니다. CNI는 포드 간 트래픽을 노드 간 트래픽으로 변환하여 양쪽 끝에서 캡슐화 및 캡슐화 해제를 처리합니다. 이렇게 하면 노드 및 라우터에서 추가 구성이 필요하지 않습니다.

하이브리드 노드를 사용한 네트워킹은 두 가지 토폴로지의 조합을 제공한다는 점에서 독특합니다. EKS 컨트롤 플레인과 클라우드 노드(VPC CNI 사용)는 노드와 포드를 포함한 플랫 네트워크를 기대하는 반면, 하이브리드 노드에서 실행되는 포드는 캡슐화를 위해 VXLAN을 사용하여 오버레이 네트워크에 있습니다(기본적으로 Cilium에서). 온프레미스 네트워크가 VPC로 라우팅될 수 있다고 가정하면 하이브리드 노드에서 실행되는 포드는 EKS 컨트롤 플레인과 클라우드 노드에서 실행되는 포드에 도달할 수 있습니다. 그러나 온프레미스 네트워크의 포드 CIDR에 대한 라우팅이 없으면 네트워크가 오버레이 네트워크에 도달하고 올바른 노드로 라우팅하는 방법을 모르는 경우 온프레미스 포드 IP로 다시 들어오는 모든 트래픽이 결국 삭제됩니다.

# 하이브리드 노드에 대한 Kubernetes 개념
<a name="hybrid-nodes-concepts-kubernetes"></a>

이 페이지에서는 EKS Hybrid Nodes 시스템 아키텍처의 기반이 되는 주요 Kubernetes 개념을 자세히 설명합니다.

## VPC의 EKS 컨트롤 플레인
<a name="hybrid-nodes-concepts-k8s-api"></a>

EKS 컨트롤 플레인 ENI의 IP는 `default` 네임스페이스의 `kubernetes` `Endpoints` 객체에 저장됩니다. EKS는 새 ENI를 생성하거나 이전 ENI를 제거할 때 IP 목록이 항상 최신 상태로 유지되도록 이 객체를 업데이트합니다.

이러한 엔드포인트는 `default` 네임스페이스에서도 `kubernetes` 서비스를 통해 사용할 수 있습니다. `ClusterIP` 유형의 이 서비스는 항상 클러스터 서비스 CIDR의 첫 번째 IP 주소를 할당받습니다. 예를 들어 서비스 CIDR `172.16.0.0/16`의 경우 서비스 IP는 `172.16.0.1`이 됩니다.

일반적으로 이 방식으로 포드(클라우드 또는 하이브리드 노드에서 실행되는지 여부에 관계 없음)가 EKS Kubernetes API 서버에 액세스합니다. 포드는 서비스 IP를 대상 IP로 사용하며, 이는 EKS 컨트롤 플레인 ENI 중 하나의 실제 IP로 변환됩니다. 프라이머리 예외는 `kube-proxy`인데, 이는 변환을 설정하기 때문입니다.

## EKS API 서버 엔드포인트
<a name="hybrid-nodes-concepts-k8s-eks-api"></a>

`kubernetes` 서비스 IP가 EKS API 서버에 액세스하는 유일한 방법은 아닙니다. 또한 EKS는 클러스터를 생성할 때 Route53 DNS 이름을 생성합니다. 이는 EKS `DescribeCluster` API 작업을 직접적으로 호출할 때 EKS 클러스터의 `endpoint` 필드입니다.

```
{
    "cluster": {
        "endpoint": "https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.gr7.us-west-2.eks.amazonaws.com",
        "name": "my-cluster",
        "status": "ACTIVE"
    }
}
```

퍼블릭 엔드포인트 액세스 또는 퍼블릭 및 프라이빗 엔드포인트 액세스 클러스터에서 하이브리드 노드는 기본적으로 이 DNS 이름을 인터넷을 통해 라우팅 가능한 퍼블릭 IP로 확인합니다. 프라이빗 엔드포인트 액세스 클러스터에서 DNS 이름은 EKS 컨트롤 플레인 ENI의 프라이빗 IP로 확인됩니다.

이것이 `kubelet`과 `kube-proxy`가 Kubernetes API 서버에 액세스하는 방식입니다. 모든 Kubernetes 클러스터 트래픽이 VPC를 통해 흐르도록 하려면 클러스터를 프라이빗 액세스 모드로 구성하거나 온프레미스 DNS 서버를 수정하여 EKS 클러스터 엔드포인트를 EKS 컨트롤 플레인 ENI의 프라이빗 IP로 확인해야 합니다.

## `kubelet` 엔드포인트
<a name="hybrid-nodes-concepts-k8s-kubelet-api"></a>

`kubelet`은 여러 REST 엔드포인트를 노출하여 시스템의 다른 부분이 각 노드와 상호 작용하고 정보를 수집할 수 있도록 합니다. 대부분의 클러스터에서 `kubelet` 서버로 전송되는 트래픽의 대부분은 컨트롤 플레인에서 발생하지만, 특정 모니터링 에이전트도 kubelet 서버와 상호 작용할 수 있습니다.

이 인터페이스를 통해 `kubelet`은 로그 가져오기(`kubectl logs`), 컨테이너 내부에서 명령 실행(`kubectl exec`), 포트 포워딩 트래픽(`kubectl port-forward`) 등 다양한 요청을 처리합니다. 이러한 각 요청은 `kubelet`을 통해 기본 컨테이너 런타임과 상호 작용하여 클러스터 관리자와 개발자에게 원활하게 나타납니다.

이 API의 가장 일반적인 소비자는 Kubernetes API 서버입니다. 앞서 언급한 `kubectl` 명령 중 하나를 사용할 때 `kubectl`은 API 서버에 API 요청을 보낸 다음 포드가 실행되고 있는 노드의 `kubelet` API를 직접적으로 호출합니다. 이것이 EKS 컨트롤 플레인에서 노드 IP에 도달할 수 있어야 하는 주된 이유이며, 노드 경로가 잘못 구성되면 포드가 실행 중이더라도 로그나 `exec`에 접근할 수 없는 이유이기도 합니다.

 **노드 IP** 

EKS 컨트롤 플레인이 노드와 통신할 때 `Node` 객체 상태(`status.addresses`)에 보고된 주소 중 하나를 사용합니다.

EKS 클라우드 노드를 사용하면 노드 등록 중 kubelet이 EC2 인스턴스의 프라이빗 IP를 `InternalIP`로 보고하는 것이 일반적입니다. 이후 Cloud Controller Manager(CCM)가 이 IP를 검증하여 해당 IP가 EC2 인스턴스에 속하는지 확인합니다. 또한 CCM은 일반적으로 인스턴스의 퍼블릭 IP(`ExternalIP`)와 DNS 이름(`InternalDNS` 및 `ExternalDNS`)을 노드 상태에 추가합니다.

그러나 하이브리드 노드용 CCM은 없습니다. EKS Hybrid Nodes CLI(`nodeadm`)를 사용하여 하이브리드 노드를 등록하면 CCM 없이 노드 상태에서 머신의 IP를 직접 보고하도록 kubelet이 구성됩니다.

```
apiVersion: v1
kind: Node
metadata:
  name: my-node-1
spec:
  providerID: eks-hybrid:///us-west-2/my-cluster/my-node-1
status:
  addresses:
  - address: 10.1.1.236
    type: InternalIP
  - address: my-node-1
    type: Hostname
```

머신에 여러 IP가 있는 경우 kubelet은 자체 로직에 따라 IP 중 하나를 선택합니다. `spec.kubelet.flags`의 `nodeadm` 구성에서 전달할 수 있는 `--node-ip` 플래그를 사용하여 선택한 IP를 제어할 수 있습니다. `Node` 객체에 보고된 IP에만 VPC의 경로가 필요합니다. 머신에는 클라우드에서 연결할 수 없는 다른 IP가 있을 수 있습니다.

## `kube-proxy`
<a name="hybrid-nodes-concepts-k8s-kube-proxy"></a>

 `kube-proxy`는 각 노드의 네트워킹 계층에서 서비스 추상화 구현을 담당합니다. 또한 Kubernetes Services로 향하는 트래픽에 대한 네트워크 프록시 및 로드 밸런서 역할을 합니다. `kube-proxy`는 Kubernetes API 서버에서 서비스 및 엔드포인트와 관련된 변경 사항을 지속적으로 감시해서 기본 호스트의 네트워킹 규칙을 동적으로 업데이트하여 트래픽이 제대로 전달되도록 합니다.

`iptables` 모드에서 `kube-proxy`는 여러 개의 `netfilter` 체인을 프로그래밍하여 서비스 트래픽을 처리합니다. 규칙은 다음과 같은 계층 구조를 형성합니다.

1.  **KUBE-SERVICES 체인**: 모든 서비스 트래픽의 진입점입니다. 각 서비스의 `ClusterIP` 및 포트와 일치하는 규칙이 있습니다.

1.  **KUBE-SVC-XXX 체인**: 서비스별 체인에는 각 서비스에 대한 로드 밸런싱 규칙이 있습니다.

1.  **KUBE-SEP-XXX 체인**: 엔드포인트별 체인에는 실제 `DNAT` 규칙이 있습니다.

`default` 네임스페이스의 서비스 `test-server`에서 어떤 일이 발생하는지 살펴보겠습니다. \$1 서비스 클러스터 IP: `172.16.31.14` \$1 서비스 포트: `80` \$1 백업 포드: `10.2.0.110`, `10.2.1.39` 및 `10.2.2.254` 

`iptables` 규칙을 검사할 때(`iptables-save 0 grep -A10 KUBE-SERVICES` 사용)

1. **KUBE-SERVICES** 체인에서 서비스와 일치하는 규칙을 찾습니다.

   ```
   -A KUBE-SERVICES -d 172.16.31.14/32 -p tcp -m comment --comment "default/test-server cluster IP" -m tcp --dport 80 -j KUBE-SVC-XYZABC123456
   ```
   + 이 규칙은 172.16.31.14:80을 대상으로 하는 패킷과 일치합니다.
   + 주석은 이 규칙의 용도를 나타냅니다(`default/test-server cluster IP`).
   + 일치하는 패킷은 `KUBE-SVC-XYZABC123456` 체인으로 이동합니다.

1. **KUBE-SVC-XYZABC123456** 체인에는 확률 기반 로드 밸런싱 규칙이 있습니다.

   ```
   -A KUBE-SVC-XYZABC123456 -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-POD1XYZABC
   -A KUBE-SVC-XYZABC123456 -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-POD2XYZABC
   -A KUBE-SVC-XYZABC123456 -j KUBE-SEP-POD3XYZABC
   ```
   + 첫 번째 규칙: 33.3%의 확률로 `KUBE-SEP-POD1XYZABC`로 이동합니다.
   + 두 번째 규칙: 50%의 확률로 나머지 트래픽(전체의 33.3%)이 `KUBE-SEP-POD2XYZABC`로 이동합니다.
   + 마지막 규칙: 나머지 모든 트래픽(전체의 33.3%)이 `KUBE-SEP-POD3XYZABC`로 이동합니다.

1. 개별 **KUBE-SEP-XXX** 체인이 DNAT(Destination NAT)를 수행합니다.

   ```
   -A KUBE-SEP-POD1XYZABC -p tcp -m tcp -j DNAT --to-destination 10.2.0.110:80
   -A KUBE-SEP-POD2XYZABC -p tcp -m tcp -j DNAT --to-destination 10.2.1.39:80
   -A KUBE-SEP-POD3XYZABC -p tcp -m tcp -j DNAT --to-destination 10.2.2.254:80
   ```
   + 이러한 DNAT 규칙은 대상 IP와 포트를 다시 작성하여 트래픽을 특정 포드로 전달합니다.
   + 각 규칙은 트래픽의 약 33.3%를 처리하여 `10.2.0.110`, `10.2.1.39` 및 `10.2.2.254` 간에 균일한 로드 밸런싱을 제공합니다.

이러한 멀티 레벨 체인 구조를 통해 `kube-proxy`는 데이터 경로에 프록시 프로세스가 필요 없이 커널 레벨 패킷 조작을 통해 서비스 로드 밸런싱 및 리디렉션을 효율적으로 구현할 수 있습니다.

### Kubernetes 작업에 미치는 영향
<a name="hybrid-nodes-concepts-k8s-operations"></a>

노드에서 `kube-proxy`가 손상되면 해당 노드가 서비스 트래픽을 제대로 라우팅할 수 없어 클러스터 서비스에 의존하는 포드에 제한 시간 초과나 연결 실패가 발생합니다. 이는 노드가 처음 등록될 때 특히 방해가 될 수 있습니다. CNI는 포드 네트워킹을 구성하기 전에 노드의 포드 CIDR과 같은 정보를 얻기 위해 Kubernetes API 서버와 통신해야 합니다. 이를 위해 CNI는 `kubernetes` 서비스 IP를 사용합니다. 그러나 `kube-proxy`가 시작되지 못하거나 올바른 `iptables` 규칙을 설정하지 못한 경우 `kubernetes` 서비스 IP로 전송되는 요청은 EKS 컨트롤 플레인 ENI의 실제 IP로 변환되지 않습니다. 따라서 CNI는 충돌 루프에 들어가고 포드 중 어느 것도 제대로 실행되지 않습니다.

포드가 `kubernetes` 서비스 IP를 사용하여 Kubernetes API 서버와 통신한다는 것을 알고 있지만, 이를 작동시키려면 먼저 `kube-proxy`가 `iptables` 규칙을 설정해야 합니다.

`kube-proxy`는 API 서버와 어떻게 통신하나요?

`kube-proxy`는 Kubernetes API 서버의 실제 IP 또는 해당 IP로 확인되는 DNS 이름을 사용하도록 구성해야 합니다. EKS의 경우 EKS는 클러스터 생성 시 EKS가 생성하는 Route53 DNS 이름을 가리키도록 기본 `kube-proxy`를 구성합니다. 이 값은 `kube-system` 네임스페이스의 `kube-proxy` ConfigMap에서 확인할 수 있습니다. 이 ConfigMap의 내용은 `kube-proxy` 포드에 삽입되는 `kubeconfig`이므로 `clusters0.cluster.server` 필드를 확인하세요. 이 값은 EKS `DescribeCluster` API 직접 호출 시 EKS 클러스터의 `endpoint` 필드와 일치합니다.

```
apiVersion: v1
data:
  kubeconfig: |-
    kind: Config
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        server: https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.gr7.us-west-2.eks.amazonaws.com
      name: default
    contexts:
    - context:
        cluster: default
        namespace: default
        user: default
      name: default
    current-context: default
    users:
    - name: default
      user:
        tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
kind: ConfigMap
metadata:
  name: kube-proxy
  namespace: kube-system
```

## 라우팅 가능한 원격 포드 CIDR
<a name="hybrid-nodes-concepts-k8s-pod-cidrs"></a>

이 [하이브리드 노드의 네트워킹 개념](hybrid-nodes-concepts-networking.md) 페이지에서는 하이브리드 노드에서 웹후크를 실행하거나 클라우드 노드에서 실행되는 포드가 하이브리드 노드에서 실행되는 포드와 통신하도록 하는 요구 사항을 자세히 설명합니다. 핵심 요구 사항은 온프레미스 라우터가 특정 포드 IP를 담당하는 노드를 알아야 한다는 것입니다. Border Gateway Protocol(BGP), 정적 경로, 주소 확인 프로토콜(ARP) 프록시 등 이를 달성하는 방법에는 여러 가지가 있습니다. 이들은 다음 섹션에서 다룹니다.

 **Border Gateway Protocol(BGP)** 

CNI가 이를 지원하는 경우(예: Cilium 및 Calico), CNI의 BGP 모드를 사용하여 노드에서 로컬 라우터로 노드별 포드 CIDR에 대한 경로를 전파할 수 있습니다. CNI의 BGP 모드를 사용할 때 CNI는 가상 라우터 역할을 하므로 로컬 라우터는 포드 CIDR이 다른 서브넷에 속하고 노드가 해당 서브넷의 게이트웨이라고 간주합니다.

![\[하이브리드 노드 BGP 라우팅\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-nodes-bgp.png)


 **정적 경로** 

또는 로컬 라우터에서 정적 경로를 구성할 수 있습니다. 이는 온프레미스 포드 CIDR을 VPC로 라우팅하는 가장 간단한 방법이지만 가장 오류가 발생하기 쉽고 유지 관리하기 어렵습니다. 기존 노드와 할당된 포드 CIDR을 사용하여 경로가 항상 최신 상태인지 확인해야 합니다. 노드 수가 적고 인프라가 정적이면 실행 가능한 옵션이며 라우터에서 BGP를 지원할 필요가 없습니다. 이 옵션을 선택하는 경우 IPAM이 결정하도록 하는 대신 각 노드에 할당하려는 포드 CIDR 조각으로 CNI를 구성하는 것이 좋습니다.

![\[하이브리드 노드 정적 라우팅\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-nodes-static-routes.png)


 **주소 확인 프로토콜(ARP) 프록시** 

ARP 프록시는 온프레미스 포드 IP를 라우팅 가능하게 만드는 또 다른 접근 방식이며, 하이브리드 노드가 로컬 라우터와 동일한 계층 2 네트워크에 있을 때 특히 유용합니다. ARP 프록싱이 활성화되면 노드는 자신이 호스팅하는 포드 IP에 대한 ARP 요청에 응답하는데, 해당 IP가 다른 서브넷에 속하더라도 마찬가지입니다.

로컬 네트워크의 디바이스가 포드 IP에 도달하려고 할 때 먼저 '누가 이 IP를 가지고 있나요?'라는 ARP 요청을 전송합니다. 포드가 자체 MAC 주소로 응답하는 하이브리드 노드 호스팅으로, ‘해당 IP에 대한 트래픽을 처리할 수 있습니다.’라는 메시지가 표시됩니다. 이를 통해 라우터 구성 없이 로컬 네트워크의 디바이스와 포드 간에 직접 경로가 생성됩니다.

이렇게 하려면 CNI가 프록시 ARP 기능을 지원해야 합니다. Cilium에는 구성을 통해 활성화할 수 있는 프록시 ARP에 대한 지원이 내장되어 있습니다. 가장 중요한 고려 사항은 포드 CIDR이 환경 내의 다른 네트워크와 겹치지 않아야 한다는 것입니다. 겹치면 라우팅 충돌이 발생할 수 있습니다.

이 접근 방식에는 다음과 같은 몇 가지 이점이 있습니다. \$1 BGP로 라우터를 구성하거나 정적 경로를 유지할 필요가 없습니다. \$1 라우터 구성을 제어할 수 없는 환경에서 잘 작동합니다.

![\[하이브리드 노드 ARP 프록시\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-nodes-arp-proxy.png)


## 포드 간 캡슐화
<a name="hybrid-nodes-concepts-k8s-pod-encapsulation"></a>

온프레미스 환경에서 CNI는 일반적으로 캡슐화 프로토콜을 사용하여 물리적 네트워크상에서 작동할 수 있는 오버레이 네트워크를 생성하므로 네트워크를 재구성할 필요가 없습니다. 이 섹션에서는 이러한 캡슐화가 어떻게 작동하는지 설명합니다. 일부 세부 정보는 사용하는 CNI에 따라 다를 수 있습니다.

캡슐화는 원래의 포드 네트워크 패킷을 기본 물리적 네트워크를 통해 라우팅될 수 있는 다른 네트워크 패킷으로 묶습니다. 이를 통해 포드는 물리적 네트워크가 해당 포드 CIDR을 라우팅하는 방법을 알 필요 없이 동일한 CNI를 실행하는 노드 간에 통신할 수 있습니다.

Kubernetes에서 가장 일반적으로 사용되는 캡슐화 프로토콜은 VXLAN(Virtual Extensible LAN)이지만 CNI에 따라 `Geneve` 등의 다른 프로토콜도 사용할 수 있습니다.

### VXLAN 캡슐화
<a name="_vxlan_encapsulation"></a>

VXLAN은 UDP 패킷 내에서 계층 2 이더넷 프레임을 캡슐화합니다. 포드가 다른 노드의 다른 포드로 트래픽을 전송하면 CNI는 다음을 수행합니다.

1. CNI가 포드 A에서 패킷을 가로챕니다.

1. CNI가 원래 패킷을 VXLAN 헤더로 래핑합니다.

1. 그러면 이 래핑된 패킷이 노드의 일반 네트워킹 스택을 통해 대상 노드로 전송됩니다.

1. 대상 노드의 CNI가 패킷을 언래핑하여 포드 B로 전송합니다.

VXLAN 캡슐화 중 패킷 구조에는 다음과 같은 일이 일어납니다.

원래 포드 간 패킷:

```
+-----------------+---------------+-------------+-----------------+
| Ethernet Header | IP Header     | TCP/UDP     | Payload         |
| Src: Pod A MAC  | Src: Pod A IP | Src Port    |                 |
| Dst: Pod B MAC  | Dst: Pod B IP | Dst Port    |                 |
+-----------------+---------------+-------------+-----------------+
```

VXLAN 캡슐화 후

```
+-----------------+-------------+--------------+------------+---------------------------+
| Outer Ethernet  | Outer IP    | Outer UDP    | VXLAN      | Original Pod-to-Pod       |
| Src: Node A MAC | Src: Node A | Src: Random  | VNI: xx    | Packet (unchanged         |
| Dst: Node B MAC | Dst: Node B | Dst: 4789    |            | from above)               |
+-----------------+-------------+--------------+------------+---------------------------+
```

VXLAN 네트워크 식별자(VNI)는 서로 다른 오버레이 네트워크를 구분합니다.

### 포드 통신 시나리오
<a name="_pod_communication_scenarios"></a>

 **동일한 하이브리드 노드의 포드** 

동일한 하이브리드 노드의 포드가 통신하는 경우 일반적으로 캡슐화가 필요하지 않습니다. CNI는 노드의 내부 가상 인터페이스를 통해 포드 간 트래픽을 보내는 로컬 경로를 설정합니다.

```
Pod A -> veth0 -> node's bridge/routing table -> veth1 -> Pod B
```

패킷은 절대 노드를 벗어나지 않으며 캡슐화가 불필요합니다.

 **다양한 하이브리드 노드의 포드** 

서로 다른 하이브리드 노드의 포드 간 통신에는 캡슐화가 필요합니다.

```
Pod A -> CNI -> [VXLAN encapsulation] -> Node A network -> router or gateway -> Node B network -> [VXLAN decapsulation] -> CNI -> Pod B
```

이렇게 하면 물리적 네트워크가 포드 IP 라우팅을 이해할 필요 없이 포드 트래픽이 물리적 네트워크 인프라를 통과할 수 있습니다.

# 하이브리드 노드의 네트워크 트래픽 흐름
<a name="hybrid-nodes-concepts-traffic-flows"></a>

이 페이지에서는 다양한 트래픽 유형에 대한 엔드 투 엔드 네트워크 경로를 보여주는 다이어그램과 함께 EKS Hybrid Nodes의 네트워크 트래픽 흐름을 자세히 설명합니다.

다음 트래픽 흐름이 포함됩니다.
+  [하이브리드 노드 `kubelet`에서 EKS 컨트롤 플레인으로](#hybrid-nodes-concepts-traffic-flows-kubelet-to-cp) 
+  [EKS 컨트롤 플레인에서 하이브리드 노드로(`kubelet` 서버)](#hybrid-nodes-concepts-traffic-flows-cp-to-kubelet) 
+  [하이브리드 노드에서 실행되는 포드에서 EKS 컨트롤 플레인으로](#hybrid-nodes-concepts-traffic-flows-pods-to-cp) 
+  [하이브리드 노드에서 실행되는 포드에 대한 EKS 컨트롤 플레인(웹후크)](#hybrid-nodes-concepts-traffic-flows-cp-to-pod) 
+  [하이브리드 노드에서 실행되는 포드 간](#hybrid-nodes-concepts-traffic-flows-pod-to-pod) 
+  [클라우드 노드의 포드에서 하이브리드 노드의 포드로(동서 트래픽)](#hybrid-nodes-concepts-traffic-flows-east-west) 

## 하이브리드 노드 `kubelet`에서 EKS 컨트롤 플레인으로
<a name="hybrid-nodes-concepts-traffic-flows-kubelet-to-cp"></a>

![\[하이브리드 노드 kubelet에서 EKS 컨트롤 플레인으로\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-nodes-kubelet-to-cp-public.png)


### 요청
<a name="_request"></a>

 **1. `kubelet` 요청 시작** 

하이브리드 노드의 `kubelet`이 EKS 컨트롤 플레인과 통신해야 하는 경우(예: 노드 상태 보고 또는 포드 사양 가져오기), 노드 등록 중 제공된 `kubeconfig` 파일을 사용합니다. 이 `kubeconfig`에는 직접 IP 주소가 아닌 API 서버 엔드포인트 URL(Route53 DNS 이름)이 있습니다.

`kubelet`은 엔드포인트(예: `https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.gr7.us-west-2.eks.amazonaws.com`)에 대한 DNS 조회를 수행합니다. 퍼블릭 액세스 클러스터에서는 AWS에서 실행되는 EKS 서비스에 속하는 퍼블릭 IP 주소(예: `54.239.118.52`)로 확인됩니다. 그런 다음 `kubelet`은 이 엔드포인트에 대한 보안 HTTPS 요청을 생성합니다. 초기 패킷은 다음과 같습니다.

```
+--------------------+---------------------+-----------------+
| IP Header          | TCP Header          | Payload         |
| Src: 10.80.0.2     | Src: 52390 (random) |                 |
| Dst: 54.239.118.52 | Dst: 443            |                 |
+--------------------+---------------------+-----------------+
```

 **2. 로컬 라우터 라우팅** 

대상 IP가 로컬 네트워크의 일부가 아닌 퍼블릭 IP 주소이므로 `kubelet`은 이 패킷을 기본 게이트웨이(로컬 온프레미스 라우터)로 전송합니다. 라우터는 대상 IP를 검사하고 퍼블릭 IP 주소인지 확인합니다.

퍼블릭 트래픽의 경우 라우터는 일반적으로 인터넷으로의 아웃바운드 트래픽을 처리하는 인터넷 게이트웨이 또는 경계 라우터로 패킷을 전달합니다. 이는 다이어그램에서 생략되며 온프레미스 네트워크 설정 방식에 따라 달라집니다. 패킷은 온프레미스 네트워크 인프라를 통과하여 결국 인터넷 서비스 제공업체의 네트워크에 도달합니다.

 **3. EKS 컨트롤 플레인으로 전송** 

패킷은 AWS의 네트워크에 도달할 때까지 퍼블릭 인터넷과 전송 네트워크를 통해 이동합니다. AWS의 네트워크는 패킷을 적절한 리전의 EKS 서비스 엔드포인트로 라우팅합니다. 패킷이 EKS 서비스에 도달하면 클러스터의 실제 EKS 컨트롤 플레인으로 전달됩니다.

퍼블릭 인터넷을 통한 이 라우팅은 다른 트래픽 흐름에서 볼 수 있는 프라이빗 VPC 라우팅 경로와 다릅니다. 주요 차이점은 퍼블릭 액세스 모드를 사용할 때 온프레미스 `kubelet`(포드가 아님)에서 EKS 컨트롤 플레인으로의 트래픽이 VPC를 통과하지 않고 대신 글로벌 인터넷 인프라를 사용한다는 것입니다.

### 응답
<a name="_response"></a>

EKS 컨트롤 플레인이 `kubelet` 요청을 처리한 후 응답을 다시 전송합니다.

 **3. EKS 컨트롤 플레인에서 응답 전송** 

EKS 컨트롤 플레인은 응답 패킷을 생성합니다. 이 패킷에는 소스로 퍼블릭 IP, 대상으로 하이브리드 노드의 IP가 있습니다.

```
+--------------------+---------------------+-----------------+
| IP Header          | TCP Header          | Payload         |
| Src: 54.239.118.52 | Src: 443            |                 |
| Dst: 10.80.0.2     | Dst: 52390          |                 |
+--------------------+---------------------+-----------------+
```

 **2. 인터넷 라우팅** 

응답 패킷은 인터넷 서비스 제공업체가 결정한 라우팅 경로에 따라 온프레미스 네트워크 엣지 라우터에 도달할 때까지 인터넷을 통해 다시 이동합니다.

 **1: 로컬 전송** 

온프레미스 라우터는 패킷을 수신하고 대상 IP(`10.80.0.2`)를 로컬 네트워크에 속하는 것으로 인식합니다. 패킷이 대상 하이브리드 노드에 도달할 때까지 로컬 네트워크 인프라를 통해 패킷을 전달하고, 여기서 `kubelet`이 응답을 수신하고 처리합니다.

## 하이브리드 노드 `kube-proxy`에서 EKS 컨트롤 플레인으로
<a name="_hybrid_node_kube_proxy_to_eks_control_plane"></a>

클러스터에 대해 퍼블릭 엔드포인트 액세스를 활성화하면 반환 트래픽은 퍼블릭 인터넷을 사용합니다. 이 트래픽은 하이브리드 노드의 `kube-proxy`에서 시작되어 EKS 컨트롤 플레인으로 이동하며 `kubelet`에서 EKS 컨트롤 플레인으로 이동하는 트래픽과 동일한 경로를 따릅니다.

## EKS 컨트롤 플레인에서 하이브리드 노드로(`kubelet` 서버)
<a name="hybrid-nodes-concepts-traffic-flows-cp-to-kubelet"></a>

![\[EKS 컨트롤 플레인에서 하이브리드 노드로\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-nodes-cp-to-kubelet.png)


### 요청
<a name="_request_2"></a>

 **1: EKS Kubernetes API 서버가 요청 시작** 

EKS Kubernetes API 서버는 노드 객체의 상태에서 노드의 IP 주소(`10.80.0.2`)를 검색합니다. 그런 다음 대상 IP가 구성된 원격 노드 CIDR(`10.80.0.0/16`)에 속하므로 VPC의 ENI를 통해 이 요청을 라우팅합니다. 초기 패킷은 다음과 같습니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.132 | Src: 67493 (random) |                 |
| Dst: 10.80.0.2  | Dst: 10250          |                 |
+-----------------+---------------------+-----------------+
```

 **2. VPC 네트워크 처리** 

패킷은 ENI를 떠나 VPC 네트워킹 계층으로 들어가고, 이후 라우팅을 위해 서브넷의 게이트웨이로 전달됩니다.

 **3. VPC 라우팅 테이블 조회** 

EKS 컨트롤 플레인 ENI가 포함된 서브넷의 VPC 라우팅 테이블에는 원격 노드 CIDR에 대한 특정 경로(다이어그램의 두 번째 경로)가 있습니다. 이 라우팅 규칙에 따라 패킷은 VPC-온프레미스 게이트웨이로 전달됩니다.

 **4. 교차 경계 전송** 

게이트웨이는 설정된 연결(예: Direct Connect 또는 VPN)을 통해 클라우드 경계를 넘어 온프레미스 네트워크로 패킷을 전송합니다.

 **5. 온프레미스 네트워크 수신** 

패킷은 하이브리드 노드가 위치한 서브넷의 트래픽을 처리하는 로컬 온프레미스 라우터에 도착합니다.

 **6. 최종 전송** 

로컬 라우터는 대상 IP(`10.80.0.2`) 주소가 직접 연결된 네트워크에 속하는 것을 식별하고 패킷을 대상 하이브리드 노드로 직접 전달하며, 여기서 `kubelet`이 요청을 수신하고 처리합니다.

### 응답
<a name="_response_2"></a>

하이브리드 노드의 `kubelet`이 요청을 처리한 후, 동일한 경로를 역으로 응답을 다시 전송합니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.80.0.2  | Src: 10250          |                 |
| Dst: 10.0.0.132 | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

 **6. `kubelet` 응답 전송** 

하이브리드 노드(`10.80.0.2`)의 `kubelet`은 원본 소스 IP를 대상으로 하는 응답 패킷을 생성합니다. 대상은 로컬 네트워크에 속하지 않으므로 호스트의 기본 게이트웨이인 로컬 라우터로 전송됩니다.

 **5. 로컬 라우터 라우팅** 

라우터는 대상 IP(`10.0.0.132`)가 AWS로 연결되는 게이트웨이를 가리키는 경로를 가진 `10.0.0.0/16`에 속한다고 판단합니다.

 **4. 교차 경계 반환** 

패킷은 동일한 온프레미스를 통해 VPC 연결(예: Direct Connect 또는 VPN)로 다시 이동하며 반대 방향으로 클라우드 경계를 통과합니다.

 **3. VPC 라우팅** 

패킷이 VPC에 도착하면 라우팅 테이블은 대상 IP가 VPC CIDR에 속함을 식별합니다. 패킷은 VPC 내에서 라우팅됩니다.

 **2. VPC 네트워크 전송** 

VPC 네트워킹 계층은 EKS 컨트롤 플레인 ENI(`10.0.0.132`)를 사용하여 패킷을 서브넷으로 전달합니다.

 **1: ENI 수신** 

패킷은 Kubernetes API 서버에 연결된 EKS 컨트롤 플레인 ENI에 도달하여 왕복을 완료합니다.

## 하이브리드 노드에서 실행되는 포드에서 EKS 컨트롤 플레인으로
<a name="hybrid-nodes-concepts-traffic-flows-pods-to-cp"></a>

![\[하이브리드 노드에서 실행되는 포드에서 EKS 컨트롤 플레인으로\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-nodes-pod-to-cp.png)


### CNI NAT 사용 안 함
<a name="_without_cni_nat"></a>

### 요청
<a name="_request_3"></a>

포드는 일반적으로 `kubernetes` 서비스를 통해 Kubernetes API 서버와 통신합니다. 서비스 IP는 클러스터 서비스 CIDR의 첫 번째 IP입니다. 이 규칙을 사용하면 CoreDNS를 사용할 수 있기 전에 실행해야 하는 포드(예: CNI)가 API 서버에 도달할 수 있습니다. 요청은 서비스 IP를 대상으로 하여 포드를 떠납니다. 예를 들어 서비스 CIDR이 `172.16.0.0/16`인 경우 서비스 IP는 `172.16.0.1`이 됩니다.

 **1: 포드에서 요청 시작** 

포드는 임의의 소스 포트에서 API 서버 포트(443)의 `kubernetes` 서비스 IP(`172.16.0.1`)로 요청을 전송합니다. 패킷은 다음과 같습니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.56 | Src: 67493 (random) |                 |
| Dst: 172.16.0.1 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

 **2. CNI 처리** 

CNI는 대상 IP가 관리하는 어떤 포드 CIDR에도 속하지 않음을 감지합니다. **발신 NAT가 비활성화**되어 있으므로 CNI는 패킷을 수정하지 않고 호스트 네트워크 스택으로 전달합니다.

 **3. 노드 네트워크 처리** 

패킷은 `netfilter` 후크가 kube-proxy에서 설정한 `iptables` 규칙을 트리거하는 노드의 네트워크 스택으로 들어갑니다. 다음과 같은 순서로 여러 규칙이 적용됩니다.

1. 패킷은 먼저 `KUBE-SERVICES` 체인에 도달합니다. 여기에는 각 서비스의 ClusterIP 및 포트와 일치하는 규칙이 포함됩니다.

1. 일치하는 규칙은 `kubernetes` 서비스(`172.16.0.1:443`으로 전송되는 패킷)에 대한 `KUBE-SVC-XXX` 체인으로 이동합니다.

1. 로드 밸런싱 규칙은 컨트롤 플레인 ENI IP(`10.0.0.132` 또는 `10.0.1.23`)에 대해 `KUBE-SEP-XXX` 체인 중 하나를 무작위로 선택합니다.

1. 선택한 `KUBE-SEP-XXX` 체인에는 대상 IP를 서비스 IP에서 선택한 IP로 변경하는 실제 규칙이 있습니다. 이를 DNAT(Destination Network Address Translation)이라고 합니다.

이러한 규칙이 적용된 후 선택한 EKS 컨트롤 플레인 ENI의 IP가 `10.0.0.132`라고 가정하면 패킷은 다음과 같습니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.56 | Src: 67493 (random) |                 |
| Dst: 10.0.0.132 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

대상 IP가 로컬 네트워크에 없기 때문에 노드는 패킷을 기본 게이트웨이로 전달합니다.

 **4. 로컬 라우터 라우팅** 

로컬 라우터는 대상 IP(`10.0.0.132`)가 VPC CIDR(`10.0.0.0/16`)에 속한다고 판단하고 이를 AWS에 연결하는 게이트웨이로 전달합니다.

 **5. 교차 경계 전송** 

패킷은 설정된 연결(예: Direct Connect 또는 VPN)을 통해 클라우드 경계를 넘어 VPC로 이동합니다.

 **6. VPC 네트워크 전송** 

VPC 네트워킹 계층은 EKS 컨트롤 플레인 ENI(`10.0.0.132`)가 위치한 올바른 서브넷으로 패킷을 라우팅합니다.

 **7. ENI 수신** 

패킷은 Kubernetes API 서버에 연결된 EKS 컨트롤 플레인 ENI에 도달합니다.

### 응답
<a name="_response_3"></a>

EKS 컨트롤 플레인이 요청을 처리한 후 포드에 응답을 다시 전송합니다.

 **7. API 서버 전송 응답** 

EKS Kubernetes API 서버는 원본 소스 IP를 대상으로 하는 응답 패킷을 생성합니다. 패킷은 다음과 같습니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.132 | Src: 443            |                 |
| Dst: 10.85.1.56 | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

대상 IP는 구성된 원격 포드 CIDR(`10.85.0.0/16`)에 속하므로 서브넷의 라우터를 다음 홉으로 사용하여 VPC의 ENI를 통해 전송합니다.

 **6. VPC 라우팅** 

VPC 라우팅 테이블에는 원격 포드 CIDR(`10.85.0.0/16`)에 대한 항목이 포함되어 이 트래픽을 VPC-온프레미스 게이트웨이로 전달합니다.

 **5. 교차 경계 전송** 

게이트웨이는 설정된 연결(예: Direct Connect 또는 VPN)을 통해 클라우드 경계를 넘어 온프레미스 네트워크로 패킷을 전송합니다.

 **4. 온프레미스 네트워크 수신** 

패킷이 로컬 온프레미스 라우터에 도착합니다.

 **3. 노드로 전송** 

라우터 테이블에는 `10.85.1.0/24`에 대한 항목이 있고, 다음 홉은 `10.80.0.2`로 패킷을 노드에 전달합니다.

 **2. 노드 네트워크 처리** 

패킷이 노드의 네트워크 스택에서 처리되면 `conntrack`(`netfilter`의 일부)은 패킷을 포드가 처음 설정한 연결과 일치시킵니다. 원래 DNAT가 적용되었으므로 `conntrack`은 EKS 컨트롤 플레인 ENI의 IP에서 `kubernetes` 서비스 IP로 소스 IP를 다시 작성하여 DNAT를 되돌립니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 172.16.0.1 | Src: 443            |                 |
| Dst: 10.85.1.56 | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

 **1: CNI 처리** 

CNI는 대상 IP가 네트워크의 포드에 속함을 식별하고 패킷을 올바른 포드 네트워크 네임스페이스로 전송합니다.

이 흐름은 원격 포드 CIDR이 VPC에서 각 포드를 호스팅하는 특정 노드까지 제대로 라우팅되어야 하는 이유를 보여줍니다. 전체 반환 경로는 클라우드 및 온프레미스 네트워크 모두에서 포드 IP의 적절한 라우팅에 따라 달라집니다.

### CNI NAT 사용
<a name="_with_cni_nat"></a>

이 흐름은 *CNI NAT가 없는* 흐름과 매우 유사하지만 한 가지 주요 차이점이 있습니다. CNI는 패킷을 노드의 네트워크 스택으로 전송하기 전에 패킷에 소스 NAT(SNAT)를 적용한다는 점입니다. 이렇게 하면 패킷의 소스 IP가 노드의 IP로 변경되므로 추가 라우팅 구성 없이 패킷을 노드로 다시 라우팅할 수 있습니다.

### 요청
<a name="_request_4"></a>

 **1: 포드에서 요청 시작** 

포드는 임의의 소스 포트에서 EKS Kubernetes API 서버 포트(443)의 `kubernetes` 서비스 IP(`172.16.0.1`)로 요청을 전송합니다. 패킷은 다음과 같습니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.56 | Src: 67493 (random) |                 |
| Dst: 172.16.0.1 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

 **2. CNI 처리** 

CNI는 대상 IP가 관리하는 어떤 포드 CIDR에도 속하지 않음을 감지합니다. **발신 NAT가 활성화**되었으므로 CNI는 패킷에 SNAT를 적용하여 소스 IP를 노드의 네트워크 스택에 전달하기 전에 노드의 IP로 변경합니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.80.0.2  | Src: 67493 (random) |                 |
| Dst: 172.16.0.1 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

참고: 예에서는 명확성을 위해 CNI와 `iptables`를 별도의 블록으로 표시했지만 실제로는 일부 CNI가 `iptables`를 사용하여 NAT를 적용할 수 있습니다.

 **3. 노드 네트워크 처리** 

여기서 `kube-proxy` 설정한 `iptables` 규칙은 이전 예제에서와 동일하게 동작하여 패킷을 EKS 컨트롤 플레인 ENI 중 하나로 로드 밸런싱합니다. 패킷은 이제 다음과 같습니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.80.0.2  | Src: 67493 (random) |                 |
| Dst: 10.0.0.132 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

대상 IP가 로컬 네트워크에 없기 때문에 노드는 패킷을 기본 게이트웨이로 전달합니다.

 **4. 로컬 라우터 라우팅** 

로컬 라우터는 대상 IP(`10.0.0.132`)가 VPC CIDR(`10.0.0.0/16`)에 속한다고 판단하고 이를 AWS에 연결하는 게이트웨이로 전달합니다.

 **5. 교차 경계 전송** 

패킷은 설정된 연결(예: Direct Connect 또는 VPN)을 통해 클라우드 경계를 넘어 VPC로 이동합니다.

 **6. VPC 네트워크 전송** 

VPC 네트워킹 계층은 EKS 컨트롤 플레인 ENI(`10.0.0.132`)가 위치한 올바른 서브넷으로 패킷을 라우팅합니다.

 **7. ENI 수신** 

패킷은 Kubernetes API 서버에 연결된 EKS 컨트롤 플레인 ENI에 도달합니다.

### 응답
<a name="_response_4"></a>

EKS 컨트롤 플레인이 요청을 처리한 후 포드에 응답을 다시 전송합니다.

 **7. API 서버 전송 응답** 

EKS Kubernetes API 서버는 원본 소스 IP를 대상으로 하는 응답 패킷을 생성합니다. 패킷은 다음과 같습니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.132 | Src: 443            |                 |
| Dst: 10.80.0.2  | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

대상 IP는 구성된 원격 노드 CIDR(`10.80.0.0/16`)에 속하므로 서브넷의 라우터를 다음 홉으로 사용하여 VPC의 ENI를 통해 전송합니다.

 **6. VPC 라우팅** 

VPC 라우팅 테이블에는 원격 노드 CIDR(`10.80.0.0/16`)에 대한 항목이 포함되어 이 트래픽을 VPC-온프레미스 게이트웨이로 전달합니다.

 **5. 교차 경계 전송** 

게이트웨이는 설정된 연결(예: Direct Connect 또는 VPN)을 통해 클라우드 경계를 넘어 온프레미스 네트워크로 패킷을 전송합니다.

 **4. 온프레미스 네트워크 수신** 

패킷이 로컬 온프레미스 라우터에 도착합니다.

 **3. 노드로 전송** 

로컬 라우터는 대상 IP(`10.80.0.2`) 주소가 직접 연결된 네트워크에 속하는 것을 식별하고 패킷을 대상 하이브리드 노드로 직접 전달합니다.

 **2. 노드 네트워크 처리** 

패킷이 노드의 네트워크 스택에서 처리될 때 `conntrack`(`netfilter`의 일부)은 패킷을 포드가 처음에 설정한 연결과 일치시키고 DNAT가 원래 적용되었기 때문에 EKS 컨트롤 플레인 ENI의 IP에서 `kubernetes` 서비스 IP로 소스 IP를 다시 작성하여 이를 반대로 수행합니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 172.16.0.1 | Src: 443            |                 |
| Dst: 10.80.0.2  | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

 **1: CNI 처리** 

CNI는 이 패킷이 이전에 SNAT를 적용한 연결에 속함을 식별합니다. SNAT를 반대로 실행하여 대상 IP를 포드의 IP로 다시 변경합니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 172.16.0.1 | Src: 443            |                 |
| Dst: 10.85.1.56 | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

CNI는 대상 IP가 네트워크의 포드에 속함을 감지하고 패킷을 올바른 포드 네트워크 네임스페이스로 전송합니다.

이 흐름은 CNI NAT-ing이 Pod CIDR에 대한 추가 라우팅을 요구하지 않고도 패킷을 노드로 다시 라우팅할 수 있도록 하여 구성을 간소화하는 방법을 보여줍니다.

## 하이브리드 노드에서 실행되는 포드에 대한 EKS 컨트롤 플레인(웹후크)
<a name="hybrid-nodes-concepts-traffic-flows-cp-to-pod"></a>

![\[하이브리드 노드에서 실행되는 포드에 대한 EKS 컨트롤 플레인\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-nodes-cp-to-pod.png)


이 트래픽 패턴은 EKS 컨트롤 플레인이 하이브리드 노드의 포드에서 실행되는 웹후크 서버에 대한 연결을 직접 시작해야 하는 웹후크에서 가장 일반적으로 볼 수 있습니다. 리소스 검증 또는 변형 프로세스 중 API 서버에서 직접적으로 호출하는 승인 웹후크의 검증 및 변형을 예로 들 수 있습니다.

### 요청
<a name="_request_5"></a>

 **1: EKS Kubernetes API 서버가 요청 시작** 

클러스터에 웹후크가 구성되고 관련 API 작업이 이를 트리거하면 EKS Kubernetes API 서버는 웹후크 서버 포드에 직접 연결해야 합니다. API 서버는 먼저 웹후크와 연결된 서비스 또는 엔드포인트 리소스에서 포드의 IP 주소를 조회합니다.

IP가 `10.85.1.23`인 하이브리드 노드에서 웹후크 포드가 실행 중이라는 가정하에 EKS Kubernetes API 서버는 웹후크 엔드포인트에 HTTPS 요청을 생성합니다. 대상 IP `10.85.1.23`이 구성된 원격 포드 CIDR(`10.85.0.0/16`)에 속하기 때문에 초기 패킷은 VPC의 EKS 컨트롤 플레인 ENI를 통해 전송됩니다. 패킷은 다음과 같습니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.132 | Src: 41892 (random) |                 |
| Dst: 10.85.1.23 | Dst: 8443           |                 |
+-----------------+---------------------+-----------------+
```

 **2. VPC 네트워크 처리** 

패킷은 EKS 컨트롤 플레인 ENI를 떠나 서브넷의 라우터를 다음 홉으로 하여 VPC 네트워킹 계층으로 들어갑니다.

 **3. VPC 라우팅 테이블 조회** 

EKS 컨트롤 플레인 ENI가 포함된 서브넷의 VPC 라우팅 테이블에는 원격 포드 CIDR에 대한 특정 경로(`10.85.0.0/16`)가 포함되어 있습니다. 이 라우팅 규칙은 패킷을 VPC-온프레미스 게이트웨이(예: Direct Connect 또는 VPN 연결을 위한 가상 프라이빗 게이트웨이)로 전달합니다.

```
Destination     Target
10.0.0.0/16     local
10.85.0.0/16    vgw-id (VPC-to-onprem gateway)
```

 **4. 교차 경계 전송** 

게이트웨이는 설정된 연결(예: Direct Connect 또는 VPN)을 통해 클라우드 경계를 넘어 온프레미스 네트워크로 패킷을 전송합니다. 패킷은 이 연결을 통과할 때 원본 소스 및 대상 IP 주소를 유지합니다.

 **5. 온프레미스 네트워크 수신** 

패킷이 로컬 온프레미스 라우터에 도착합니다. 라우터는 라우팅 테이블을 참조하여 10.85.1.23 주소에 도달하는 방법을 결정합니다. 이를 위해서는 온프레미스 네트워크에 트래픽을 적절한 하이브리드 노드로 전달하는 포드 CIDR에 대한 경로가 있어야 합니다.

이 경우 라우터의 라우팅 테이블에는 IP가 `10.80.0.2`인 하이브리드 노드를 통해 `10.85.1.0/24` 서브넷에 도달할 수 있음을 나타내는 항목이 포함되어 있습니다.

```
Destination     Next Hop
10.85.1.0/24    10.80.0.2
```

 **6. 노드로 전송** 

라우팅 테이블 항목을 기반으로 라우터는 패킷을 하이브리드 노드(`10.80.0.2`)로 전달합니다. 패킷이 노드에 도착하면 대상 IP가 여전히 포드의 IP인 것을 제외하면 EKS Kubernetes API 서버가 패킷을 전송했을 때와 동일하게 보입니다.

 **7. CNI 처리** 

노드의 네트워크 스택은 패킷을 수신하고 대상 IP가 노드의 자체 IP가 아님을 확인한 후 처리를 위해 CNI에 전달합니다. CNI는 대상 IP가 이 노드에서 로컬로 실행되는 포드에 속함을 식별하고 적절한 가상 인터페이스를 통해 패킷을 올바른 포드로 전달합니다.

```
Original packet -> node routing -> CNI -> Pod's network namespace
```

포드의 웹후크 서버는 요청을 수신하고 처리합니다.

### 응답
<a name="_response_5"></a>

웹후크 포드가 이 요청을 처리한 후, 동일한 경로를 역으로 응답을 다시 전송합니다.

 **7. 포드에서 응답 전송** 

웹후크 포드는 자체 IP를 소스로, 원래 요청자(EKS 컨트롤 플레인 ENI)를 대상으로 응답 패킷을 생성합니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.23 | Src: 8443           |                 |
| Dst: 10.0.0.132 | Dst: 41892          |                 |
+-----------------+---------------------+-----------------+
```

CNI는 이 패킷이 로컬 포드가 아닌 외부 네트워크로 이동함을 식별하고 원본 소스 IP가 보존된 노드의 네트워크 스택으로 패킷을 전달합니다.

 **6. 노드 네트워크 처리** 

노드는 대상 IP(`10.0.0.132`)가 로컬 네트워크에 없다고 판단하고 패킷을 기본 게이트웨이(로컬 라우터)로 전달합니다.

 **5. 로컬 라우터 라우팅** 

로컬 라우터는 라우팅 테이블을 참조하여 대상 IP(`10.0.0.132`)가 VPC CIDR(`10.0.0.0/16`)에 속한다고 판단하고 패킷을 AWS에 연결하는 게이트웨이로 전달합니다.

 **4. 교차 경계 전송** 

패킷은 동일한 온프레미스를 통해 VPC 연결로 다시 이동하며 반대 방향으로 클라우드 경계를 통과합니다.

 **3. VPC 라우팅** 

패킷이 VPC에 도착하면 라우팅 테이블은 대상 IP가 VPC 내의 서브넷에 속함을 식별합니다. 패킷은 VPC 내에서 그에 따라 라우팅됩니다.

 **2. 및 1. EKS 컨트롤 플레인 ENI 수신** 

패킷이 EKS Kubernetes API 서버에 연결된 ENI에 도달하여 왕복을 완료합니다. API 서버는 웹후크 응답을 수신하고 이 응답을 기반으로 원래 API 요청을 계속 처리합니다.

이 트래픽 흐름은 원격 포드 CIDR을 올바르게 구성하고 라우팅해야 하는 이유를 보여줍니다.
+ VPC에는 온프레미스 게이트웨이를 가리키는 원격 포드 CIDR에 대한 경로가 있어야 합니다.
+ 온프레미스 네트워크에는 해당 포드를 호스팅하는 특정 노드로 트래픽을 전달하는 포드 CIDR에 대한 경로가 있어야 합니다.
+ 이 라우팅 구성이 없으면 EKS 컨트롤 플레인이 하이브리드 노드의 포드에서 실행되는 웹후크와 기타 유사 서비스에 연결할 수 없습니다.

## 하이브리드 노드에서 실행되는 포드 간
<a name="hybrid-nodes-concepts-traffic-flows-pod-to-pod"></a>

![\[하이브리드 노드에서 실행되는 포드 간\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-nodes-pod-to-pod.png)


이 섹션에서는 서로 다른 하이브리드 노드에서 실행되는 포드가 서로 통신하는 방법을 설명합니다. 이 예에서는 CNI가 캡슐화를 위해 VXLAN을 사용한다고 가정하며, 이는 Cilium 또는 Calico와 같은 CNI에 일반적입니다. 전체 프로세스는 Geneve 또는 IP-in-IP 등의 다른 캡슐화 프로토콜과 유사합니다.

### 요청
<a name="_request_6"></a>

 **1: 포드 A에서 통신 시작** 

노드 1의 포드 A(`10.85.1.56`)가 노드 2의 포드 B(`10.85.2.67`)로 트래픽을 전송하려고 합니다. 초기 패킷은 다음과 같습니다.

```
+------------------+-----------------+-------------+-----------------+
| Ethernet Header  | IP Header       | TCP/UDP     | Payload         |
| Src: Pod A MAC   | Src: 10.85.1.56 | Src: 43721  |                 |
| Dst: Gateway MAC | Dst: 10.85.2.67 | Dst: 8080   |                 |
+------------------+-----------------+-------------+-----------------+
```

 **2. CNI에서 패킷을 가로채고 처리** 

포드 A의 패킷이 네트워크 네임스페이스를 벗어나면 CNI가 이를 가로챕니다. CNI는 라우팅 테이블을 참조하여 다음을 확인합니다. - 대상 IP(`10.85.2.67`)는 포드 CIDR에 속합니다. - 이 IP는 로컬 노드에 없지만 노드 2(`10.80.0.3`)에 속합니다. - 패킷은 VXLAN으로 캡슐화되어야 합니다.

캡슐화 결정은 기본 물리적 네트워크가 포드 CIDR을 직접 라우팅하는 방법을 모르고 노드 IP 간의 트래픽을 라우팅하는 방법만 알기 때문에 중요합니다.

CNI는 VXLAN 프레임 내에서 전체 원본 패킷을 캡슐화합니다. 이렇게 하면 새로운 헤더가 포함된 ‘패킷 내의 패킷’이 효과적으로 생성됩니다.

```
+-----------------+----------------+--------------+------------+---------------------------+
| Outer Ethernet  | Outer IP       | Outer UDP    | VXLAN      | Original Pod-to-Pod       |
| Src: Node1 MAC  | Src: 10.80.0.2 | Src: Random  | VNI: 42    | Packet (unchanged         |
| Dst: Router MAC | Dst: 10.80.0.3 | Dst: 8472    |            | from above)               |
+-----------------+----------------+--------------+------------+---------------------------+
```

이 캡슐화의 핵심 사항: - 외부 패킷은 노드 1(`10.80.0.2`)에서 노드 2(`10.80.0.3`)로 주소가 지정됩니다. - UDP 포트 `8472`는 Cilium이 기본적으로 사용하는 VXLAN 포트입니다. - VXLAN 네트워크 식별자(VNI)는 이 패킷이 속하는 오버레이 네트워크를 식별합니다. - 전체 원본 패킷(포드 A의 IP를 소스로, 포드 B의 IP를 대상으로 함)은 내부에 그대로 보존됩니다.

캡슐화된 패킷은 이제 노드 1의 일반 네트워킹 스택에 들어가서 다른 패킷과 동일한 방식으로 처리됩니다.

1.  **노드 네트워크 처리**: 노드 1의 네트워크 스택은 대상(`10.80.0.3`)을 기반으로 패킷을 라우팅합니다.

1.  **로컬 네트워크 전송**:
   + 두 노드가 동일한 계층 2 네트워크에 있는 경우 패킷이 노드 2로 직접 전송됩니다.
   + 서로 다른 서브넷에 있는 경우 패킷이 먼저 로컬 라우터로 전달됩니다.

1.  **라우터 처리**: 라우터가 라우팅 테이블을 기반으로 패킷을 전달하여 노드 2로 전송합니다.

 **3. 수신 노드 처리** 

캡슐화된 패킷이 노드 2(`10.80.0.3`)에 도착하면

1. 노드의 네트워크 스택이 이를 수신하고 VXLAN 패킷(UDP 포트 `4789`)으로 식별합니다.

1. 패킷이 처리를 위해 CNI의 VXLAN 인터페이스로 전달됩니다.

 **4. VXLAN 캡슐화 해제** 

노드 2의 CNI가 VXLAN 패킷을 처리합니다.

1. 외부 헤더(이더넷, IP, UDP 및 VXLAN)를 제거합니다.

1. 원래 내부 패킷을 추출합니다.

1. 이제 패킷이 원래 형식으로 돌아갑니다.

```
+------------------+-----------------+-------------+-----------------+
| Ethernet Header  | IP Header       | TCP/UDP     | Payload         |
| Src: Pod A MAC   | Src: 10.85.1.56 | Src: 43721  |                 |
| Dst: Gateway MAC | Dst: 10.85.2.67 | Dst: 8080   |                 |
+------------------+-----------------+-------------+-----------------+
```

노드 2의 CNI는 대상 IP(`10.85.2.67`)를 검사하고 다음을 수행합니다.

1. 이 IP가 로컬 포드에 속함을 식별합니다.

1. 적절한 가상 인터페이스를 통해 패킷을 라우팅합니다.

1. 포드 B의 네트워크 네임스페이스로 패킷을 전송합니다.

### 응답
<a name="_response_6"></a>

포드 B가 포드 A에 응답하면 전체 프로세스가 반대로 수행됩니다.

1. 포드 B가 포드 A(`10.85.1.56`)로 패킷을 전송합니다.

1. 노드 2의 CNI는 노드 1(`10.80.0.2`)로 대상을 설정하여 VXLAN으로 캡슐화합니다.

1. 캡슐화된 패킷이 노드 1로 전달됩니다.

1. 노드 1의 CNI는 이를 캡슐화 해제하고 포드 A에 원래 응답을 전달합니다.

## 클라우드 노드의 포드에서 하이브리드 노드의 포드로(동서 트래픽)
<a name="hybrid-nodes-concepts-traffic-flows-east-west"></a>

![\[클라우드 노드의 포드에서 하이브리드 노드의 포드로\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/hybrid-nodes-east-west.png)


### 요청
<a name="_request_7"></a>

 **1: 포드 A에서 통신 시작** 

EC2 노드의 포드 A(`10.0.0.56`)가 하이브리드 노드의 포드 B(`10.85.1.56`)로 트래픽을 전송하려고 합니다. 초기 패킷은 다음과 같습니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.56  | Src: 52390 (random) |                 |
| Dst: 10.85.1.56 | Dst: 8080           |                 |
+-----------------+---------------------+-----------------+
```

VPC CNI를 사용하면 포드 A는 VPC CIDR의 IP를 가지며 EC2 인스턴스의 ENI에 직접 연결됩니다. 포드의 네트워크 네임스페이스는 VPC 네트워크에 연결되므로 패킷은 VPC 라우팅 인프라에 직접 들어갑니다.

 **2. VPC 라우팅** 

VPC 라우팅 테이블에는 원격 포드 CIDR(`10.85.0.0/16`)에 대한 특정 경로가 포함되어 있으며, 이 트래픽을 VPC-온프레미스 게이트웨이로 전달합니다.

```
Destination     Target
10.0.0.0/16     local
10.85.0.0/16    vgw-id (VPC-to-onprem gateway)
```

이 라우팅 규칙에 따라 패킷은 온프레미스 네트워크에 연결하는 게이트웨이로 전달됩니다.

 **3. 교차 경계 전송** 

게이트웨이는 설정된 연결(예: Direct Connect 또는 VPN)을 통해 클라우드 경계를 넘어 온프레미스 네트워크로 패킷을 전송합니다. 패킷은 이 전송 과정에서 원본 소스 및 대상 IP 주소를 유지합니다.

 **4. 온프레미스 네트워크 수신** 

패킷이 로컬 온프레미스 라우터에 도착합니다. 라우터는 라우팅 테이블을 참조하여 10.85.1.56 주소에 도달하기 위한 다음 홉을 결정합니다. 온프레미스 라우터에 트래픽을 적절한 하이브리드 노드로 전달하는 포드 CIDR에 대한 경로가 있어야 합니다.

라우터의 테이블에는 IP가 `10.80.0.2`인 하이브리드 노드를 통해 `10.85.1.0/24` 서브넷에 연결할 수 있음을 나타내는 항목이 있습니다.

```
Destination     Next Hop
10.85.1.0/24    10.80.0.2
```

 **5. 노드 네트워크 처리** 

라우터는 패킷을 하이브리드 노드(`10.80.0.2`)로 전달합니다. 패킷이 노드에 도착해도 여전히 포드 A의 IP가 소스이고 포드 B의 IP가 대상입니다.

 **6. CNI 처리** 

노드의 네트워크 스택은 패킷을 수신하고 대상 IP가 자체가 아님을 확인한 후 처리를 위해 CNI에 전달합니다. CNI는 대상 IP가 이 노드에서 로컬로 실행되는 포드에 속함을 식별하고 적절한 가상 인터페이스를 통해 패킷을 올바른 포드로 전달합니다.

```
Original packet -> node routing -> CNI -> Pod B's network namespace
```

포드 B는 패킷을 수신하고 필요에 따라 처리합니다.

### 응답
<a name="_response_7"></a>

 **6. 포드 B에서 응답 전송** 

포드 B는 자체 IP를 소스로, 포드 A의 IP를 대상으로 하는 응답 패킷을 생성합니다.

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.56 | Src: 8080           |                 |
| Dst: 10.0.0.56  | Dst: 52390          |                 |
+-----------------+---------------------+-----------------+
```

CNI는 이 패킷이 외부 네트워크로 향하는 것을 식별하여 노드의 네트워크 스택으로 전달합니다.

 **5. 노드 네트워크 처리** 

노드는 대상 IP(`10.0.0.56`)가 로컬 네트워크에 속하지 않는다고 판단하고 패킷을 기본 게이트웨이(로컬 라우터)로 전달합니다.

 **4. 로컬 라우터 라우팅** 

로컬 라우터는 라우팅 테이블을 참조하여 대상 IP(`10.0.0.56`)가 VPC CIDR(`10.0.0.0/16`)에 속한다고 판단하고 패킷을 AWS에 연결하는 게이트웨이로 전달합니다.

 **3. 교차 경계 전송** 

패킷은 동일한 온프레미스를 통해 VPC 연결로 다시 이동하며 반대 방향으로 클라우드 경계를 통과합니다.

 **2. VPC 라우팅** 

패킷이 VPC에 도착하면 라우팅 시스템은 대상 IP가 VPC 내의 서브넷에 속함을 식별합니다. 패킷은 VPC 네트워크를 통해 포드 A를 호스팅하는 EC2 인스턴스로 라우팅됩니다.

 **1: 포드 A에서 응답 수신** 

패킷은 EC2 인스턴스에 도착하고 연결된 ENI를 통해 포드 A로 직접 전달됩니다. VPC CNI는 VPC의 포드에 오버레이 네트워킹을 사용하지 않으므로 추가 캡슐화 해제가 필요하지 않습니다. 패킷은 원래 헤더가 그대로 유지된 상태로 도착합니다.

이 동서 트래픽 흐름은 원격 포드 CIDR을 올바르게 구성하고 양방향으로 라우팅해야 하는 이유를 보여줍니다.
+ VPC에는 온프레미스 게이트웨이를 가리키는 원격 포드 CIDR에 대한 경로가 있어야 합니다.
+ 온프레미스 네트워크에는 해당 포드를 호스팅하는 특정 노드로 트래픽을 전달하는 포드 CIDR에 대한 경로가 있어야 합니다.

# 하이브리드 노드 `nodeadm` 참조
<a name="hybrid-nodes-nodeadm"></a>

Amazon EKS Hybrid Nodes CLI(`nodeadm`)는 하이브리드 노드 구성 요소의 설치, 구성, 등록 및 제거를 간소화합니다. 운영 체제 이미지에 `nodeadm`을 포함하여 하이브리드 노드 부트스트랩을 자동화할 수 있습니다. 자세한 내용은 [하이브리드 노드용 운영 체제 준비](hybrid-nodes-os.md) 섹션을 참조하세요.

하이브리드 노드용 `nodeadm` 버전은 Amazon EC2 인스턴스를 Amazon EKS 클러스터의 노드로 부트스트랩하는 데 사용되는 `nodeadm` 버전과 다릅니다. 적절한 `nodeadm` 버전의 설명서 및 참조를 따릅니다. 이 설명서 페이지는 하이브리드 노드 `nodeadm` 버전용입니다.

하이브리드 노드 `nodeadm`의 소스 코드는 https://github.com/aws/eks-hybrid GitHub 리포지토리에 게시됩니다.

**중요**  
root/sudo 권한이 있는 사용자와 함께 `nodeadm`을 실행해야 합니다.

## `nodeadm` 다운로드
<a name="_download_nodeadm"></a>

하이브리드 노드 버전 `nodeadm`은 Amazon CloudFront가 제공하는 Amazon S3에서 호스팅됩니다. 각 온프레미스 호스트에 `nodeadm`을 설치하려면 온프레미스 호스트에서 다음 명령을 실행할 수 있습니다.

 **x86\$164 호스트의 경우** 

```
curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/amd64/nodeadm'
```

 **ARM 호스트의 경우** 

```
curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/arm64/nodeadm'
```

각 호스트에서 다운로드한 바이너리에 실행 파일 권한을 추가합니다.

```
chmod +x nodeadm
```

## `nodeadm install`
<a name="_nodeadm_install"></a>

`nodeadm install` 명령은 하이브리드 노드를 실행하고 Amazon EKS 클러스터에 조인하는 데 필요한 아티팩트 및 종속성을 설치하는 데 사용됩니다. `nodeadm install` 명령을 각 하이브리드 노드에서 개별적으로 실행하거나 이미지 빌드 파이프라인 중에 실행하여 운영 체제 이미지에 하이브리드 노드 종속성을 사전 설치할 수 있습니다.

 **사용량** 

```
nodeadm install [KUBERNETES_VERSION] [flags]
```

 **위치 인수** 

(필수) `KUBERNETES_VERSION` 설치할 EKS Kubernetes의 major.minor 버전(예: `1.32`) 

 **Flags** 


| 이름 | 필수 | 설명 | 
| --- | --- | --- | 
|   `-p`,  `--credential-provider`   |  TRUE  |  설치할 자격 증명 공급자입니다. 지원되는 값은 `iam-ra` 및 `ssm`입니다. 자세한 정보는 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md)을 참조하세요.  | 
|   `-s`,  `--containerd-source`   |  FALSE  |  `containerd` 소스입니다. `nodeadm`은 OS distro, Docker 패키지에서 `containerd` 설치 또는 `containerd` 설치 건너뛰기를 지원합니다.  **값**   `distro` - 기본값입니다. `nodeadm`은 노드 OS(EKS Kubernetes 버전과 호환됨)에서 배포한 `containerd` 패키지를 설치합니다. `distro`는 Red Hat Enterprise Linux(RHEL) 운영 체제에서 지원되지 않는 값입니다.  `docker` - `nodeadm`은 Docker에서 빌드 및 배포한 최신 `containerd` 패키지를 설치합니다. `docker`는 Amazon Linux 2023에서 지원되지 않는 값입니다.  `none`-`nodeadm`은 `containerd` 패키지를 설치하지 않습니다. `nodeadm init`를 실행하기 전에 `containerd`를 수동으로 설치해야 합니다.  | 
|   `-r`,  `--region`   |  FALSE  |  SSM 에이전트와 같은 아티팩트를 다운로드할 AWS 리전을 지정합니다. 기본값은 `us-west-2`입니다.  | 
|   `-t`,  `--timeout`   |  FALSE  |  최대 설치 명령 기간입니다. 입력은 기간 형식을 따릅니다. 예: `1h23m`. 설치 명령의 기본 다운로드 제한 시간은 20분으로 설정됩니다.  | 
|   `-h`, `--help`   |  FALSE  |  사용 가능한 플래그, 하위 명령, 위치 값 파라미터가 포함된 도움말 메시지가 표시됩니다.  | 

 **예제** 

AWS Systems Manager(SSM)를 자격 증명 공급자로 사용하여 Kubernetes 버전 `1.32` 설치

```
nodeadm install 1.32 --credential-provider ssm
```

AWS Systems Manager(SSM)를 자격 증명 공급자로, Docker를 Containered 소스로 사용하여 Kubernetes 버전 `1.32`을 설치하고 다운로드 제한 시간은 20분입니다.

```
nodeadm install 1.32 --credential-provider ssm --containerd-source docker --timeout 20m
```

AWS IAM Roles Anywhere를 자격 증명 공급자로 사용하여 Kubernetes 버전 `1.32` 설치

```
nodeadm install 1.32 --credential-provider iam-ra
```

## `nodeadm config check`
<a name="_nodeadm_config_check"></a>

`nodeadm config check` 명령은 제공된 노드 구성에 오류가 있는지 확인합니다. 이 명령을 사용하여 하이브리드 노드 구성 파일의 정확성을 확인하고 검증할 수 있습니다.

 **사용량** 

```
nodeadm config check [flags]
```

 **Flags** 


| 이름 | 필수 | 설명 | 
| --- | --- | --- | 
|   `-c`,  `--config-source`   |  TRUE  |  nodeadm 구성 소스입니다. 하이브리드 노드의 경우 입력은 파일 체계의 URI를 따라야 합니다.  | 
|   `-h`, `--help`   |  FALSE  |  사용 가능한 플래그, 하위 명령, 위치 값 파라미터가 포함된 도움말 메시지가 표시됩니다.  | 

 **예제** 

```
nodeadm config check -c file://nodeConfig.yaml
```

## `nodeadm init`
<a name="_nodeadm_init"></a>

`nodeadm init` 명령은 하이브리드 노드를 시작하고 구성된 Amazon EKS 클러스터와 연결합니다. `nodeConfig.yaml` 파일을 구성하는 방법에 대한 자세한 내용은 [SSM 하이브리드 활성화를 위한 노드 구성](#hybrid-nodes-node-config-ssm) 또는 [IAM Roles Anywhere를 위한 노드 구성](#hybrid-nodes-node-config-iamra) 섹션을 참조하세요.

 **사용량** 

```
nodeadm init [flags]
```

 **Flags** 


| 이름 | 필수 | 설명 | 
| --- | --- | --- | 
|   `-c`,  `--config-source`   |  TRUE  |  `nodeadm` 구성 소스입니다. 하이브리드 노드의 경우 입력은 파일 체계의 URI를 따라야 합니다.  | 
|   `-s`,  `--skip`   |  FALSE  |  건너뛸 `init`의 단계입니다. 문제 해결에 도움이 되지 않는 한 단계를 건너뛰는 것은 권장되지 않습니다.  **값**   `install-validation`은 진행 중인 설치 명령이 성공적으로 실행되었는지 확인하는 단계를 건너뜁니다.  `cni-validation`은 노드에서 방화벽이 활성화된 경우 Cilium 또는 Calico CNI의 VXLAN 포트가 열려 있는지 확인하는 단계를 건너뜁니다.  `node-ip-validation`은 노드 IP가 원격 노드 네트워크의 CIDR에 속하는지 확인하는 단계를 건너뜁니다.  | 
|   `-h`, `--help`   |  FALSE  |  사용 가능한 플래그, 하위 명령, 위치 값 파라미터가 포함된 도움말 메시지가 표시됩니다.  | 

 **예제** 

```
nodeadm init -c file://nodeConfig.yaml
```

## `nodeadm upgrade`
<a name="_nodeadm_upgrade"></a>

`nodeadm upgrade` 명령은 설치된 모든 아티팩트를 최신 버전으로 업그레이드하고, 노드를 부트스트랩하여 업그레이드된 아티팩트를 구성하고 AWS에서 EKS 클러스터에 조인합니다. 업그레이드는 노드에서 실행되는 워크로드에 대한 중단 명령입니다. 업그레이드를 실행하기 전에 워크로드를 다른 노드로 이동하세요.

 **사용량** 

```
nodeadm upgrade [KUBERNETES_VERSION] [flags]
```

 **위치 인수** 

(필수) `KUBERNETES_VERSION` 설치할 EKS Kubernetes의 major.minor 버전(예: `1.32`) 

 **Flags** 


| 이름 | 필수 | 설명 | 
| --- | --- | --- | 
|   `-c`,  `--config-source`   |  TRUE  |  `nodeadm` 구성 소스입니다. 하이브리드 노드의 경우 입력은 파일 체계의 URI를 따라야 합니다.  | 
|   `-t`,  `--timeout`   |  FALSE  |  아티팩트 다운로드 제한 시간입니다. 입력은 기간 형식을 따릅니다. 예를 들면 1h23m입니다. 업그레이드 명령의 기본 다운로드 제한 시간은 10분으로 설정됩니다.  | 
|   `-s`,  `--skip`   |  FALSE  |  건너뛸 업그레이드 단계입니다. 문제 해결에 도움이 되지 않는 한 단계를 건너뛰는 것은 권장되지 않습니다.  **값**   `pod-validation`은 대몬 세트 및 정적 포드를 제외하고 노드에서 모든 포드가 실행 중인지 확인하는 단계를 건너뜁니다.  `node-validation`은 노드가 차단되었는지 확인하는 단계를 건너뜁니다.  `init-validation`은 업그레이드를 실행하기 전에 노드가 성공적으로 초기화되었는지 확인하는 단계를 건너뜁니다.  `containerd-major-version-upgrade`는 노드 업그레이드 중에 Containered 메이저 버전 업그레이드를 방지합니다.  | 
|   `-h`, `--help`   |  FALSE  |  사용 가능한 플래그, 하위 명령, 위치 값 파라미터가 포함된 도움말 메시지가 표시됩니다.  | 

 **예제** 

```
nodeadm upgrade 1.32 -c file://nodeConfig.yaml
```

```
nodeadm upgrade 1.32 -c file://nodeConfig.yaml --timeout 20m
```

## `nodeadm uninstall`
<a name="_nodeadm_uninstall"></a>

`nodeadm uninstall` 명령은 kubelet 및 Containered를 포함하여 `nodeadm install` 중에 아티팩트 `nodeadm` 설치를 중지하고 제거합니다. 제거 명령은 클러스터에서 하이브리드 노드를 드레이닝하거나 삭제하지 않습니다. 드레이닝 및 삭제 작업을 별도로 실행해야 합니다. 자세한 내용은 [하이브리드 노드 제거](hybrid-nodes-remove.md) 섹션을 참조하세요. 노드에 포드가 남아 있는 경우 기본적으로 `nodeadm uninstall`이 진행되지 않습니다. 마찬가지로 `nodeadm uninstall`은 CNI 종속성 또는 클러스터에서 실행하는 다른 Kubernetes 추가 기능의 종속성을 제거하지 않습니다. 호스트에서 CNI 설치를 완전히 제거하려면 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)의 지침을 참조하세요. 온프레미스 자격 증명 공급자로 AWS SSM 하이브리드 활성화를 사용하는 경우 `nodeadm uninstall` 명령은 호스트를 AWS SSM 관리형 인스턴스로 등록 취소합니다.

 **사용량** 

```
nodeadm uninstall [flags]
```

 **Flags** 


| 이름 | 필수 | 설명 | 
| --- | --- | --- | 
|   `-s`,  `--skip`   |  FALSE  |  건너뛸 제거 단계입니다. 문제 해결에 도움이 되지 않는 한 단계를 건너뛰는 것은 권장되지 않습니다.  **값**   `pod-validation`은 대몬 세트 및 정적 포드를 제외하고 노드에서 모든 포드가 실행 중인지 확인하는 단계를 건너뜁니다.  `node-validation`은 노드가 차단되었는지 확인하는 단계를 건너뜁니다.  `init-validation`은 제거를 실행하기 전에 노드가 성공적으로 초기화되었는지 확인하는 단계를 건너뜁니다.  | 
|   `-h`,  `--help`   |  FALSE  |  사용 가능한 플래그, 하위 명령, 위치 값 파라미터가 포함된 도움말 메시지가 표시됩니다.  | 
|   `-f`,  `--force`   |  FALSE  |  Kubernetes 및 CNI 구성 요소의 나머지 파일이 포함될 수 있는 추가 디렉터리를 강제로 삭제합니다.  **경고**  그러면 기본 Kubernetes 및 CNI 디렉터리(`/var/lib/cni`, `/etc/cni/net.d` 등)의 모든 콘텐츠가 삭제됩니다. 이러한 위치에 자체 데이터를 저장하는 경우 이 플래그를 사용하지 마세요. nodeadm `v1.0.9`부터 `./nodeadm uninstall --skip node-validation,pod-validation --force` 명령으로 더 이상 `/var/lib/kubelet` 디렉터리가 삭제되지 않습니다. 탑재된 노드 파일 시스템을 포함하는 포드 볼륨 및 볼륨 하위 경로 디렉터리가 포함될 수 있기 때문입니다.  **안전한 처리 관련 팁**  - 탑재된 경로를 삭제하면 실제 탑재된 노드 파일 시스템이 실수로 삭제될 수 있습니다. `/var/lib/kubelet` 디렉터리를 수동으로 삭제하기 전에 모든 활성 탑재를 주의하여 검사하고 볼륨 탑재를 안전하게 해제하여 데이터 손실을 방지합니다.  | 

 **예제** 

```
nodeadm uninstall
```

```
nodeadm uninstall --skip node-validation,pod-validation
```

## `nodeadm debug`
<a name="_nodeadm_debug"></a>

`nodeadm debug` 명령을 사용하여 비정상이거나 잘못 구성된 하이브리드 노드 문제를 해결할 수 있습니다. 다음 요구 사항이 있는지 확인합니다.
+ 노드는 자격 증명을 얻는 데 필요한 AWS API에 대한 네트워크 액세스 권한이 있습니다.
+ 노드는 구성된 하이브리드 노드 IAM 역할에 대한 AWS 자격 증명을 가져올 수 있습니다.
+ 노드에는 EKS Kubernetes API 엔드포인트에 대한 네트워크 액세스 권한과 EKS Kubernetes API 엔드포인트 인증서의 유효성이 있습니다.
+ 노드는 EKS 클러스터로 인증할 수 있고, 클러스터의 자격 증명이 유효하며, 노드가 EKS 클러스터에 대해 구성된 VPC를 통해 EKS 클러스터에 액세스할 수 있는지 확인할 수 있습니다.

오류가 발견되면 명령의 출력에서 문제 해결 단계를 제안합니다. 특정 검증 단계는 하위 프로세스를 보여줍니다. 이러한 오류가 발생하면 출력이 검증 오류 아래의 stderr 섹션에 표시됩니다.

 **사용량** 

```
nodeadm debug [flags]
```

 **Flags** 


| 이름 | 필수 | 설명 | 
| --- | --- | --- | 
|   `-c`, `--config-source`   |  TRUE  |  `nodeadm` 구성 소스입니다. 하이브리드 노드의 경우 입력은 파일 체계의 URI를 따라야 합니다.  | 
|   `--no-color`   |  FALSE  |  색상 출력을 비활성화합니다. 자동화에 유용합니다.  | 
|   `-h`, `--help`   |  FALSE  |  사용 가능한 플래그, 하위 명령, 위치 값 파라미터가 포함된 도움말 메시지가 표시됩니다.  | 

 **예제** 

```
nodeadm debug -c file://nodeConfig.yaml
```

## Nodeadm 파일 위치
<a name="_nodeadm_file_locations"></a>

### nodeadm install
<a name="_nodeadm_install_2"></a>

`nodeadm install`을 실행할 때 다음 파일과 파일 위치가 구성됩니다.


| 아티팩트 | 경로 | 
| --- | --- | 
|  IAM Roles Anywhere CLI  |  /usr/local/bin/aws\$1signing\$1helper  | 
|  Kubelet 바이너리  |  /usr/bin/kubelet  | 
|  Kubectl 바이너리  |  usr/local/bin/kubectl  | 
|  ECR 자격 증명 공급자  |  /etc/eks/image-credential-provider/ecr-credential-provider  | 
|   AWS IAM 인증자  |  /usr/local/bin/aws-iam-authenticator  | 
|  SSM 설정 CLI  |  /opt/ssm/ssm-setup-cli  | 
|  SSM 에이전트  |  Ubuntu - /snap/amazon-ssm-agent/current/amazon-ssm-agent RHEL 및 AL2023 - /usr/bin/amazon-ssm-agent  | 
|  Containered  |  Ubuntu 및 AL2023 - /usr/bin/containerd RHEL - /bin/containerd  | 
|  Iptables  |  Ubuntu 및 AL2023 - /usr/sbin/iptables RHEL - /sbin/iptables  | 
|  CNI 플러그인  |  /opt/cni/bin  | 
|  설치된 아티팩트 트래커  |  /opt/nodeadm/tracker  | 

### nodeadm init
<a name="_nodeadm_init_2"></a>

`nodeadm init`를 실행할 때 다음 파일과 파일 위치가 구성됩니다.


| 이름 | 경로 | 
| --- | --- | 
|  Kubelet kubeconfig  |  /var/lib/kubelet/kubeconfig  | 
|  Kubelet 구성  |  /etc/kubernetes/kubelet/config.json  | 
|  Kubelet systemd 단위  |  /etc/systemd/system/kubelet.service  | 
|  이미지 자격 증명 공급자 구성  |  /etc/eks/image-credential-provider/config.json  | 
|  Kubelet env 파일  |  /etc/eks/kubelet/environment  | 
|  Kubelet 인증서  |  /etc/kubernetes/pki/ca.crt  | 
|  Containered 구성  |  /etc/containerd/config.toml  | 
|  Containered 커널 모듈 구성  |  /etc/modules-load.d/contianerd.conf  | 
|   AWS Config 파일  |  /etc/aws/hybrid/config  | 
|   AWS 자격 증명 파일(자격 증명 파일을 활성화하는 경우)  |  /eks-hybrid/.aws/credentials  | 
|   AWS signing helper 시스템 단위  |  /etc/systemd/system/aws\$1signing\$1helper\$1update.service  | 
|  Sysctl conf 파일  |  /etc/sysctl.d/99-nodeadm.conf  | 
|  Ca-certificates  |  /etc/ssl/certs/ca-certificates.crt  | 
|  Gpg 키 파일  |  /etc/apt/keyrings/docker.asc  | 
|  Docker 리포지토리 소스 파일  |  /etc/apt/sources.list.d/docker.list  | 

## SSM 하이브리드 활성화를 위한 노드 구성
<a name="hybrid-nodes-node-config-ssm"></a>

다음은 하이브리드 노드 자격 증명에 AWS SSM 하이브리드 활성화를 사용할 때의 샘플 `nodeConfig.yaml`입니다.

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:             # Name of the EKS cluster
    region:           # AWS Region where the EKS cluster resides
  hybrid:
    ssm:
      activationCode: # SSM hybrid activation code
      activationId:   # SSM hybrid activation id
```

## IAM Roles Anywhere를 위한 노드 구성
<a name="hybrid-nodes-node-config-iamra"></a>

다음은 하이브리드 노드 자격 증명을 위한 AWS IAM Roles Anywhere의 샘플 `nodeConfig.yaml`입니다.

AWS IAM Roles Anywhere를 온프레미스 자격 증명 공급자로 사용하는 경우 `nodeadm` 구성에서 사용하는 `nodeName`은 하이브리드 노드 IAM 역할에 대해 범위가 지정된 권한과 일치해야 합니다. 예를 들어 하이브리드 노드 IAM 역할에 대한 권한이 역할 세션 이름이 호스트 인증서의 CN과 같을 때만 AWS IAM Roles Anywhere가 역할을 수임하도록 허용하는 경우 `nodeadm` 구성의 `nodeName`은 인증서의 CN과 동일해야 합니다. 사용하는 `nodeName`은 64자를 초과할 수 없습니다. 자세한 내용은 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md) 섹션을 참조하세요.

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:              # Name of the EKS cluster
    region:            # AWS Region where the EKS cluster resides
  hybrid:
    iamRolesAnywhere:
      nodeName:        # Name of the node
      trustAnchorArn:  # ARN of the IAM Roles Anywhere trust anchor
      profileArn:      # ARN of the IAM Roles Anywhere profile
      roleArn:         # ARN of the Hybrid Nodes IAM role
      certificatePath: # Path to the certificate file to authenticate with the IAM Roles Anywhere trust anchor
      privateKeyPath:  # Path to the private key file for the certificate
```

## kubelet 사용자 지정을 위한 노드 구성(선택 사항)
<a name="hybrid-nodes-nodeadm-kubelet"></a>

`nodeadm` 구성에서 kubelet 구성 및 플래그를 전달할 수 있습니다. `shutdownGracePeriod`를 30초로 설정하기 위해 노드 레이블 `abc.amazonaws.com/test-label` 및 구성을 추가하는 방법은 아래 예제를 참조하세요.

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:             # Name of the EKS cluster
    region:           # AWS Region where the EKS cluster resides
  kubelet:
    config:           # Map of kubelet config and values
       shutdownGracePeriod: 30s
    flags:            # List of kubelet flags
       - --node-labels=abc.company.com/test-label=true
  hybrid:
    ssm:
      activationCode: # SSM hybrid activation code
      activationId:   # SSM hybrid activation id
```

## Containered 사용자 지정을 위한 노드 구성(선택 사항)
<a name="_node_config_for_customizing_containerd_optional"></a>

`nodeadm` 구성에서 사용자 지정 Containered 구성을 전달할 수 있습니다. `nodeadm`에 대한 Containered 구성은 인라인 TOML을 허용합니다. Containered 콘텐츠 스토어에서 압축되지 않은 이미지 계층의 삭제를 비활성화하도록 Containered를 구성하는 방법은 아래 예제를 참조하세요.

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:             # Name of the EKS cluster
    region:           # AWS Region where the EKS cluster resides
  containerd:
    config: |         # Inline TOML containerd additional configuration
       [plugins."io.containerd.grpc.v1.cri".containerd]
       discard_unpacked_layers = false
  hybrid:
    ssm:
      activationCode: # SSM hybrid activation code
      activationId:   # SSM hybrid activation id
```

**참고**  
Containered 버전 1.x 및 2.x는 여러 구성 형식을 사용합니다. Containerd 1.x는 구성 버전 2를 사용하는 반면, Containered 2.x는 구성 버전 3을 사용합니다. Containered 2.x는 구성 버전 2와 이전 버전과의 호환성을 유지하지만 최적의 성능을 위해 구성 버전 3이 권장됩니다. `containerd --version`을 사용하여 Containered 버전을 확인하거나 `nodeadm` 설치 로그를 검토합니다. 구성 버전 관리에 대한 자세한 내용은 https://containerd.io/releases/를 참조하세요.

Containered 구성을 사용하여 SELinux 지원을 활성화할 수도 있습니다. Containered에서 SELinux를 활성화한 경우 노드에 예약된 포드에 적절한 securityContext 및 seLinuxOptions가 활성화되어 있는지 확인합니다. 보안 컨텍스트 구성에 대한 자세한 내용은 [Kubernetes 설명서](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/)에서 확인할 수 있습니다.

**참고**  
Red Hat Enterprise Linux(RHEL) 8 및 RHEL 9는 SELinux가 기본적으로 활성화하고 호스트에서 엄격으로 설정됩니다. Amazon Linux 2023는 SELinux가 기본적으로 활성화되고 허용 모드로 설정됩니다. SELinux가 호스트에서 허용 모드로 설정된 경우 Containered에서 활성화하면 요청이 차단되지 않고 호스트의 SELinux 구성에 따라 로깅됩니다.

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:             # Name of the EKS cluster
    region:           # AWS Region where the EKS cluster resides
  containerd:
    config: |         # Inline TOML containerd additional configuration
       [plugins."io.containerd.grpc.v1.cri"]
       enable_selinux = true
  hybrid:
    ssm:
      activationCode: # SSM hybrid activation code
      activationId:   # SSM hybrid activation id
```

# 하이브리드 노드 문제 해결
<a name="hybrid-nodes-troubleshooting"></a>

이 주제에서는 Amazon EKS Hybrid Nodes를 사용하는 동안 발생할 수 있는 몇 가지 일반적 오류와 이를 해결하는 방법을 다룹니다. 기타 문제 해결 정보는 [Amazon EKS 클러스터 및 노드 관련 문제 해결](troubleshooting.md) 및 *AWS re:Post*의 [Amazon EKS용 지식 센터 태그](https://repost.aws/tags/knowledge-center/TA4IvCeWI1TE66q4jEj4Z9zg/amazon-elastic-kubernetes-service)를 참조하세요. 문제를 해결할 수 없는 경우 AWS Support에 문의하세요.

 **`nodeadm debug`로 노드 문제 해결** 하이브리드 노드에서 `nodeadm debug` 명령을 실행하여 네트워킹 및 자격 증명 요구 사항이 충족되는지 확인할 수 있습니다. `nodeadm debug` 명령에 대한 자세한 내용은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md) 섹션을 참조하세요.

 **클러스터 인사이트를 통해 하이브리드 노드 관련 문제 탐지** Amazon EKS 클러스터 인사이트에는 클러스터의 EKS 하이브리드 노드 구성과 관련된 일반적인 문제를 탐지하는 *인사이트 검사*가 포함됩니다. AWS Management Console, AWS CLI, AWS SDK에서 모든 인사이트 검사의 결과를 볼 수 있습니다. 클러스터 인사이트에 대한 자세한 내용은 [클러스터 인사이트를 사용한 Kubernetes 버전 업그레이드 준비 및 잘못된 구성 문제 해결](cluster-insights.md) 섹션을 참조하세요.

## 하이브리드 노드 설치 문제 해결
<a name="hybrid-nodes-troubleshooting-install"></a>

다음 문제 해결 주제는 `nodeadm install` 명령을 사용하여 호스트에 하이브리드 노드 종속성을 설치하는 것과 관련이 있습니다.

 **`nodeadm` 명령이 `must run as root`와 함께 실패** 

`nodeadm install` 명령은 호스트에 root 또는 `sudo` 권한이 있는 사용자를 사용하여 실행해야 합니다. root 또는 `sudo` 권한이 없는 사용자로 `nodeadm install`을 실행하는 경우 `nodeadm` 출력에 다음 오류가 표시됩니다.

```
"msg":"Command failed","error":"must run as root"
```

 **종속성에 연결할 수 없음** 

`nodeadm install` 명령은 하이브리드 노드에 필요한 종속성을 설치합니다. 하이브리드 노드 종속성에는 `containerd`, `kubelet`, `kubectl`, AWS SSM 또는 AWS IAM Roles Anywhere 구성 요소가 포함됩니다. 이러한 종속성을 다운로드하려면 `nodeadm install`을 실행하는 위치에서 액세스할 수 있어야 합니다. 액세스가 가능해야 하는 위치 목록에 대한 자세한 내용은 [하이브리드 노드용 네트워킹 준비](hybrid-nodes-networking.md) 섹션을 참조하세요. 액세스 권한이 없는 경우 `nodeadm install` 출력에 다음과 유사한 오류가 표시됩니다.

```
"msg":"Command failed","error":"failed reading file from url: ...: max retries achieved for http request"
```

 **패키지 관리자 업데이트 실패** 

`nodeadm install` 명령은 하이브리드 노드 종속성을 설치하기 전에 `apt update` 또는 `yum update` 또는 `dnf update`를 실행합니다. 이 단계가 성공하지 않으면 다음과 유사한 오류가 표시될 수 있습니다. 문제를 해결하려면 `nodeadm install` 실행 전에 `apt update` 또는 `yum update` 또는 `dnf update` 업데이트를 실행하거나 `nodeadm install`을 다시 실행해 볼 수 있습니다.

```
failed to run update using package manager
```

 **제한 시간 또는 컨텍스트 기한 초과** 

`nodeadm install`을 실행할 때 설치 프로세스의 다양한 단계에서 제한 시간 또는 컨텍스트 기한을 초과했음을 나타내는 오류가 발생하는 경우, 연결이 느려져 제한 시간이 충족되기 전에 하이브리드 노드 종속성의 설치를 방해할 수 있습니다. 이러한 문제를 해결하려면 `nodeadm`에서 `--timeout` 플래그를 사용하여 종속성을 다운로드하는 제한 시간을 연장할 수 있습니다.

```
nodeadm install K8S_VERSION --credential-provider CREDS_PROVIDER --timeout 20m0s
```

## 하이브리드 노드 연결 문제 해결
<a name="hybrid-nodes-troubleshooting-connect"></a>

이 섹션의 문제 해결 주제는 `nodeadm init` 명령을 사용하여 하이브리드 노드를 EKS 클러스터에 연결하는 프로세스와 관련이 있습니다.

 **작업 오류 또는 지원되지 않는 체계** 

`nodeadm init`를 실행할 때 `operation error` 또는 `unsupported scheme`와 관련된 오류가 표시되면 `nodeConfig.yaml`을 확인하여 형식이 올바르게 지정되어 있고 `nodeadm`에 전달되었는지 확인합니다. `nodeConfig.yaml` 형식 및 옵션에 대한 자세한 내용은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md) 섹션을 참조하세요.

```
"msg":"Command failed","error":"operation error ec2imds: GetRegion, request canceled, context deadline exceeded"
```

 **`eks:DescribeCluster` 작업에 대한 하이브리드 노드 IAM 역할 권한 누락** 

`nodeadm init`를 실행할 때 `nodeadm`은 EKS `DescribeCluster` 작업을 직접 호출하여 EKS 클러스터에 대한 정보를 수집하려고 시도합니다. 하이브리드 노드 IAM 역할에 `eks:DescribeCluster` 작업에 대한 권한이 없으면 `nodeadm init`를 실행할 때 `nodeadm`에 전달하는 노드 구성에서 Kubernetes API 엔드포인트, 클러스터 CA 번들, 서비스 IPv4 CIDR을 전달해야 합니다. 하이브리드 노드 IAM 역할에 필요한 권한에 대한 자세한 내용은 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md) 섹션을 참조하세요.

```
"msg":"Command failed","error":"operation error EKS: DescribeCluster, https response error StatusCode: 403 ... AccessDeniedException"
```

 **`eks:ListAccessEntries` 작업에 대한 하이브리드 노드 IAM 역할 권한 누락** 

`nodeadm init`를 실행할 때 `nodeadm`은 EKS `ListAccessEntries` 작업을 직접 호출하여 하이브리드 노드 IAM 역할에 연결된 `HYBRID_LINUX` 유형의 액세스 항목이 EKS 클러스터에 있는지 검증하려고 시도합니다. 하이브리드 노드 IAM 역할에 `eks:ListAccessEntries` 작업에 대한 권한이 없는 경우 `nodeadm init` 명령을 실행할 때 `--skip cluster-access-validation` 플래그를 전달해야 합니다. 하이브리드 노드 IAM 역할에 필요한 권한에 대한 자세한 내용은 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md) 섹션을 참조하세요.

```
"msg":"Command failed","error":"operation error EKS: ListAccessEntries, https response error StatusCode: 403 ... AccessDeniedException"
```

 **노드 IP가 원격 노드 네트워크 CIDR에 없음** 

`nodeadm init`를 실행할 때 노드의 IP 주소가 지정된 원격 노드 네트워크 CIDR 내에 있지 않으면 오류가 발생할 수 있습니다. 오류는 다음 예와 유사합니다.

```
node IP 10.18.0.1 is not in any of the remote network CIDR blocks [10.0.0.0/16 192.168.0.0/16]
```

이 예는 원격 네트워크 CIDR가 10.0.0.0/16 및 192.168.0.0/16인 클러스터에 조인하려고 시도하는 IP 주소가 10.18.0.1인 노드를 보여줍니다. 10.18.0.1이 두 범위 중 하나에 속하지 않기 때문에 오류가 발생합니다.

모든 노드 IP 주소를 포함하도록 `RemoteNodeNetworks`를 올바르게 구성했는지 확인합니다. 네트워킹 구성에 대한 자세한 내용은 [하이브리드 노드용 네트워킹 준비](hybrid-nodes-networking.md) 섹션을 참조하세요.
+ `RemoteNodeNetwork` 구성을 확인하려면 클러스터가 위치한 리전에서 다음 명령을 실행합니다. 출력에 나열된 CIDR 블록에 노드의 IP 범위가 포함되어 있고 오류 메시지에 나열된 CIDR 블록과 동일한지 확인합니다. 일치하지 않는 경우 `nodeConfig.yaml`의 클러스터 이름 및 리전이 의도한 클러스터와 일치하는지 확인합니다.

```
aws eks describe-cluster --name CLUSTER_NAME --region REGION_NAME --query cluster.remoteNetworkConfig.remoteNodeNetworks
```
+ 의도한 노드로 작업하고 있는지 확인합니다.
  + 호스트 이름 및 IP 주소가 클러스터에 등록하려는 주소와 일치하는지 확인하여 올바른 노드에 있는지 확인합니다.
  + 이 노드가 올바른 온프레미스 네트워크(클러스터 설정 중에 CIDR 범위가 `RemoteNodeNetwork`로 등록된 네트워크)에 있는지 확인합니다.

노드 IP가 여전히 예상과 다를 경우 다음을 확인하세요.
+ IAM Roles Anywhere를 사용하는 경우 `kubelet`은 IAM Roles Anywhere `nodeName`에서 DNS 조회를 수행하고 사용 가능한 경우 노드 이름과 연결된 IP를 사용합니다. 노드의 DNS 항목을 유지 관리하는 경우 이러한 항목이 원격 노드 네트워크 CIDR 내의 IP를 가리키는지 확인합니다.
+ 노드에 여러 네트워크 인터페이스가 있는 경우 `kubelet`이 원격 노드 네트워크 CIDR 외부의 IP 주소가 있는 인터페이스를 기본값으로 선택할 수도 있습니다. 다른 인터페이스를 사용하려면 `nodeConfig.yaml`의 `--node-ip` `kubelet` 플래그를 사용하여 IP 주소를 지정합니다. 자세한 내용은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md) 섹션을 참조하세요. 노드에서 다음 명령을 실행하여 노드의 네트워크 인터페이스 및 해당 IP 주소를 볼 수 있습니다.

```
ip addr show
```

 **하이브리드 노드가 EKS 클러스터에 표시되지 않음** 

`nodeadm init`를 실행했지만 하이브리드 노드가 클러스터에 표시되지 않는 경우 하이브리드 노드와 EKS 컨트롤 플레인 간의 네트워크 연결에 문제가 있거나, 필요한 보안 그룹 권한이 구성되지 않았거나, Kubernetes 역할 기반 액세스 제어(RBAC)에 필요한 하이브리드 노드 IAM 역할을 매핑하지 않았을 수 있습니다. 다음 명령으로 `kubelet` 및 `kubelet` 로그의 상태를 확인하여 디버깅 프로세스를 시작할 수 있습니다. 클러스터에 조인하지 못한 하이브리드 노드에서 다음 명령을 실행합니다.

```
systemctl status kubelet
```

```
journalctl -u kubelet -f
```

 **클러스터와 통신할 수 없음** 

하이브리드 노드가 클러스터 컨트롤 플레인과 통신할 수 없는 경우 다음과 유사한 로그가 표시될 수 있습니다.

```
"Failed to ensure lease exists, will retry" err="Get ..."
```

```
"Unable to register node with API server" err="Post ..."
```

```
Failed to contact API server when waiting for CSINode publishing ... dial tcp <ip address>: i/o timeout
```

이러한 메시지가 표시되면 다음을 확인하여 [하이브리드 노드용 네트워킹 준비](hybrid-nodes-networking.md)에 자세히 설명된 하이브리드 노드 요구 사항을 충족하는지 확인합니다.
+ EKS 클러스터에 전달된 VPC에 온프레미스 노드 및 선택적으로 포드 CIDR에 대한 전송 게이트웨이(TGW) 또는 가상 프라이빗 게이트웨이(VGW)에 대한 경로가 있는지 확인합니다.
+ EKS 클러스터에 대한 추가 보안 그룹에 온프레미스 노드 CIDR 및 선택적으로 포드 CIDR에 대한 인바운드 규칙이 있는지 확인합니다.
+ 온프레미스 라우터가 EKS 컨트롤 플레인으로의 트래픽과 EKS 컨트롤 플레인으로부터의 트래픽을 허용하도록 구성되어 있는지 확인합니다.

 **권한이 없음** 

하이브리드 노드가 EKS 컨트롤 플레인과 통신할 수 있지만 등록할 수 없는 경우 다음과 유사한 로그가 표시될 수 있습니다. 아래 로그 메시지의 주요 차이점은 `Unauthorized` 오류입니다. 이는 노드에 필요한 권한이 없기 때문에 노드가 작업을 수행할 수 없음을 나타냅니다.

```
"Failed to ensure lease exists, will retry" err="Unauthorized"
```

```
"Unable to register node with API server" err="Unauthorized"
```

```
Failed to contact API server when waiting for CSINode publishing: Unauthorized
```

이러한 메시지가 표시되면 다음을 확인하여 [하이브리드 노드에 대한 자격 증명 준비](hybrid-nodes-creds.md) 및 [하이브리드 노드에 대한 클러스터 액세스 준비](hybrid-nodes-cluster-prep.md)의 하이브리드 노드 요구 사항 세부 정보를 충족하는지 확인합니다.
+ 하이브리드 노드의 ID가 예상 하이브리드 노드 IAM 역할과 일치하는지 확인합니다. 하이브리드 노드에서 `sudo aws sts get-caller-identity`를 실행하여 이 작업을 수행할 수 있습니다.
+ 하이브리드 노드 IAM 역할에 필요한 권한이 있는지 확인합니다.
+ 클러스터에 하이브리드 노드 IAM 역할에 대한 EKS 액세스 항목이 있는지 확인하거나 `aws-auth` ConfigMap에 하이브리드 노드 IAM 역할에 대한 항목이 있는지 확인합니다. EKS 액세스 항목을 사용하는 경우 하이브리드 노드 IAM 역할에 대한 액세스 항목이 `HYBRID_LINUX` 액세스 유형인지 확인합니다. `aws-auth` ConfigMap을 사용하는 경우 하이브리드 노드 IAM 역할에 대한 항목이 [하이브리드 노드에 대한 클러스터 액세스 준비](hybrid-nodes-cluster-prep.md)에 설명된 요구 사항 및 형식을 충족하는지 확인합니다.

### EKS 클러스터에 등록되었지만 `Not Ready` 상태로 표시되는 하이브리드 노드
<a name="hybrid-nodes-troubleshooting-not-ready"></a>

하이브리드 노드가 EKS 클러스터에 성공적으로 등록되었지만 하이브리드 노드에 `Not Ready` 상태가 표시되는 경우 가장 먼저 확인해야 할 것은 컨테이너 네트워킹 인터페이스(CNI) 상태입니다. CNI를 설치하지 않은 경우 하이브리드 노드의 상태가 `Not Ready`일 것으로 예상됩니다. CNI가 성공적으로 설치되고 실행되면 노드가 `Ready` 상태로 전환됩니다. CNI를 설치하려고 했지만 성공적으로 실행되지 않는 경우 이 페이지의 [하이브리드 노드 CNI 문제 해결](#hybrid-nodes-troubleshooting-cni) 섹션을 참조하세요.

 **인증서 서명 요청(CSR) 보류 중** 

하이브리드 노드를 EKS 클러스터에 연결한 후 하이브리드 노드에 대해 보류 중인 CSR이 있는 경우 하이브리드 노드가 자동 승인 요구 사항을 충족하지 않습니다. 하이브리드 노드에 대한 CSR은 `eks.amazonaws.com/compute-type: hybrid` 레이블이 있는 노드에서 하이브리드 노드용 CSR을 생성하고, CSR에 다음과 같은 주제 대체 이름(SAN)이 포함된 경우 자동으로 승인 및 발급됩니다. 노드 이름과 동일한 DNS SAN이 1개 이상이며 IP SAN이 원격 노드 네트워크 CIDR에 속합니다.

 **하이브리드 프로필 이미 있음** 

`nodeadm` 구성을 변경하고 새 구성으로 노드를 다시 등록하려고 하면 하이브리드 프로필이 이미 있지만 내용이 변경되었다는 오류가 표시될 수 있습니다. 구성 변경 사이에 `nodeadm init`를 실행하는 대신 `nodeadm uninstall`를 실행한 다음 `nodeadm install` 및 `nodeadm init`를 실행합니다. 이렇게 하면 구성 변경 사항을 적절히 정리할 수 있습니다.

```
"msg":"Command failed","error":"hybrid profile already exists at /etc/aws/hybrid/config but its contents do not align with the expected configuration"
```

 **하이브리드 노드가 프라이빗 API를 확인하지 못함** 

`nodeadm init`를 실행한 후 `no such host`가 있어 `kubelet` 로그에 EKS Kubernetes API 서버에 연결하지 못하는 오류가 표시되는 경우 온프레미스 네트워크 또는 호스트 수준에서 EKS Kubernetes API 엔드포인트의 DNS 항목을 변경해야 할 수 있습니다. *AWS Route53 설명서*의 [Forwarding inbound DNS queries to your VPC](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-forwarding-inbound-queries.html)를 참조하세요.

```
Failed to contact API server when waiting for CSINode publishing: Get ... no such host
```

 **EKS 콘솔에서 하이브리드 노드를 볼 수 없음** 

하이브리드 노드를 등록했지만 EKS 콘솔에서 볼 수 없는 경우 콘솔을 보는 데 사용 중인 IAM 보안 주체의 권한을 확인합니다. 사용 중인 IAM 보안 주체는 콘솔에서 리소스를 볼 수 있는 특정 최소 IAM 및 Kubernetes 권한이 있어야 합니다. 자세한 내용은 [AWS Management Console에서 Kubernetes 리소스 보기](view-kubernetes-resources.md) 섹션을 참조하세요.

## 하이브리드 노드 실행 문제 해결
<a name="_running_hybrid_nodes_troubleshooting"></a>

EKS 클러스터에 등록된 하이브리드 노드가 `Ready` 상태였다가 `Not Ready` 상태로 전환된 경우 CPU, 메모리 또는 사용 가능한 디스크 공간에 대한 리소스가 부족하거나 노드가 EKS 컨트롤 플레인에서 연결 해제되는 등 상태가 비정상일 수 있는 다양한 문제가 있습니다. 아래 단계를 사용하여 노드 문제를 해결할 수 있으며, 문제를 해결할 수 없는 경우 AWS Support에 문의하세요.

하이브리드 노드에서 `nodeadm debug`를 실행하여 네트워킹 및 자격 증명 요구 사항이 충족되는지 확인합니다. `nodeadm debug` 명령에 대한 자세한 내용은 [하이브리드 노드 `nodeadm` 참조](hybrid-nodes-nodeadm.md) 섹션을 참조하세요.

 **노드 상태 가져오기** 

```
kubectl get nodes -o wide
```

 **노드 조건 및 이벤트 확인** 

```
kubectl describe node NODE_NAME
```

 **포드 상태 가져오기** 

```
kubectl get pods -A -o wide
```

 **포드 조건 및 이벤트 확인** 

```
kubectl describe pod POD_NAME
```

 **포드 로그 확인** 

```
kubectl logs POD_NAME
```

 **`kubectl` 로그 확인** 

```
systemctl status kubelet
```

```
journalctl -u kubelet -f
```

 **포드 활성 프로브가 실패하거나 웹후크가 작동하지 않음** 

하이브리드 노드에서 실행되는 애플리케이션, 추가 기능 또는 웹후크가 제대로 시작되지 않는 경우 포드에 대한 통신을 차단하는 네트워킹 문제가 있을 수 있습니다. EKS 컨트롤 플레인이 하이브리드 노드에서 실행되는 웹후크와 접촉하려면 원격 포드 네트워크로 EKS 클러스터를 구성하고 전송 게이트웨이(TGW), 가상 프라이빗 게이트웨이(VPW) 또는 VPC를 온프레미스 네트워크와 연결하는 데 사용하는 기타 게이트웨이를 대상으로 하는 VPC 라우팅 테이블의 온프레미스 포드 CIDR에 대한 경로가 있어야 합니다. 하이브리드 노드의 네트워킹 요구 사항에 대한 자세한 내용은 [하이브리드 노드용 네트워킹 준비](hybrid-nodes-networking.md) 섹션을 참조하세요. 또한 온프레미스 방화벽에서 이 트래픽을 허용하고 라우터가 포드로 올바르게 라우팅될 수 있도록 해야 합니다. 하이브리드 노드에서의 웹후크 실행 요구 사항에 대한 자세한 내용은 [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md) 섹션을 참조하세요.

이 시나리오에 대한 일반적인 포드 로그 메시지는 아래에 나와 있습니다. 여기서 ip-address는 Kubernetes 서비스의 클러스터 IP입니다.

```
dial tcp <ip-address>:443: connect: no route to host
```

 **`kubectl logs` 또는 `kubectl exec` 명령이 작동하지 않음(`kubelet` API 명령)** 

다른 `kubectl` 명령은 성공하지만 `kubectl attach`, `kubectl cp`, `kubectl exec`, `kubectl logs` 또는 `kubectl port-forward` 명령이 제한 시간을 초과하면 원격 네트워크 구성과 관련된 문제일 수 있습니다. 이러한 명령은 클러스터를 통해 노드의 `kubelet` 엔드포인트에 연결됩니다. 자세한 내용은 [`kubelet` 엔드포인트](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-kubelet-api)을 참조하세요.

노드 IP 및 포드 IP가 클러스터에 대해 구성된 원격 노드 네트워크 및 원격 포드 네트워크 CIDR 내에 속하는지 확인합니다. 아래 명령을 사용하여 IP 할당을 검사합니다.

```
kubectl get nodes -o wide
```

```
kubectl get pods -A -o wide
```

이러한 IP를 구성된 원격 네트워크 CIDR과 비교하여 적절한 라우팅을 보장합니다. 네트워크 구성 요구 사항에 대한 자세한 내용은 [하이브리드 노드용 네트워킹 준비](hybrid-nodes-networking.md) 섹션을 참조하세요.

## 하이브리드 노드 CNI 문제 해결
<a name="hybrid-nodes-troubleshooting-cni"></a>

하이브리드 노드로 Cilium 또는 Calico를 처음 시작하는 데 문제가 발생하는 경우 하이브리드 노드 또는 하이브리드 노드에서 실행되는 CNI 포드와 EKS 컨트롤 플레인 간의 네트워킹 문제로 인해 가장 자주 발생합니다. 환경이 하이브리드 노드용 네트워킹 준비의 요구 사항을 충족하는지 확인합니다. 문제를 세분화하면 도움이 됩니다.

EKS 클러스터 구성  
RemoteNodeNetwork 및 RemotePodNetwork 구성이 정확합니까?

VPC 구성  
전송 게이트웨이 또는 가상 프라이빗 게이트웨이가 대상인 VPC 라우팅 테이블에 RemoteNodeNetwork 및 RemotePodNetwork에 대한 경로가 있습니까?

보안 그룹 구성  
RemoteNodeNetwork 및 RemotePodNetwork에 대한 인바운드 및 아웃바운드 규칙이 있습니까?

온프레미스 네트워크  
EKS 컨트롤 플레인과 하이브리드 노드 및 하이브리드 노드에서 실행되는 포드 간에 경로 및 액세스 권한이 있습니까?

CNI 구성  
오버레이 네트워크를 사용하는 경우 웹후크를 사용할 때 CNI의 IP 풀 구성이 EKS 클러스터에 대해 구성된 RemotePodNetwork와 일치합니까?

 **하이브리드 노드에 CNI가 설치되지 않고 `Ready` 상태임** 

하이브리드 노드에 `Ready` 상태가 표시되지만 클러스터에 CNI를 설치하지 않은 경우 하이브리드 노드에 이전 CNI 아티팩트가 있을 수 있습니다. 기본적으로 Helm과 같은 도구를 사용하여 Cilium 및 Calico를 제거하면 물리적 머신이나 가상 머신에서 온디스크 리소스가 제거되지 않습니다. 또한 이러한 CNI에 대한 사용자 지정 리소스 정의(CRD)가 이전 설치에서 클러스터에 계속 존재할 수 있습니다. 자세한 내용은 [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)의 Cilium 삭제 및 Calico 삭제 섹션을 참조하세요.

 **Cilium 문제 해결** 

하이브리드 노드에서 Cilium을 실행하는 데 문제가 있는 경우 Cilium 설명서의 [the troubleshooting steps](https://docs.cilium.io/en/stable/operations/troubleshooting/)를 참조하세요. 아래 섹션에서는 하이브리드 노드에 Cilium을 배포하는 작업과 관련된 문제를 다룹니다.

 **Cilium이 시작되지 않음** 

각 하이브리드 노드에서 실행되는 Cilium 에이전트가 시작되지 않는 경우 Cilium 에이전트 포드의 로그에 오류가 있는지 확인합니다. Cilium 에이전트를 시작하려면 EKS Kubernetes API 엔드포인트에 연결해야 합니다. 이 연결이 올바르게 구성되지 않으면 Cilium 에이전트 시작이 실패합니다. 이 경우 Cilium 에이전트 포드 로그에 다음과 유사한 로그 메시지가 표시됩니다.

```
msg="Unable to contact k8s api-server"
level=fatal msg="failed to start: Get \"https://<k8s-cluster-ip>:443/api/v1/namespaces/kube-system\": dial tcp <k8s-cluster-ip>:443: i/o timeout"
```

Cilium 에이전트는 호스트 네트워크에서 실행됩니다. Cilium 연결을 위해 EKS 클러스터를 `RemoteNodeNetwork`로 구성해야 합니다. `RemoteNodeNetwork`에 대한 인바운드 규칙을 적용한 EKS 클러스터에 대한 추가 보안 그룹이 있고, `RemoteNodeNetwork`에 대한 VPC에 경로가 있으며 온프레미스 네트워크가 EKS 컨트롤 플레인에 연결할 수 있도록 올바르게 구성되어 있는지 확인합니다.

Cilium 연산자가 실행 중이고 전부가 아닌 일부 Cilium 에이전트가 실행 중인 경우 클러스터의 모든 노드에 할당할 수 있는 포드 IP가 있는지 확인합니다. Cilium 구성에서 `clusterPoolIPv4PodCIDRList`와 함께 클러스터 풀 IPAM을 사용할 때 할당 가능한 포드 CIDR의 크기를 구성합니다. 노드별 CIDR 크기는 Cilium 구성의 `clusterPoolIPv4MaskSize` 설정으로 구성됩니다. 자세한 내용은 Cilium 설명서의 [클러스터 풀 확장](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/#expanding-the-cluster-pool)을 참조하세요.

 **Cilium BGP가 작동하지 않음** 

Cilium BGP 컨트롤 플레인을 사용하여 포드 또는 서비스 주소를 온프레미스 네트워크에 알리는 경우 다음 Cilium CLI 명령을 사용하여 BGP가 리소스에 경로를 알리는지 확인할 수 있습니다. Cilium CLI를 설치하는 단계는Cilium 설명서의 [Install the Cilium CLI](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/#install-the-cilium-cli)를 참조하세요.

BGP가 올바르게 작동하는 경우 출력에 세션 상태가 `established`인 하이브리드 노드가 있어야 합니다. 네트워킹 팀과 협력하여 환경의 로컬 AS, 피어 AS, 피어 주소에 대한 올바른 값을 식별해야 할 수 있습니다.

```
cilium bgp peers
```

```
cilium bgp routes
```

Cilium BGP를 사용하여 유형이 `LoadBalancer`인 서비스의 IP를 알리는 경우 `CiliumLoadBalancerIPPool` 및 서비스 모두에 동일한 레이블이 있어야 하며, 이는 `CiliumBGPAdvertisement`의 선택기에 사용해야 합니다. 예를 들면 다음과 같습니다. 참고로 Cilium BGP를 사용하여 LoadBalancer 유형의 서비스 IP를 알리는 경우 Cilium 에이전트를 다시 시작하는 동안 BGP 경로가 중단될 수 있습니다. 자세한 내용은 Cilium 설명서의 [Failure Scenarios](https://docs.cilium.io/en/latest/network/bgp-control-plane/bgp-control-plane-operation/#failure-scenarios)를 참조하세요.

 **서비스** 

```
kind: Service
apiVersion: v1
metadata:
  name: guestbook
  labels:
    app: guestbook
spec:
  ports:
  - port: 3000
    targetPort: http-server
  selector:
    app: guestbook
  type: LoadBalancer
```

 **CiliumLoadBalancerIPPool** 

```
apiVersion: cilium.io/v2alpha1
kind: CiliumLoadBalancerIPPool
metadata:
  name: guestbook-pool
  labels:
    app: guestbook
spec:
  blocks:
  - cidr: <CIDR to advertise>
  serviceSelector:
    matchExpressions:
      - { key: app, operator: In, values: [ guestbook ] }
```

 **CiliumBGPAdvertisement** 

```
apiVersion: cilium.io/v2alpha1
kind: CiliumBGPAdvertisement
metadata:
  name: bgp-advertisements-guestbook
  labels:
    advertise: bgp
spec:
  advertisements:
    - advertisementType: "Service"
      service:
        addresses:
          - ExternalIP
          - LoadBalancerIP
      selector:
        matchExpressions:
          - { key: app, operator: In, values: [ guestbook ] }
```

 **Calico 문제 해결** 

하이브리드 노드에서 Calico를 실행하는 데 문제가 있는 경우 Calico 설명서의 [the troubleshooting steps](https://docs.tigera.io/calico/latest/operations/troubleshoot/)를 참조하세요. 아래 섹션에서는 하이브리드 노드에 Calico를 배포하는 작업과 관련된 문제를 다룹니다.

아래 표에는 Calico 구성 요소와 기본적으로 노드 또는 포드 네트워크에서 실행되는지 여부가 요약되어 있습니다. 발신 포드 트래픽에 NAT를 사용하도록 Calico를 구성한 경우 온프레미스 네트워크를 구성하여 온프레미스 노드 CIDR로 트래픽을 라우팅하고 VPC 라우팅 테이블을 전송 게이트웨이(TGW) 또는 가상 프라이빗 게이트웨이(VGW)를 대상으로 하는 온프레미스 노드 CIDR의 경로로 구성해야 합니다. 발신 포드 트래픽에 NAT를 사용하도록 Calico를 구성하지 않은 경우 온프레미스 네트워크를 구성하여 온프레미스 포드 CIDR로 트래픽을 라우팅하고 VPC 라우팅 테이블을 전송 게이트웨이(TGW) 또는 가상 프라이빗 게이트웨이(VGW)를 대상으로 하는 온프레미스 포드 CIDR의 경로로 구성해야 합니다.


| 구성 요소 | Network | 
| --- | --- | 
|  Calico API 서버  |  노드  | 
|  Kubernetes용 Calico 컨트롤러  |  포드  | 
|  Calico 노드 에이전트  |  노드  | 
|  Calico `typha`   |  노드  | 
|  Calico CSI 노드 드라이버  |  포드  | 
|  Calico 연산자  |  노드  | 

 **Calico 리소스가 차단된 노드에서 예약 또는 실행됨** 

DaemonSet로 실행되지 않는 Calico 리소스에는 기본적으로 유연한 허용 오차가 있어 포드를 예약하거나 실행할 준비가 되지 않은 차단된 노드에서 예약할 수 있습니다. 다음을 포함하도록 연산자 설치를 변경하여 DaemonSet Calico가 아닌 리소스에 대한 허용치를 강화할 수 있습니다.

```
installation:
  ...
  controlPlaneTolerations:
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  calicoKubeControllersDeployment:
    spec:
      template:
        spec:
          tolerations:
          - effect: NoExecute
            key: node.kubernetes.io/unreachable
            operator: Exists
            tolerationSeconds: 300
          - effect: NoExecute
            key: node.kubernetes.io/not-ready
            operator: Exists
            tolerationSeconds: 300
  typhaDeployment:
    spec:
      template:
        spec:
          tolerations:
          - effect: NoExecute
            key: node.kubernetes.io/unreachable
            operator: Exists
            tolerationSeconds: 300
          - effect: NoExecute
            key: node.kubernetes.io/not-ready
            operator: Exists
            tolerationSeconds: 300
```

## 자격 증명 문제 해결
<a name="hybrid-nodes-troubleshooting-creds"></a>

AWS SSM 하이브리드 활성화와 AWS IAM Roles Anywhere 모두에 대해 하이브리드 노드에서 다음 명령을 실행하여 하이브리드 노드 IAM 역할에 대한 자격 증명이 하이브리드 노드에 올바르게 구성되어 있는지 검증할 수 있습니다. 노드 이름과 하이브리드 노드 IAM 역할 이름이 예상대로인지 확인합니다.

```
sudo aws sts get-caller-identity
```

```
{
    "UserId": "ABCDEFGHIJKLM12345678910:<node-name>",
    "Account": "<aws-account-id>",
    "Arn": "arn:aws:sts::<aws-account-id>:assumed-role/<hybrid-nodes-iam-role/<node-name>"
}
```

 ** AWS Systems Manager(SSM) 문제 해결** 

하이브리드 노드 자격 증명에 AWS SSM 하이브리드 활성화를 사용하는 경우 `nodeadm`이 하이브리드 노드에 설치하는 다음 SSM 디렉터리 및 아티팩트에 유의합니다. SSM 에이전트에 대한 자세한 내용은 *AWS Systems Manager 사용 설명서*의 [Working with the SSM agent](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html)을 참조하세요.


| 설명 | 위치 | 
| --- | --- | 
|  SSM 에이전트  |  Ubuntu-`/snap/amazon-ssm-agent/current/amazon-ssm-agent` RHEL & AL2023-`/usr/bin/amazon-ssm-agent`   | 
|  SSM Agent 로그  |   `/var/log/amazon/ssm`   | 
|   AWS 보안 인증  |   `/root/.aws/credentials`   | 
|  SSM 설정 CLI  |   `/opt/ssm/ssm-setup-cli`   | 

 **SSM 에이전트 다시 시작** 

일부 문제는 SSM 에이전트를 다시 시작하여 해결할 수 있습니다. 아래 명령을 사용하여 다시 시작할 수 있습니다.

 **AL2023 및 기타 운영 체제** 

```
systemctl restart amazon-ssm-agent
```

 **Ubuntu** 

```
systemctl restart snap.amazon-ssm-agent.amazon-ssm-agent
```

 **SSM 엔드포인트에 대한 연결 확인** 

하이브리드 노드에서 SSM 엔드포인트에 연결할 수 있는지 확인합니다. SSM 엔드포인트 목록은 [AWS Systems Manager endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/ssm.html)을 참조하세요. 아래 명령에서 `us-west-2`를 AWS SSM 하이브리드 활성화를 위한 AWS 리전으로 바꿉니다.

```
ping ssm.us-west-2.amazonaws.com
```

 **등록된 SSM 인스턴스의 연결 상태 보기** 

다음 AWS CLI 명령을 사용하여 SSM 하이브리드 활성화에 등록된 인스턴스의 연결 상태를 확인할 수 있습니다. 시스템 ID를 인스턴스의 시스템 ID로 바꿉니다.

```
aws ssm get-connection-status --target mi-012345678abcdefgh
```

 **SSM 설정 CLI 체크섬 불일치** 

`nodeadm install`을 실행할 때 `ssm-setup-cli` 체크섬 불일치 문제가 발생하면 호스트에 기존 SSM 설치가 없는지 확인해야 합니다. 호스트에 이전 SSM 설치가 있는 경우 이를 제거하고 `nodeadm install`을 다시 실행하여 문제를 해결합니다.

```
Failed to perform agent-installation/on-prem registration: error while verifying installed ssm-setup-cli checksum: checksum mismatch with latest ssm-setup-cli.
```

 **SSM `InvalidActivation`** 

인스턴스를 AWS SSM에 등록하는 동안 오류가 발생하면 `nodeConfig.yaml`의 `region`, `activationCode`, `activationId`가 올바른지 확인합니다. EKS 클러스터의 AWS 리전은 SSM 하이브리드 활성화의 리전과 일치해야 합니다. 이러한 값이 잘못 구성된 경우 다음과 유사한 오류가 표시될 수 있습니다.

```
ERROR Registration failed due to error registering the instance with AWS SSM. InvalidActivation
```

 **SSM `ExpiredTokenException`: 요청에 포함된 보안 토큰이 만료됨** 

SSM 에이전트가 자격 증명을 새로 고칠 수 없는 경우 `ExpiredTokenException`이 표시될 수 있습니다. 이 시나리오에서는 하이브리드 노드에서 SSM 엔드포인트에 연결할 수 있는 경우 SSM 에이전트를 다시 시작하여 자격 증명 새로 고침을 강제로 수행해야 할 수 있습니다.

```
"msg":"Command failed","error":"operation error SSM: DescribeInstanceInformation, https response error StatusCode: 400, RequestID: eee03a9e-f7cc-470a-9647-73d47e4cf0be, api error ExpiredTokenException: The security token included in the request is expired"
```

 **시스템 등록 명령을 실행하는 중 SSM 오류 발생** 

시스템을 SSM에 등록하는 동안 오류가 발생하면 `nodeadm install`을 다시 실행하여 모든 SSM 종속성이 올바르게 설치되었는지 확인해야 할 수 있습니다.

```
"error":"running register machine command: , error: fork/exec /opt/aws/ssm-setup-cli: no such file or directory"
```

 **SSM `ActivationExpired`** 

`nodeadm init`를 실행할 때 만료된 활성화로 인해 인스턴스를 SSM에 등록하는 동안 오류가 발생하면 새 SSM 하이브리드 활성화를 생성하고, 새 SSM 하이브리드 활성화의 `activationCode` 및 `activationId`로 `nodeConfig.yaml`을 업데이트하고, `nodeadm init`를 다시 실행해야 합니다.

```
"msg":"Command failed","error":"SSM activation expired. Please use a valid activation"
```

```
ERROR Registration failed due to error registering the instance with AWS SSM. ActivationExpired
```

 **SSM이 캐시된 자격 증명을 새로 고치지 못함** 

캐시된 자격 증명을 새로 고치지 못하면 호스트에서 `/root/.aws/credentials` 파일이 삭제되었을 수 있습니다. 먼저 SSM 하이브리드 활성화를 확인하고, 활성화가 활성 상태이며 하이브리드 노드가 활성화를 사용하도록 올바르게 구성되어 있는지 확인합니다. `/var/log/amazon/ssm`에서 SSM 에이전트 로그를 확인하고 SSM 측에서 문제를 해결한 후 `nodeadm init` 명령을 다시 실행합니다.

```
"Command failed","error":"operation error SSM: DescribeInstanceInformation, get identity: get credentials: failed to refresh cached credentials"
```

 **SSM 정리** 

호스트에서 SSM 에이전트를 제거하려면 다음 명령을 실행할 수 있습니다.

```
dnf remove -y amazon-ssm-agent
sudo apt remove --purge amazon-ssm-agent
snap remove amazon-ssm-agent
rm -rf /var/lib/amazon/ssm/Vault/Store/RegistrationKey
```

 ** AWSIAM Roles Anywhere 문제 해결** 

하이브리드 노드 자격 증명에 AWS IAM Roles Anywhere를 사용하는 경우 `nodeadm`에서 하이브리드 노드에 설치하는 다음 디렉터리 및 아티팩트에 유의합니다. IAM Roles Anywhere 문제 해결에 대한 자세한 내용은 *AWS IAM Roles Anywhere 사용 설명서*의 [Troubleshooting AWS IAM Roles Anywhere identity and access](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/security_iam_troubleshoot.html)을 참조하세요.


| 설명 | 위치 | 
| --- | --- | 
|  IAM Roles Anywhere CLI  |   `/usr/local/bin/aws_signing_helper`   | 
|  기본 인증서 위치 및 이름  |   `/etc/iam/pki/server.pem`   | 
|  기본 키 위치 및 이름  |   `/etc/iam/pki/server.key`   | 

 **IAM Roles Anywhere가 캐시된 자격 증명을 새로 고치지 못함** 

캐시된 자격 증명을 새로 고치지 못한 경우 `/etc/aws/hybrid/config`의 내용을 검토하고 `nodeadm` 구성에서 IAM Roles Anywhere가 올바르게 구성되었는지 확인합니다. `/etc/iam/pki`가 존재하는지 확인합니다. 각 노드에는 고유한 인증서와 키가 있어야 합니다. 기본적으로 IAM Roles Anywhere를 자격 증명 공급자로 사용하는 경우 `nodeadm`은 인증서 위치 및 이름에 `/etc/iam/pki/server.pem`을 사용하고 프라이빗 키에 `/etc/iam/pki/server.key`를 사용합니다. `sudo mkdir -p /etc/iam/pki`를 사용하여 디렉터리에 인증서와 키를 배치하기 전에 디렉터리를 생성해야 할 수 있습니다. 아래 명령을 사용하여 인증서의 내용을 확인할 수 있습니다.

```
openssl x509 -text -noout -in server.pem
```

```
open /etc/iam/pki/server.pem: no such file or directory
could not parse PEM data
Command failed {"error": "... get identity: get credentials: failed to refresh cached credentials, process provider error: error in credential_process: exit status 1"}
```

 **IAM Roles Anywhere에 `sts:AssumeRole` 수행 권한 없음** 

`kubelet` 로그에서 IAM Roles Anywhere를 사용할 때 `sts:AssumeRole` 작업에 대한 액세스 거부 문제가 표시되면 하이브리드 노드 IAM 역할의 신뢰 정책을 확인하여 IAM Roles Anywhere 서비스 보안 주체가 하이브리드 노드 IAM 역할을 수임할 수 있는지 확인합니다. 또한 하이브리드 노드 IAM 역할 신뢰 정책에서 트러스트 앵커 ARN이 올바르게 구성되었는지 그리고 하이브리드 노드 IAM 역할이 IAM Roles Anywhere 프로필에 추가되었는지 확인합니다.

```
could not get token: AccessDenied: User: ... is not authorized to perform: sts:AssumeRole on resource: ...
```

 **IAM Roles Anywhere에 `roleSessionName` 설정 권한 없음** 

`kubelet` 로그에서 `roleSessionName` 설정을 위한 액세스 거부 문제가 표시되면 IAM Roles Anywhere 프로필에 대해 `acceptRoleSessionName`을 true로 설정했는지 확인합니다.

```
AccessDeniedException: Not authorized to set roleSessionName
```

## 운영 체제 문제 해결
<a name="hybrid-nodes-troubleshooting-os"></a>

### RHEL
<a name="_rhel"></a>

 **권한 또는 구독 관리자 등록 실패** 

`nodeadm install`을 실행 중이고 권한 등록 문제로 인해 하이브리드 노드 종속성을 설치하지 못한 경우 호스트에 Red Hat 사용자 이름과 암호를 올바르게 설정했는지 확인합니다.

```
This system is not registered with an entitlement server
```

### Ubuntu
<a name="_ubuntu"></a>

 **GLIBC를 찾을 수 없음** 

운영 체제에 Ubuntu를 사용하고 하이브리드 노드가 있는 자격 증명 공급자에 IAM Roles Anywhere를 사용하고 있는데 GLIBC에서 문제를 찾을 수 없는 경우 해당 종속성을 수동으로 설치하여 문제를 해결할 수 있습니다.

```
GLIBC_2.32 not found (required by /usr/local/bin/aws_signing_helper)
```

다음 명령을 실행하여 종속성을 설치합니다.

```
ldd --version
sudo apt update && apt install libc6
sudo apt install glibc-source
```

### Bottlerocket
<a name="_bottlerocket"></a>

Bottlerocket 관리자 컨테이너를 활성화한 경우 SSH로 해당 컨테이너에 액세스하여 승격된 권한으로 고급 디버깅 및 문제 해결을 수행할 수 있습니다. 다음 섹션에는 Bottlerocket 호스트의 컨텍스트에서 실행해야 하는 명령이 포함되어 있습니다. 관리자 컨테이너에 있으면 `sheltie`를 실행하여 Bottlerocket 호스트에 전체 루트 쉘을 가져올 수 있습니다.

```
sheltie
```

각 명령에 `sudo chroot /.bottlerocket/rootfs`로 접두사를 지정하여 관리자 컨테이너 쉘에서 다음 섹션의 명령을 실행할 수도 있습니다.

```
sudo chroot /.bottlerocket/rootfs <command>
```

 **로그 수집에 logdog 사용** 

Bottlerocket은 문제 해결을 위해 로그 및 시스템 정보를 효율적으로 수집하는 `logdog` 유틸리티를 제공합니다.

```
logdog
```

`logdog` 유틸리티는 Bottlerocket 호스트의 다양한 위치에서 로그를 수집하여 tarball로 결합합니다. 기본적으로 tarball은 `/var/log/support/bottlerocket-logs.tar.gz`에서 생성되며 `/.bottlerocket/support/bottlerocket-logs.tar.gz`의 호스트 컨테이너에서 액세스할 수 있습니다.

 **journalctl을 사용하여 시스템 로그에 액세스** 

다음 명령을 사용하여 `kubelet`, `containerd` 등과 같은 다양한 시스템 서비스의 상태를 확인하고 해당 로그를 볼 수 있습니다. `-f` 플래그는 로그를 실시간으로 따릅니다.

`kubelet` 서비스 상태를 확인하고 `kubelet` 로그를 검색하기 위해 다음을 실행할 수 있습니다.

```
systemctl status kubelet
journalctl -u kubelet -f
```

오케스트레이션된 `containerd` 인스턴스에 대한 `containerd` 서비스 상태를 확인하고 로그를 검색하기 위해 다음을 실행할 수 있습니다.

```
systemctl status containerd
journalctl -u containerd -f
```

호스트 `containerd` 인스턴스에 대한 `host-containerd` 서비스 상태를 확인하고 로그를 검색하기 위해 다음을 실행할 수 있습니다.

```
systemctl status host-containerd
journalctl -u host-containerd -f
```

부트스트랩 컨테이너 및 호스트 컨테이너에 대한 로그를 검색하기 위해 다음을 실행할 수 있습니다.

```
journalctl _COMM=host-ctr -f
```