AWS Outposts에서 Amazon Linux 노드 생성하기

AWS Outposts에서 Amazon Linux 노드 생성하기

중요: Outposts의 Amazon EKS 로컬 클러스터는 다음 Amazon EKS 최적화 Amazon Linux 2023 AMI에서 생성된 노드만 지원합니다.

  • 표준 Amazon Linux 2023(amazon-linux-2023/x86_64/standard)
  • Accelerated Nvidia Amazon Linux 2023(amazon-linux-2023/x86_64/nvidia)
  • Accelerated Neuron Amazon Linux 2023(amazon-linux-2023/x86_64/neuron)
  • Bottlerocket(EC2 인스턴스 스토어 지원 Outposts만 해당)

AWS는 2025년 11월 26일부터 EKS AL2 최적화 및 AL2 가속 AMI 지원을 종료했습니다. 지원 종료(EOS) 날짜(2025년 11월 26일) 이후에도 EKS AL2 AMI를 계속 사용할 수 있지만, EKS는 이 날짜 이후 AL2 AMI에 새 Kubernetes 버전이나 업데이트(마이너 릴리스, 패치, 버그 수정 포함)를 더 이상 출시하지 않습니다. AL2 폐기에 대한 자세한 내용은 이 문서를 참고하세요.

출처: 문서

본문

이 주제에서는 Amazon EKS 클러스터에 등록되는 Outpost에서 Amazon Linux 노드의 Auto Scaling 그룹을 실행하는 방법을 설명합니다. 클러스터는 AWS Cloud 또는 Outpost에 있을 수 있어요.

사전 조건

  • 기존 Outpost. 자세한 내용은 AWS Outposts란 무엇인가요?를 참고하세요.
  • 기존 Amazon EKS 클러스터. AWS Cloud에 클러스터를 배포하려면 Amazon EKS 클러스터 생성을 참고하세요. Outpost에 클러스터를 배포하려면 고가용성을 위해 AWS Outposts 로컬 Amazon EKS 클러스터 생성을 참고하세요.
  • AWS Cloud의 클러스터에서 노드를 만들고 AWS Outposts, AWS Wavelength 또는 AWS Local Zones가 활성화된 AWS 리전에 서브넷이 있다고 가정해 보세요. 그런 경우 클러스터를 생성할 때 해당 서브넷을 전달하지 않았어야 합니다. Outpost의 클러스터에서 노드를 만들려면 클러스터를 생성할 때 Outpost 서브넷을 전달했어야 해요.
  • (AWS Cloud의 클러스터에 권장) 필요한 IAM 정책이 연결된 자체 IAM 역할로 구성된 Kubernetes용 Amazon VPC CNI 플러그인 애드온. 자세한 내용은 Amazon VPC CNI 플러그인을 IRSA를 사용하도록 구성을 참고하세요. 로컬 클러스터는 서비스 계정용 IAM 역할을 지원하지 않습니다.

eksctl 또는 AWS Management Console(AWS CloudFormation 템플릿 사용)로 자체 관리형 Amazon Linux 노드 그룹을 생성할 수 있어요. Terraform도 사용할 수 있습니다.

이 페이지에 설명된 다음 도구로 로컬 클러스터의 자체 관리형 노드 그룹을 생성할 수 있어요.

  • eksctl
  • AWS Management Console

중요: 자체 관리형 노드 그룹에는 사용자 계정의 Amazon EC2 인스턴스가 포함됩니다. 사용자 또는 Amazon EKS가 사용자를 대신해 제어 플레인 버전을 업데이트해도 이러한 인스턴스는 자동으로 업그레이드되지 않습니다. 자체 관리형 노드 그룹은 콘솔에서 업데이트가 필요하다는 표시가 없어요. 클러스터의 개요(Overview) 탭에 있는 노드 목록에서 노드를 선택해 노드에 설치된 kubelet 버전을 확인함으로써 업데이트가 필요한 노드를 확인할 수 있습니다. 노드를 수동으로 업데이트해야 해요. 자세한 내용은 클러스터의 자체 관리형 노드 업데이트를 참고하세요.

