인터넷 접근이 제한된 프라이빗 클러스터 배포하기
인터넷 접근이 제한된 프라이빗 클러스터 배포하기
AWS Cloud에 배포되지만 아웃바운드 인터넷 접근이 없는 Amazon EKS 클러스터를 배포하는 방법을 알아봐요. AWS Outposts의 로컬 클러스터가 있다면 이 토픽 대신 Create Amazon Linux nodes on AWS Outposts를 참고해 주세요.
출처: 문서
본문
참고: 이 토픽은 데이터 플레인 이그레스(아웃바운드 인터넷 접근이 없는 노드와 워크로드)를 다뤄요. 클러스터 제어 플레인에서 VPC로 나가는 이그레스 트래픽을 제어하려면 Configuring control plane egress routing 참고.
Amazon EKS 네트워킹에 익숙하지 않다면 De-mystifying cluster networking for Amazon EKS worker nodes를 참고해 주세요. 클러스터에 아웃바운드 인터넷 접근이 없다면 다음 요구 사항을 충족해야 해요:
클러스터 아키텍처 요구 사항 (Cluster architecture requirements)
- 클러스터는 VPC 안에 있는 컨테이너 레지스트리에서 이미지를 가져와야 해요. VPC에 Amazon Elastic Container Registry를 만들고 노드가 가져올 컨테이너 이미지를 복사할 수 있어요. 자세한 내용은 Copy a container image from one repository to another repository 참고.
- 클러스터에는 엔드포인트 프라이빗 접근이 활성화되어야 해요. 노드가 클러스터 엔드포인트에 등록하려면 필요해요. 엔드포인트 공용 접근은 선택사항이에요. 자세한 내용은 Cluster API server endpoint 참고.
노드 요구 사항 (Node requirements)
자체 관리 Linux 및 Windows 노드는 시작되기 전에 다음 부트스트랩 인수를 포함해야 해요. 이 인수는 Amazon EKS 인트로스펙션을 우회하며 VPC 내에서 Amazon EKS API에 접근할 필요가 없어요.
다음 명령으로 클러스터 엔드포인트의 값을 확인합니다. my-cluster를 클러스터 이름으로 바꿉니다.
aws eks describe-cluster --name my-cluster --query cluster.endpoint --output text
예시 출력:
https://EXAMPLE108C897D9B2F1B21D5EXAMPLE.sk1.region-code.eks.amazonaws.com
다음 명령으로 클러스터 인증 기관의 값을 확인합니다. my-cluster를 클러스터 이름으로 바꿉니다.
aws eks describe-cluster --name my-cluster --query cluster.certificateAuthority --output text
반환되는 출력은 긴 문자열이에요.
NodeConfig 객체의 apiServerEndpoint와 certificateAuthority 값을 이전 명령 출력에서 반환된 값으로 바꿉니다. 자체 관리 Amazon Linux 2023 노드를 시작할 때 부트스트랩 인수를 지정하는 방법은 Create self-managed Amazon Linux nodes 및 Create self-managed Microsoft Windows nodes 참고.
Linux 노드의 경우:
---
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:
cluster:
name: my-cluster
apiServerEndpoint: https://EXAMPLE108C897D9B2F1B21D5EXAMPLE.sk1.region-code.eks.amazonaws.com
certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
...
추가 인수는 GitHub의 부트스트랩 스크립트를 참고해 주세요.
Windows 노드의 경우:
참고: 사용자 지정 서비스 CIDR을 사용한다면
-ServiceCIDR파라미터로 지정해야 해요. 그렇지 않으면 클러스터의 파드 DNS 해석이 실패해요.
-APIServerEndpoint cluster-endpoint -Base64ClusterCA certificate-authority
추가 인수는 Bootstrap script configuration parameters 참고.
클러스터의 aws-auth ConfigMap은 VPC 내에서 만들어야 해요. aws-auth ConfigMap을 만들고 항목을 추가하는 방법은 터미널에서 eksctl create iamidentitymapping --help를 입력해 주세요. 서버에 ConfigMap이 없으면 ID 매핑을 추가하는 명령을 사용할 때 eksctl이 생성해요.
파드 요구 사항 (Pod requirements)
- Pod Identity — EKS Pod Identity로 구성된 파드는 EKS Auth API에서 자격 증명을 얻어요. 아웃바운드 인터넷 접근이 없으면 EKS Auth API용 VPC 엔드포인트(
com.amazonaws.region-code.eks-auth)를 만들고 사용해야 해요. EKS 및 EKS Auth VPC 엔드포인트에 대한 자세한 내용은 Access Amazon EKS using AWS PrivateLink 참고. - IRSA — IAM roles for service accounts로 구성된 파드는 AWS Security Token Service(AWS STS) API 호출에서 자격 증명을 얻어요. 아웃바운드 인터넷 접근이 없으면 VPC에 AWS STS VPC 엔드포인트를 만들고 사용해야 해요. 대부분의 AWS
v1SDK는 기본적으로 전역 AWS STS 엔드포인트(sts.amazonaws.com)를 사용하며 이는 AWS STS VPC 엔드포인트를 사용하지 않아요. AWS STS VPC 엔드포인트를 사용하려면 SDK를 리전별 AWS STS 엔드포인트(sts.region-code.amazonaws.com)를 사용하도록 구성해야 할 수 있어요. 자세한 내용은 Configure the AWS Security Token Service endpoint for a service account 참고.
IRSA를 설정하려면 VPC 내에서 클러스터의 OIDC discovery/JWKS 엔드포인트에도 도달해야 해요. 예를 들어 클러스터의 IAM OIDC identity provider를 만들거나 자체 토큰 검증기를 실행할 때 도달해요. 아웃바운드 인터넷 접근이 없으면 클러스터 OIDC 엔드포인트용 VPC 엔드포인트(com.amazonaws.region-code.oidc-eks)를 만들고 사용해 주세요. 이는 AWS STS VPC 엔드포인트와 별개예요. STS는 AWS 내에서 클러스터의 JWKS를 가져오므로 OIDC 엔드포인트는 VPC에서 시작된 OIDC 트래픽을 프라이빗화하고, STS 엔드포인트는 AssumeRoleWithWebIdentity 호출을 프라이빗화해요. 자세한 내용은 Access the cluster OIDC endpoint using AWS PrivateLink 참고.
클러스터의 VPC 서브넷에는 파드가 접근해야 하는 모든 AWS 서비스에 대한 VPC 인터페이스 엔드포인트가 있어야 해요. 자세한 내용은 Access an AWS service using an interface VPC endpoint 참고. 일반적으로 사용되는 서비스와 엔드포인트 중 일부는 아래 표에 나열되어 있어요. 전체 엔드포인트 목록은 AWS PrivateLink 가이드의 AWS services that integrate with AWS PrivateLink 참고.
VPC 엔드포인트에 프라이빗 DNS 이름을 활성화할 것을 권장합니다. 그러면 워크로드가 문제 없이 공용 AWS 서비스 엔드포인트를 계속 사용할 수 있어요.
| 서비스 | 엔드포인트 |
|---|---|
| Amazon EC2 | com.amazonaws.region-code.ec2 |
| Amazon Elastic Container Registry (컨테이너 이미지 가져오기용) | com.amazonaws.region-code.ecr.api, com.amazonaws.region-code.ecr.dkr, com.amazonaws.region-code.s3 |
| Amazon Application Load Balancers 및 Network Load Balancers | com.amazonaws.region-code.elasticloadbalancing |
| (선택사항) AWS X-Ray (AWS X-Ray로 보내는 추적에 필요) | com.amazonaws.region-code.xray |
| (선택사항) Amazon SSM (노드 관리 작업용 SSM Agent에 필요. SSH 대안) | com.amazonaws.region-code.ssm |
| Amazon CloudWatch Logs (Amazon CloudWatch Logs로 보내는 노드 및 파드 로그에 필요) | com.amazonaws.region-code.logs |
| AWS Security Token Service (IAM roles for service accounts 사용 시 필요) | com.amazonaws.region-code.sts |
| Amazon EKS 클러스터 OIDC 엔드포인트 (VPC 내에서 IAM roles for service accounts 설정에 필요) | com.amazonaws.region-code.oidc-eks |
| Amazon EKS Auth (Pod Identity 연결 사용 시 필요) | com.amazonaws.region-code.eks-auth |
| Amazon EKS | com.amazonaws.region-code.eks |
| Amazon Route 53 | com.amazonaws.route53 |
- 모든 자체 관리 노드는 필요한 VPC 인터페이스 엔드포인트가 있는 서브넷에 배포해야 해요. 관리형 노드 그룹을 만들면 VPC 인터페이스 엔드포인트 보안 그룹이 서브넷의 CIDR을 허용해야 하거나, 생성된 노드 보안 그룹을 VPC 인터페이스 엔드포인트 보안 그룹에 추가해야 해요.
- EFS 스토리지 — 파드가 Amazon EFS 볼륨을 사용한다면 Store an elastic file system with Amazon EFS를 배포하기 전에 드라이버의 kustomization.yaml 파일을 변경해 컨테이너 이미지가 Amazon EKS 클러스터와 같은 AWS 리전을 사용하도록 설정해야 해요.
- EKS Optimized AMI를 사용한다면 위 표의
ec2엔드포인트를 활성화해야 해요. 또는 노드 DNS 이름을 수동으로 설정할 수 있어요. 최적화 AMI는 EC2 API를 사용해 노드 DNS 이름을 자동으로 설정해요. - AWS Load Balancer Controller를 사용해 프라이빗 클러스터에 AWS Application Load Balancers(ALB)와 Network Load Balancers를 배포할 수 있어요. 배포할 때 명령줄 플래그로
enable-shield,enable-waf,enable-wafv2를 false로 설정해야 해요. Ingress 객체의 호스트명으로 인증서 검색은 지원되지 않아요. 컨트롤러가 VPC 인터페이스 엔드포인트가 없는 AWS Certificate Manager에 도달해야 하기 때문이에요. - 컨트롤러는 Fargate와 함께 사용하는 데 필요한 IP 타깃이 있는 네트워크 로드 밸런서를 지원해요. 자세한 내용은 Route application and HTTP traffic with Application Load Balancers 및 Create a network load balancer 참고.
- Cluster Autoscaler는 지원돼요. Cluster Autoscaler 파드를 배포할 때 명령줄에
--aws-use-static-instance-list=true가 포함되어 있는지 확인해 주세요. 자세한 내용은 GitHub의 Use Static Instance List 참고. 워커 노드 VPC에는 AWS STS VPC 엔드포인트와 autoscaling VPC 엔드포인트도 포함되어야 해요. - 일부 컨테이너 소프트웨어 제품은 사용량을 모니터링하기 위해 AWS Marketplace Metering Service에 접근하는 API 호출을 사용해요. 프라이빗 클러스터는 이러한 호출을 허용하지 않으므로 프라이빗 클러스터에서 이런 컨테이너 유형을 사용할 수 없어요.