노드 부트스트랩

< 이전: 에어갭 환경 구성 | 목차 | 다음: GPU 서버 통합 >

지원 버전: EKS 1.31+, nodeadm 0.1+ 마지막 업데이트: 2026년 2월 23일

이 문서에서는 nodeadm CLI를 사용하여 온프레미스 노드를 EKS 클러스터에 부트스트랩하는 방법을 다룹니다.

부트스트랩 워크플로우 개요

다음 단계는 IAM 자격 증명 설정부터 완전히 준비된 하이브리드 노드까지의 전체 노드 부트스트랩 프로세스를 설명합니다.

부트스트랩 단계

  1. IAM 자격 증명 준비 — SSM Hybrid Activation 생성 또는 IAM Roles Anywhere 구성

  2. nodeadm 다운로드 — 아키텍처에 맞는 CLI 도구 다운로드

  3. 의존성 설치nodeadm install로 containerd, kubelet, kubectl, 자격 증명 프로바이더 설치

  4. NodeConfig YAML 작성 — 클러스터 세부 정보, 자격 증명, kubelet, containerd 구성

  5. CA 인증서 설치 — 프라이빗 레지스트리 CA 인증서를 시스템 신뢰 저장소에 추가 (필요 시)

  6. nodeadm init 실행 — 노드 초기화 및 EKS 클러스터에 등록

  7. CNI 설치 — Helm을 통해 Cilium 배포하여 파드 네트워킹 구성

  8. 등록 확인kubectl get nodes에서 노드가 Ready 상태인지 확인

nodeadm CLI 설치

nodeadm은 EKS Hybrid Nodes를 초기화하고 관리하는 CLI 도구입니다.

의존성 설치

nodeadm install 명령으로 containerd, kubelet, kubectl, 자격 증명 프로바이더(SSM Agent 또는 IAM Roles Anywhere)를 설치합니다.

참고: nodeadm install은 반드시 root 권한으로 실행해야 합니다. 이 단계에서 필요한 모든 Kubernetes 바이너리와 런타임 의존성이 설치됩니다.

설치 파일 경로

구성 요소
Ubuntu/AL2023 경로
RHEL 경로

kubelet

/usr/bin/kubelet

/usr/bin/kubelet

kubectl

/usr/bin/kubectl

/usr/bin/kubectl

SSM Agent

/snap/amazon-ssm-agent (Ubuntu) / systemd (AL2023)

/usr/bin/amazon-ssm-agent

containerd

/usr/bin/containerd

/usr/bin/containerd

nodeadm

/usr/local/bin/nodeadm

/usr/local/bin/nodeadm

NodeConfig YAML 작성

SSM Hybrid Activation 생성

IAM Roles Anywhere 설정 (대안)

SSM 대신 IAM Roles Anywhere를 사용하는 경우, Trust Anchor, Profile, 인증서를 구성합니다:

IAM Roles Anywhere용 NodeConfig YAML:

참고: IAM Roles Anywhere 프로필에서 반드시 "Accept custom role session name" (acceptRoleSessionName: true)을 활성화해야 합니다. 또한 IAM 역할의 MaxSessionDuration이 프로필의 durationSeconds보다 커야 합니다.

CA 인증서 시스템 설치 (프라이빗 레지스트리 사용 시)

프라이빗 컨테이너 레지스트리를 사용하는 경우, CA 인증서를 시스템 신뢰 저장소에 추가합니다.

참고: ECR VPC 엔드포인트를 통해 이미지를 가져오는 경우, CA 인증서 설치는 필요하지 않습니다. ECR은 AWS 공인 인증서를 사용합니다.

노드 초기화

구성 검증

노드 초기화 전에 구성 파일을 검증하는 것을 권장합니다:

초기화 실행

노드 등록 확인


systemd를 통한 자동 부트스트랩

대규모 배포 환경에서는 노드가 부팅될 때 자동으로 nodeadm installnodeadm init이 실행되도록 systemd 서비스를 구성할 수 있습니다. 마커 파일을 사용하여 최초 부팅에서만 install이 실행되고, 이후 부팅에서는 건너뜁니다.