자체 관리형 노드의 kubelet이 사용하는 인증서는 1년 만료로 발급됩니다. 기본적으로 인증서 회전은 활성화되어 있지 않습니다(참조: https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration). 즉 자체 관리형 노드가 1년 이상 실행되면 더 이상 Kubernetes API에 인증할 수 없게 됩니다.

모범 사례로 최신 Amazon EKS 최적화 AMI의 CVE와 보안 패치를 받으려면 자체 관리형 노드 그룹을 정기적으로 업데이트하는 것이 좋습니다. 자체 관리형 노드 그룹에서 사용하는 AMI를 업데이트하면 노드가 다시 생성되며 만료된 kubelet 인증서로 인한 문제가 발생하지 않도록 보장됩니다.

또는 자체 관리형 노드 그룹을 생성할 때 클라이언트 인증서 회전을 활성화해(참조: https://kubernetes.io/docs/tasks/tls/certificate-rotation/) 현재 인증서가 만료에 가까워지면 kubelet 인증서가 갱신되도록 할 수 있어요.

eksctl로 자체 관리형 Linux 노드 실행

  1. 디바이스 또는 AWS CloudShell에 eksctl 명령줄 도구 버전 0.215.0 이상을 설치합니다. eksctl을 설치하거나 업데이트하려면 eksctl 설명서의 설치를 참고하세요.
  2. 클러스터가 AWS Cloud에 있고 AmazonEKS_CNI_Policy 관리형 IAM 정책이 Amazon EKS 노드 IAM 역할에 연결되어 있다면, 이를 Kubernetes aws-node 서비스 계정과 연결하는 IAM 역할에 할당하는 것이 좋습니다. 자세한 내용은 Amazon VPC CNI 플러그인을 IRSA를 사용하도록 구성을 참고하세요. 클러스터가 Outpost에 있다면 이 정책을 노드 역할에 연결해야 합니다.
  3. 다음 명령은 기존 클러스터에 노드 그룹을 생성합니다. 클러스터는 eksctl로 생성되었어야 해요. al-nodes를 노드 그룹 이름으로 바꿉니다. 노드 그룹 이름은 63자보다 길 수 없습니다. 문자 또는 숫자로 시작해야 하며 나머지 문자에는 하이픈과 밑줄을 포함할 수 있습니다. my-cluster를 클러스터 이름으로 바꿉니다. 이름에는 영숫자 문자(대소문자 구분)와 하이픈만 포함할 수 있어요. 영숫자 문자로 시작해야 하며 100자보다 길 수 없습니다. 이름은 클러스터를 생성하는 AWS 리전과 AWS 계정 내에서 고유해야 해요. 클러스터가 Outpost에 있다면 id를 Outpost 서브넷의 ID로 바꿉니다. 클러스터가 AWS Cloud에 있다면 id를 클러스터를 생성할 때 지정하지 않은 서브넷의 ID로 바꿉니다. 나머지 예시 값을 자신의 값으로 바꿉니다. 노드는 기본적으로 제어 플레인과 동일한 Kubernetes 버전으로 생성됩니다.
  4. instance-type을 Outpost에서 사용할 수 있는 인스턴스 유형으로 바꿉니다.
  5. my-key를 Amazon EC2 키 페어 또는 공개 키의 이름으로 바꿉니다. 이 키는 노드가 실행된 후 SSH로 노드에 연결하는 데 사용돼요. Amazon EC2 키 페어가 없으면 AWS Management Console에서 만들 수 있습니다. 자세한 내용은 Amazon EC2 사용 설명서의 Amazon EC2 키 페어를 참고하세요.
  6. 다음 명령으로 노드 그룹을 생성합니다.
eksctl create nodegroup --cluster my-cluster --name al-nodes --node-type instance-type \
    --nodes 3 --nodes-min 1 --nodes-max 4 --managed=false \
    --node-volume-type gp2 --subnet-ids subnet-id \
    --node-ami-family AmazonLinux2023

클러스터가 AWS Cloud에 배포된 경우:

  • 배포하는 노드 그룹은 인스턴스의 CIDR 블록과 다른 CIDR 블록에서 Pod에 IPv4 주소를 할당할 수 있어요. 자세한 내용은 사용자 지정 네트워킹으로 대체 서브넷에 Pod 배포를 참고하세요.
  • 배포하는 노드 그룹에는 아웃바운드 인터넷 액세스가 필요하지 않습니다. 자세한 내용은 인터넷 액세스가 제한된 프라이빗 클러스터 배포를 참고하세요.

사용 가능한 모든 옵션과 기본값의 전체 목록은 eksctl 설명서의 AWS Outposts 지원을 참고하세요.

노드가 클러스터에 참여하지 못하면 Amazon EKS 클러스터 및 노드 문제 해결의 노드가 클러스터에 참여하지 못함과 AWS Outposts 로컬 Amazon EKS 클러스터 문제 해결의 노드를 클러스터에 참여시킬 수 없음을 참고하세요.

출력 예시는 다음과 같습니다. 노드가 생성되는 동안 여러 줄이 출력됩니다. 마지막 출력 줄 중 하나는 다음 예시 줄입니다.

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

(선택 사항) 클러스터와 Linux 노드를 테스트하기 위해 샘플 애플리케이션을 배포합니다.

AWS Management Console로 자체 관리형 Linux 노드 실행

1단계: AWS Management Console로 자체 관리형 Linux 노드 실행

  1. 최신 버전의 AWS CloudFormation 템플릿을 다운로드합니다.
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2025-11-24/amazon-eks-outpost-nodegroup.yaml
  1. AWS CloudFormation 콘솔을 엽니다.
  2. 스택 생성(Create stack)을 선택한 다음 새 리소스 사용(표준)(With new resources (standard))을 선택합니다.
  3. 템플릿 지정(Specify template)에서 템플릿 파일 업로드(Upload a template file)를 선택한 다음 파일 선택(Choose file)을 선택합니다. 이전 단계에서 다운로드한 amazon-eks-outpost-nodegroup.yaml 파일을 선택한 다음 다음(Next)을 선택합니다.
  4. 스택 세부 정보 지정(Specify stack details) 페이지에서 다음 파라미터를 적절히 입력한 다음 다음(Next)을 선택합니다.
    • Stack name: AWS CloudFormation 스택의 스택 이름을 선택합니다. 예를 들어 al-nodes라고 할 수 있어요. 이름에는 영숫자 문자(대소문자 구분)와 하이픈만 포함할 수 있습니다. 영숫자 문자로 시작해야 하며 100자보다 길 수 없어요. 이름은 클러스터를 생성하는 AWS 리전과 AWS 계정 내에서 고유해야 합니다.
    • ApiServerEndpoint: EKS 콘솔 또는 DescribeCluster API에서 확인할 수 있는 Kubernetes API Server 엔드포인트를 입력합니다.
    • ClusterName: 클러스터 이름을 입력합니다. 이 이름이 클러스터 이름과 일치하지 않으면 노드가 클러스터에 참여할 수 없어요.
    • ClusterId: EKS 서비스가 클러스터에 할당한 ID를 입력합니다. DescribeCluster API로 확인할 수 있어요. 이 ID가 클러스터 ID와 일치하지 않으면 노드가 클러스터에 참여할 수 없습니다.
    • CertificateAuthority: Kubernetes Certificate Authority의 base64 인코딩 문자열을 입력합니다. EKS 콘솔 또는 DescribeCluster API에서 확인할 수 있어요.
    • ServiceCidr: Kubernetes Services CIDR을 입력합니다. EKS 콘솔 또는 DescribeCluster API에서 확인할 수 있어요.
    • ClusterControlPlaneSecurityGroup: VPC를 생성할 때 생성한 AWS CloudFormation 출력의 SecurityGroups 값을 선택합니다.

다음 단계는 해당 그룹을 가져오는 한 가지 작업을 보여줍니다.

  1. Amazon EKS 콘솔을 엽니다.
  2. 클러스터의 이름을 선택합니다.
  3. 네트워킹(Networking) 탭을 선택합니다.
  4. ClusterControlPlaneSecurityGroup 드롭다운 목록에서 선택할 때 추가 보안 그룹(Additional security groups) 값을 참조로 사용합니다.
  • NodeGroupName: 노드 그룹의 이름을 입력합니다. 이 이름은 나중에 노드용으로 생성된 Auto Scaling 노드 그룹을 식별하는 데 사용할 수 있어요.
  • NodeAutoScalingGroupMinSize: 노드 Auto Scaling 그룹이 축소될 수 있는 최소 노드 수를 입력합니다.
  • NodeAutoScalingGroupDesiredCapacity: 스택이 생성될 때 확장할 원하는 노드 수를 입력합니다.
  • NodeAutoScalingGroupMaxSize: 노드 Auto Scaling 그룹이 확장될 수 있는 최대 노드 수를 입력합니다.
  • NodeInstanceType: 노드의 인스턴스 유형을 선택합니다. 클러스터가 AWS Cloud에서 실행 중이라면 자세한 내용은 최적의 Amazon EC2 노드 인스턴스 유형 선택을 참고하세요. 클러스터가 Outpost에서 실행 중이라면 Outpost에서 사용할 수 있는 인스턴스 유형만 선택할 수 있어요.
  • NodeImageIdSSMParam: 변수 Kubernetes 버전용 최근 Amazon EKS 최적화 AMI의 Amazon EC2 Systems Manager 파라미터로 미리 채워집니다. Amazon EKS에서 지원하는 다른 Kubernetes 마이너 버전을 사용하려면 1.XX를 다른 지원 버전으로 바꾸세요. 클러스터와 동일한 Kubernetes 버전을 지정하는 것이 좋습니다.

Amazon EKS 최적화 가속 AMI를 사용하려면 NodeImageIdSSMParam 값을 원하는 SSM 파라미터로 업데이트하세요. 여기에서 SSM에서 EKS AMI ID를 검색하는 방법을 참조하세요.

참고: Amazon EKS 노드 AMI는 Amazon Linux를 기반으로 합니다. Amazon Linux 보안 센터에서 원하는 버전의 탭을 선택해 Amazon Linux의 보안 또는 개인 정보 이벤트를 추적할 수 있어요. 해당 RSS 피드를 구독할 수도 있습니다. 보안 및 개인 정보 이벤트에는 문제 개요, 영향을 받는 패키지, 문제를 해결하기 위해 인스턴스를 업데이트하는 방법이 포함됩니다.

  • NodeImageId: (선택 사항) 자체 사용자 지정 AMI(Amazon EKS 최적화 AMI 대신)를 사용한다면 AWS 리전의 노드 AMI ID를 입력합니다. 여기에 값을 지정하면 NodeImageIdSSMParam 필드의 모든 값이 재정의됩니다.
  • NodeVolumeSize: 노드의 루트 볼륨 크기를 GiB 단위로 지정합니다.
  • NodeVolumeType: 노드의 루트 볼륨 유형을 지정합니다.
  • KeyName: 노드가 실행된 후 SSH로 노드에 연결하는 데 사용할 수 있는 Amazon EC2 SSH 키 페어의 이름을 입력합니다. Amazon EC2 키 페어가 없으면 AWS Management Console에서 만들 수 있어요. 자세한 내용은 Amazon EC2 사용 설명서의 Amazon EC2 키 페어를 참고하세요.

참고: 여기에 키 페어를 제공하지 않으면 AWS CloudFormation 스택 생성이 실패합니다.

  • DisableIMDSv1: 기본적으로 각 노드는 Instance Metadata Service 버전 1(IMDSv1)과 IMDSv2를 지원합니다. IMDSv1을 비활성화할 수 있어요. 노드 그룹의 향후 노드와 Pod가 IMDSv1을 사용하지 못하게 하려면 DisableIMDSv1을 true로 설정하세요. IMDS에 대한 자세한 내용은 인스턴스 메타데이터 서비스 구성을 참고하세요. 노드에서 IMDS에 대한 액세스를 제한하는 방법에 대한 자세한 내용은 워커 노드에 할당된 인스턴스 프로필에 대한 액세스 제한을 참고하세요.
  • VpcId: 생성한 VPC의 ID를 입력합니다. VPC를 선택하기 전에 VPC 요구 사항 및 고려 사항을 검토하세요.
  • Subnets: 클러스터가 Outpost에 있다면 VPC에서 프라이빗 서브넷을 하나 이상 선택합니다. 서브넷을 선택하기 전에 서브넷 요구 사항 및 고려 사항을 검토하세요. 클러스터의 네트워킹(Networking) 탭에서 각 서브넷 링크를 열어 어떤 서브넷이 프라이빗인지 확인할 수 있어요.
  1. 스택 옵션 구성(Configure stack options) 페이지에서 원하는 선택을 한 다음 다음(Next)을 선택합니다.
  2. "AWS CloudFormation이 IAM 리소스를 생성할 수 있음을 인정합니다."(I acknowledge that AWS CloudFormation might create IAM resources.) 왼쪽의 확인란을 선택한 다음 스택 생성(Create stack)을 선택합니다.
  3. 스택 생성이 완료되면 콘솔에서 선택하고 출력(Outputs)을 선택합니다.
  4. 생성된 노드 그룹의 NodeInstanceRole을 기록합니다. Amazon EKS 노드를 구성할 때 이 값이 필요해요.

2단계: 노드가 클러스터에 참여할 수 있도록 설정

  1. 이미 aws-auth ConfigMap이 있는지 확인합니다.
kubectl describe configmap -n kube-system aws-auth

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

  1. 편집을 위해 ConfigMap을 엽니다.
kubectl edit -n kube-system configmap/aws-auth

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

[...]
data:
  mapRoles: |
    - rolearn:
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes
[...]
  1. 파일을 저장하고 텍스트 편집기를 종료합니다.
  2. "Error from server (NotFound): configmaps "aws-auth" not found"라는 오류를 받았다면 기본 ConfigMap을 적용합니다.
  3. 구성 맵을 다운로드합니다.
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||my-node-instance-role|' aws-auth-cm.yaml
  1. 구성을 적용합니다. 이 명령은 완료하는 데 몇 분이 걸릴 수 있어요.
kubectl apply -f aws-auth-cm.yaml
  1. 노드의 상태를 확인하고 Ready 상태에 도달할 때까지 기다립니다.
kubectl get nodes --watch
  1. 셸 프롬프트로 돌아가려면 Ctrl+C를 입력합니다.

참고: 권한 없음 또는 리소스 유형 오류가 발생하면 문제 해결 주제의 권한 없음 또는 액세스 거부(kubectl)를 참고하세요.

노드가 클러스터에 참여하지 못하면 Amazon EKS 클러스터 및 노드 문제 해결의 노드가 클러스터에 참여하지 못함과 AWS Outposts 로컬 Amazon EKS 클러스터 문제 해결의 노드를 클러스터에 참여시킬 수 없음을 참고하세요.

  1. Amazon EBS CSI 드라이버를 설치합니다. 자세한 내용은 GitHub의 설치를 참고하세요. 드라이버 권한 설정(Set up driver permission) 섹션에서 IAM 인스턴스 프로필 사용(Using IAM instance profile) 옵션의 지침을 따르세요. gp2 스토리지 클래스를 사용해야 합니다. gp3 스토리지 클래스는 지원되지 않아요.
  2. 클러스터에 gp2 스토리지 클래스를 만들려면 다음 단계를 완료합니다.

다음 명령을 실행해 gp2-storage-class.yaml 파일을 생성합니다.

cat >gp2-storage-class.yaml <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gp2
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  fsType: ext4
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
EOF
kubectl apply -f gp2-storage-class.yaml
  1. 클러스터에서 NVIDIA device plugin을 DaemonSet으로 배포합니다. 다음 명령을 실행하기 전에 vX.X.X를 원하는 NVIDIA/k8s-device-plugin 버전으로 바꾸세요.
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/deployments/static/nvidia-device-plugin.yml

3단계: 추가 작업

(선택 사항) 클러스터와 Linux 노드를 테스트하기 위해 샘플 애플리케이션을 배포합니다.

클러스터가 Outpost에 배포된 경우 이 단계를 건너뛰세요. 클러스터가 AWS Cloud에 배포된 경우 다음 정보는 선택 사항입니다. AmazonEKS_CNI_Policy 관리형 IAM 정책이 Amazon EKS 노드 IAM 역할에 연결되어 있다면 이를 Kubernetes aws-node 서비스 계정과 연결하는 IAM 역할에 할당하는 것이 좋습니다. 자세한 내용은 Amazon VPC CNI 플러그인을 IRSA를 사용하도록 구성을 참고하세요.

더 알아보기 (Learn more)