노드 부트스트랩
< 이전: 에어갭 환경 구성 | 목차 | 다음: GPU 서버 통합 >
지원 버전: EKS 1.31+, nodeadm 0.1+ 마지막 업데이트: 2026년 2월 23일
이 문서에서는 nodeadm CLI를 사용하여 온프레미스 노드를 EKS 클러스터에 부트스트랩하는 방법을 다룹니다.
부트스트랩 워크플로우 개요
다음 단계는 IAM 자격 증명 설정부터 완전히 준비된 하이브리드 노드까지의 전체 노드 부트스트랩 프로세스를 설명합니다.
부트스트랩 단계
IAM 자격 증명 준비 — SSM Hybrid Activation 생성 또는 IAM Roles Anywhere 구성
nodeadm 다운로드 — 아키텍처에 맞는 CLI 도구 다운로드
의존성 설치 —
nodeadm install로 containerd, kubelet, kubectl, 자격 증명 프로바이더 설치NodeConfig YAML 작성 — 클러스터 세부 정보, 자격 증명, kubelet, containerd 구성
CA 인증서 설치 — 프라이빗 레지스트리 CA 인증서를 시스템 신뢰 저장소에 추가 (필요 시)
nodeadm init실행 — 노드 초기화 및 EKS 클러스터에 등록CNI 설치 — Helm을 통해 Cilium 배포하여 파드 네트워킹 구성
등록 확인 —
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 바이너리와 런타임 의존성이 설치됩니다.
설치 파일 경로
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 install과 nodeadm 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/activationId는 nodeadm init 시 SSM 에이전트를 AWS에 등록할 때 한 번만 사용됩니다. 등록 이후에는 SSM 에이전트가 자체적으로 자격 증명을 갱신하므로, 일반적인 재부팅에서는 activation code가 다시 필요하지 않습니다.
단, nodeadm uninstall을 실행하면 SSM 아티팩트가 삭제되어 재등록이 필요합니다. 이때 기존 activation의 registration-limit에 도달하지 않았다면 같은 코드를 재사용할 수 있습니다.
Q: nodeadm init이 노드를 클러스터에 조인시키는 건가요?
네. nodeadm init은 다음 단계를 순서대로 수행합니다:
kubelet 설정 파일 생성 (
/etc/kubernetes/)SSM 또는 IAM Roles Anywhere 자격 증명 등록
kubelet systemd 서비스 시작
kubelet이 EKS API 서버에 노드를 등록 (조인)
즉, nodeadm init이 실질적인 클러스터 조인 명령입니다.
Q: SSM activation 등록은 install에서 되나요, init에서 되나요?
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 서비스 자체가 처리합니다:
nodeadm init은 kubelet을 systemd 서비스로 설치합니다재부팅 시 kubelet이 자동 시작되어 API 서버에 재등록됩니다
부트스트랩 서비스는 마커 파일이 존재하므로 건너뛰어집니다 (이것이 정상 동작)
참고:
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 설정 불변:
clusterPoolIPv4PodCIDRList와clusterPoolIPv4MaskSize는 초기 배포 후 변경할 수 없습니다. 충분한 파드 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"
sudo로 nodeadm 실행
종속성 연결 불가
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 uninstall 후 nodeadm install 후 nodeadm 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 서버 통합 >
마지막 업데이트