요구를 받으면 먼저 어느 쪽인지 정한다. 두 해석의 결론이 완전히 다르다.
| 해석 | 가능한가 | 방법 |
|---|---|---|
| 인터넷에 나가지 않는다. AWS 에는 종속돼도 된다 | 가능하다 | Private EKS — IGW·NAT 없는 VPC + VPC 엔드포인트 |
| AWS 를 포함해 외부 어디에도 닿지 않는다 | EKS 로는 불가능하다 | 자체 구축 Kubernetes(kubeadm · RKE2 · k3s) |
EKS 는 관리형 서비스다. 컨트롤 플레인이 AWS 계정 안에서 AWS 가 운영하는 자원이므로, AWS API 에 전혀 닿지 않는 진짜 에어갭에서는 성립하지 않는다. 실무에서 말하는 폐쇄망은 대개 첫 번째 뜻이고, 이 경우 EKS 를 쓸 수 있다.
두 번째 뜻이라면 EKS 를 포기하고 직접 구축한다. 그때 필요한 것은 오프라인 레지스트리(Harbor · Nexus), 이미지·차트·CRD 사전 반입, 인증서와 etcd 직접 관리다.
인터넷 경로가 없으므로 노드가 필요로 하는 AWS 서비스마다 VPC 엔드포인트를 만들어 준다. 여기서 하나라도 빠지면 노드가 클러스터에 붙지 못하고 NodeCreationFailure 로 끝난다.
| 종류 | 서비스 |
|---|---|
| 인터페이스 | eks, ec2, ec2messages, ecr.api, ecr.dkr, sts, logs, ssm, ssmmessages, kms, elasticloadbalancing, autoscaling |
| 게이트웨이 | s3 — ECR 이미지 레이어가 S3 에 있으므로 필수다 |
VPC 의 enableDnsSupport 와 enableDnsHostnames 가 모두 켜져 있어야 인터페이스 엔드포인트의 프라이빗 DNS 가 동작한다. 엔드포인트 보안 그룹은 VPC 대역에서 443/tcp 를 받아야 한다.
클러스터 엔드포인트는 privateAccess=true, publicAccess=false 로 만든다. 그러면 kubectl 은 VPC 안에서만 닿으므로, 점프 VM 을 VPC 안에 두거나 VPN · Direct Connect · EC2 Instance Connect Endpoint 로 들어온다.
CloudFormation 이나 Terraform 으로 클러스터를 만들기 전에 역할 두 개가 있어야 한다. 조직에 따라 IAM 생성 권한이 없는 경우가 많으므로, 인프라 담당자에게 명세를 주고 ARN 을 받는 형태가 된다.
| 항목 | 값 |
|---|---|
| 신뢰 주체 | eks.amazonaws.com |
| 정책 | AmazonEKSClusterPolicy |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "eks.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
}
| 항목 | 값 |
|---|---|
| 신뢰 주체 | ec2.amazonaws.com |
| 정책 | AmazonEKSWorkerNodePolicy, AmazonEC2ContainerRegistryReadOnly, AmazonEKS_CNI_Policy |
| 선택 | AmazonSSMManagedInstanceCore — SSM 으로 노드에 붙을 때 |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "ec2.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
}
받은 ARN 은 다음 형태이며, 만든 쪽에서 조회할 수 있다.
aws iam get-role --role-name EKSClusterRole --query 'Role.Arn' --output text
aws iam list-roles --query "Roles[?contains(RoleName,'EKS')].[RoleName,Arn]" --output table
AmazonEKS_CNI_Policy 는 노드 역할에 붙이는 대신 IRSA 로 aws-node 서비스 계정에 주는 구성이 권장된다. 노드 역할에 붙이면 그 노드의 모든 파드가 ENI 조작 권한을 물려받기 때문이다. 다만 초기 구축 단계에서는 노드 역할에 붙여 두고 나중에 옮기는 편이 실패 지점을 줄인다.
폐쇄망 구성은 엔드포인트 요금이 계속 붙으므로 테스트가 끝나면 확실히 지운다. 순서를 지키지 않으면 VPC 삭제가 막힌다.
helm ls -A 로 확인해 helm uninstall, LoadBalancer 타입 서비스와 PVC 를 삭제한다. 이것을 건너뛰면 AWS 가 만든 ELB 와 EBS 볼륨이 남아 VPC 삭제를 막는다.aws eks list-nodegroups --cluster-name private-eks
aws eks delete-nodegroup --cluster-name private-eks --nodegroup-name ng-1
aws eks delete-cluster 는 컨트롤 플레인만 지우며 노드 그룹은 함께 지우지 않는다.aws eks delete-cluster --name private-eks
aws cloudformation delete-stack --stack-name private-eks-stack
aws cloudformation describe-stacks --stack-name private-eks-stack
eksctl delete cluster 는 클러스터와 노드 그룹을 함께 지우지만 IAM 역할과 보안 그룹이 남을 수 있다.
| 자원 | 처리 |
|---|---|
| ENI | 클러스터 삭제 후에도 남는다. aws ec2 delete-network-interface 로 수동 삭제 |
| VPC 엔드포인트 | 이를 쓰는 자원이 남아 있으면 삭제되지 않는다 |
| EBS 볼륨 | PVC 를 지우지 않았으면 Retain 정책에 걸려 남는다 |
| 보안 그룹 | 다른 SG 가 참조하고 있으면 삭제되지 않는다 |
삭제가 멈추면 CloudFormation 이벤트에서 어떤 자원이 걸려 있는지 확인하고, 그 자원을 먼저 수동으로 정리한 뒤 스택 삭제를 다시 시도한다.