사전 준비

자동 부트스트랩을 사용하려면 다음 파일이 노드에 미리 배치되어 있어야 합니다:

  • /etc/eks/nodeconfig.yaml — NodeConfig 설정 파일

  • /etc/eks/bootstrap.env — 부트스트랩 환경 변수

  • /usr/local/bin/nodeadm — nodeadm 바이너리

참고: 이 파일들은 VM 이미지 빌드(Packer 등), cloud-init, 또는 구성 관리 도구(Ansible 등)를 통해 사전 배치할 수 있습니다.

환경 설정 파일

부트스트랩 스크립트

systemd 서비스 유닛

ConditionPathExists: ! 접두사는 해당 파일이 없을 때만 서비스가 실행됨을 의미합니다. init이 완료되면 마커 파일이 생성되어 이후 부팅에서는 서비스가 자동으로 건너뛰어집니다.

서비스 활성화

동작 확인

재설치가 필요한 경우

노드를 초기화부터 다시 시작하려면 마커 파일을 삭제한 후 재부팅합니다:

자주 묻는 질문

Q: systemd 유닛 파일의 각 설정은 무엇을 의미하나요?

설정
의미

Type=oneshot

부팅 시 한 번 실행되고 종료되는 서비스

After=network-online.target

네트워크가 완전히 준비된 후 실행

ConditionPathExists=!/var/lib/eks/.nodeadm-initialized

! 접두사 — 마커 파일이 없을 때만 실행

RemainAfterExit=true

프로세스 종료 후에도 서비스가 active 상태로 유지 (상태 확인 가능)

WantedBy=multi-user.target

일반 부팅 시 자동 실행

Q: SSM activation code를 노드를 껐다 킬 때마다 다시 받아야 하나요?

아닙니다. SSM Hybrid Activation의 activationCode/activationIdnodeadm init 시 SSM 에이전트를 AWS에 등록할 때 한 번만 사용됩니다. 등록 이후에는 SSM 에이전트가 자체적으로 자격 증명을 갱신하므로, 일반적인 재부팅에서는 activation code가 다시 필요하지 않습니다.

단, nodeadm uninstall을 실행하면 SSM 아티팩트가 삭제되어 재등록이 필요합니다. 이때 기존 activation의 registration-limit에 도달하지 않았다면 같은 코드를 재사용할 수 있습니다.

Q: nodeadm init이 노드를 클러스터에 조인시키는 건가요?

네. nodeadm init은 다음 단계를 순서대로 수행합니다:

  1. kubelet 설정 파일 생성 (/etc/kubernetes/)

  2. SSM 또는 IAM Roles Anywhere 자격 증명 등록

  3. kubelet systemd 서비스 시작

  4. kubelet이 EKS API 서버에 노드를 등록 (조인)

즉, nodeadm init이 실질적인 클러스터 조인 명령입니다.

Q: SSM activation 등록은 install에서 되나요, init에서 되나요?

단계
SSM 관련 동작

nodeadm install --credential-provider ssm

SSM Agent 바이너리 설치만 수행

nodeadm init

nodeconfig.yaml의 activationCode/activationId로 SSM Agent를 AWS에 등록

SSM activation(등록)은 init 단계에서 수행됩니다.

Q: SSM activation을 유지하면서 노드만 클러스터에서 제거/재등록하려면?

kubectl delete node <NODE_NAME>을 실행해도 SSM 등록은 영향받지 않습니다 (SSM은 OS 레벨, 노드 등록은 Kubernetes 레벨). kubelet이 실행 중이면 자동으로 재등록됩니다:

Q: drain → delete → shutdown 후 재부팅하면 systemd로 자동 재등록되나요?

재등록은 되지만, systemd 부트스트랩 서비스가 아닌 kubelet 서비스 자체가 처리합니다:

  1. nodeadm init은 kubelet을 systemd 서비스로 설치합니다

  2. 재부팅 시 kubelet이 자동 시작되어 API 서버에 재등록됩니다

  3. 부트스트랩 서비스는 마커 파일이 존재하므로 건너뛰어집니다 (이것이 정상 동작)

참고: nodeadm uninstall을 실행한 경우에만 마커 파일을 삭제하고 부트스트랩 서비스를 통해 재설치해야 합니다.


Cilium CNI 설치

Cilium은 EKS Hybrid Nodes를 위한 AWS 지원 CNI입니다. 하이브리드 노드는 CNI가 설치될 때까지 Not Ready 상태로 표시됩니다. Amazon VPC CNI는 하이브리드 노드와 호환되지 않습니다.

지원 버전: Cilium v1.17.9 및 v1.18.3 (Amazon EKS 검증 버전) Helm 저장소: oci://public.ecr.aws/eks/cilium/cilium

Cilium 사전 요구 사항:

  • 커널 요구 사항: Cilium v1.18.x는 Linux 커널 5.10 이상 필요. Ubuntu 20.04 (커널 5.4), RHEL 8 (커널 4.18)은 기본 커널이 미달하므로 지원되지 않습니다

  • 하이브리드 노드 전용: Cilium은 하이브리드 노드에서만 지원됩니다. AWS Cloud 노드에서는 VPC CNI를 사용하세요

  • IPAM 설정 불변: clusterPoolIPv4PodCIDRListclusterPoolIPv4MaskSize초기 배포 후 변경할 수 없습니다. 충분한 파드 CIDR 범위를 미리 계획하세요

Cilium Values YAML 생성

Cilium 설치

설치 확인

Cilium 업그레이드

Cilium을 새 버전으로 업그레이드하는 절차입니다:

Cilium 삭제

Cilium을 완전히 제거하는 절차입니다:

Calico 지원 중단 안내

참고: Calico는 EKS Hybrid Nodes에서 더 이상 공식 지원되지 않으며, eks-hybrid-examples 리포지토리로 이전되었습니다. 신규 배포에서는 Cilium을 사용하는 것을 권장합니다. 기존 Calico 배포는 계속 작동하지만 AWS의 공식 지원이 제한됩니다.


Bottlerocket 설정

Bottlerocket은 VMware vSphere 환경에서만 지원되며 (v1.37.0+), x86_64 아키텍처만 지원됩니다. Bottlerocket은 nodeadm을 사용하지 않으며, TOML 기반 설정과 사용자 데이터를 통해 부트스트랩됩니다.

SSM Hybrid Activation 설정 (settings.toml)

IAM Roles Anywhere 설정 (settings.toml)

govc를 사용한 VMware 배포

참고: USER_DATA는 settings.toml 내용을 gzip 압축 후 base64 인코딩한 값입니다.


웹훅 및 애드온 구성

웹훅 기반 애드온

웹훅을 사용하는 애드온(AWS Load Balancer Controller, CloudWatch Observability Agent, ADOT, cert-manager)은 컨트롤 플레인에서 파드 IP로의 네트워크 연결이 필요합니다.

  • 라우팅 가능 파드 네트워크: 하이브리드 노드에서 웹훅 실행 가능 (BGP 또는 정적 라우트 구성 필요)

  • 라우팅 불가능 파드 네트워크: 웹훅 기반 애드온은 클라우드 노드에서만 실행 필요

클라우드 노드에서만 실행하려면 다음 nodeAffinity를 설정하세요:

CoreDNS 혼합 모드

하이브리드 노드와 클라우드 노드가 모두 있는 클러스터에서는 양쪽에 최소 1개의 CoreDNS 레플리카를 배포하세요. Kubernetes 1.31+에서는 Service Traffic Distribution을 활용하여 DNS 쿼리를 로컬 영역에서 처리할 수 있습니다.

EKS Pod Identity Agent

Pod Identity를 사용하려면 NodeConfig에 enableCredentialsFile: true를 추가하고, 애드온 설치 시 하이브리드 DaemonSet을 활성화합니다:


노드 업그레이드

하이브리드 노드는 업스트림 Kubernetes와 동일한 버전 스큐 정책을 따릅니다 — 컨트롤 플레인보다 새로운 버전일 수 없으며 최대 3개의 마이너 버전까지 이전 버전일 수 있습니다.

컷오버 마이그레이션 (권장)

여유 용량이 있는 경우, 대상 버전으로 새 노드를 생성하고 워크로드를 점진적으로 마이그레이션합니다:

인플레이스 업그레이드

여유 용량이 없는 경우, 노드를 인플레이스로 업그레이드합니다 (다운타임 발생):


트러블슈팅

nodeadm debug

nodeadm debug 명령은 네트워크 액세스, 자격 증명 및 클러스터 연결을 검증합니다:

검증 항목:

  • AWS API에 대한 네트워크 액세스

  • Hybrid Nodes IAM 역할에 대한 AWS 자격 증명 검색

  • EKS Kubernetes API 엔드포인트에 대한 네트워크 액세스

  • EKS 클러스터와의 노드 인증

일반적인 문제와 해결 방법

설치 문제

문제
증상
해결 방법

root로 실행해야 함

"msg":"Command failed","error":"must run as root"

sudonodeadm 실행

종속성 연결 불가

max retries achieved for http request

종속성 저장소에 대한 네트워크 액세스 확인

패키지 관리자 실패

failed to run update using package manager

먼저 apt update 또는 dnf update 실행

타임아웃

context deadline exceeded

--timeout 20m0s 플래그 사용

연결 문제

문제
증상
해결 방법

노드 IP가 CIDR에 없음

node IP is not in any of the remote network CIDR blocks

RemoteNodeNetworks에 노드 IP 범위가 포함되어 있는지 확인

API 서버 접근 불가

Unable to connect to the server / dial tcp: i/o timeout

VPN/DX 터널 확인, 방화벽 포트 443, TGW/VGW로의 VPC 라우트 확인

인증 실패

Failed to ensure lease exists: Unauthorized

IAM 역할, HYBRID_LINUX 타입의 EKS 액세스 항목 확인

Node가 NotReady 상태 유지

노드 등록되었으나 NotReady 상태

CNI(Cilium) 설치, VXLAN 포트 8472 확인

DNS 해석 실패

EKS API 엔드포인트에 대해 no such host

Route 53 Resolver Inbound Endpoint 구성, 온프레미스 DNS 업데이트

이미지 Pull 실패

시스템 파드에서 ErrImagePull

ECR VPC 엔드포인트, containerd 레지스트리 설정, CA 인증서 확인

인증서 오류

x509: certificate signed by unknown authority

시스템 신뢰 저장소에 CA 인증서 설치, update-ca-certificates 실행

하이브리드 프로필 존재

hybrid profile already exists

nodeadm uninstallnodeadm installnodeadm init 실행

SSM 자격 증명 문제

문제
증상
해결 방법

유효하지 않은 활성화

InvalidActivation

nodeConfig.yaml에서 region, activationCode, activationId 확인

만료된 활성화

ActivationExpired

새 SSM 하이브리드 활성화 생성, nodeConfig.yaml 업데이트

만료된 토큰

ExpiredTokenException

SSM 에이전트 재시작: systemctl restart amazon-ssm-agent

IAM Roles Anywhere 문제

문제
증상
해결 방법

인증서를 찾을 수 없음

open /etc/iam/pki/server.pem: no such file or directory

/etc/iam/pki/ 디렉토리 생성, 인증서 및 키 복사

권한 없음

not authorized to perform: sts:AssumeRole

신뢰 정책, Trust Anchor ARN, IAM RA 프로필 확인

진단 명령어

노드 리셋

부트스트랩이 실패하여 처음부터 다시 시작해야 하는 경우:

nodeadm uninstall이 삭제하는 경로:

  • /etc/kubernetes - Kubernetes 구성 파일

  • /etc/eks - EKS 관련 구성

  • SSM/IAM Roles Anywhere 아티팩트

v1.0.9+ 변경 사항:

  • /var/lib/kubelet은 기본적으로 보존됨 (데이터 보호 개선)

  • --force 옵션 사용 시 보존되는 아티팩트를 포함한 모든 항목 삭제


< 이전: 에어갭 환경 구성 | 목차 | 다음: GPU 서버 통합 >

마지막 업데이트