Ssoon

[1주차] Amazon EKS 시작하기 - Cluster 생성 본문

AWS EKS Workshop Study

[1주차] Amazon EKS 시작하기 - Cluster 생성

구구달스 2023. 4. 25. 20:10
CloudNet@ 팀의 AWS EKS Workshop Study 1주차 정리입니다.
# Amazon EKS User Guide 참고

AWS CLI 설치

🧿 Windows용 AWS CLI MSI 설치 관리자(64비트)를 다운로드하여 실행합니다.

msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi

🧿 시작 메뉴를 열고, cmd를 검색하여 명령 프롬프트 창에서 version을 확인합니다.

 

 

kubectl 설치

🧿 PowerShell 터미널에서 Amazon S3에서 kubectl 바이너리를 다운로드합니다.

curl.exe -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.24.11/2023-03-17/bin/windows/amd64/kubectl.exe

🧿 PATH를 지정합니다.

🧿 버전을 확인합니다.

 

VPC 생성

🧿 실습을 위해 AWS S3의 Cloudformation으로 퍼블릭 및 프라이빗 서브넷이 있는 기본 설정 VPC를 생성합니다.

aws cloudformation create-stack `
  --region ap-northeast-2 `
  --stack-name my-eks-vpc-stack `
  --template-url https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-vpc-private-subnets.yaml

🧿 cloudformation 스택에서 my-eks-vpc-stack을 선택한 다음 리소스(Resources) 탭을 선택하여 생성된 리소스들을 확인합니다.

 

Amazon EKS 클러스터 IAM 역할 생성

클러스터 IAM 역할을 생성하고 필요한 Amazon EKS IAM 관리형 정책을 연결합니다. Amazon EKS에서 관리하는 Kubernetes 클러스터는 사용자를 대신하여 다른 AWS 서비스를 호출하여 서비스와 함께 사용하는 리소스를 관리합니다.

 

🧿 IAM 신뢰 정책 JSON 파일을 생성합니다.

$here = Get-Location
Set-Content $here\eks-cluster-role-trust-policy.json @"
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "eks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
"@

🧿 AWS CLI 옵션을 구성합니다.

🧿 역할(Role)을 생성합니다.

aws iam create-role `
  --role-name myAmazonEKSClusterRole `
  --assume-role-policy-document file://"eks-cluster-role-trust-policy.json"

🧿 필요한 Amazon EKS 관리형 IAM 정책을 역할에 연결합니다.

aws iam attach-role-policy `
  --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy `
  --role-name myAmazonEKSClusterRole

 

Amazon EKS 클러스터 생성

🧿 클러스터 추가(Add cluster)를 선택하고 생성(Create)을 선택합니다.

🧿 1단계. 클러스터 구성 

이름(Name) - 클러스터의 이름

Kubernetes 버전 - 클러스터에 대해 사용할 Kubernetes 버전

클러스터 서비스 역할 - 생성한 Amazon EKS 클러스터 IAM 역할을 선택

    (Kubernetes 컨트롤 플레인이 사용자를 대신하여 AWS 리소스를 관리합니다.)

🧿 2단계. 클러스터 구성

 VPC - 클러스터를 생성하려면 Amazon EKS VPC 요구 사항을 충족하는 기존 VPC를 선택합니다.클러스터 생성 후에는 사용하려는 VPC를 변경할 수 없습니다. 

 

 서브넷(Subnets)

- 기본적으로 이전 필드에서 지정한 VPC에서 사용 가능한 모든 서브넷이 사전 선택됩니다. 두 개 이상을 선택해야 합니다.

🧿 public 서브넷만 사용

  • 동일한 퍼블릭 서브넷에서 노드와 인그레스 리소스(예: 로드 밸런서)가 모두 생성됩니다.
  • kubernetes.io/role/elb 로 퍼블릭 서브넷에 태그를 지정하여 인터넷에 연결된 로드 밸런서를 구성합니다.
  • 이 구성에서 클러스터 endpoint 은 public, private 또는 둘 다(public and private)로 구성될 수 있습니다.

🧿 private and public 서브넷 사용

  • 노드는 프라이빗 서브넷에서 생성되는 반면 Ingress 리소스는 퍼블릭 서브넷에서 인스턴스화됩니다. 
  • 클러스터 endpoint 에 대한 public, private 또는 둘 다(public and private) 액세스를 활성화할 수 있습니다. 
  • 클러스터 엔드포인트의 구성에 따라 노드 트래픽은 NAT 게이트웨이 또는 ENI를 통해 들어갑니다.

🧿 private 서브넷만 사용

  • 노드와 인그레스 모두 프라이빗 서브넷에 생성됩니다.
  • kubernetes.io/role/internal-elb 서브넷 태그를 사용하여 내부 로드 밸런서를 구성합니다.
  • EC2와 모든 Amazon ECR 및 S3 리포지토리에 대해 AWS PrivateLink를 활성화해야 합니다.
  • 클러스터의 private endpoint 만 활성화해야 합니다. 

 

노드는 (a) EKS public endpoint 또는 (b) EKS가 관리하는 Cross-Account ENI(X-ENI)를 통해 EKS 제어부에 연결됩니다.

교차 계정 ENI(Cross-Account ENI) - 다른 AWS 계정에서 생성된 ENI를 현재 계정에서 사용할 수 있도록 허용하는 것을 말합니다.

 

  • 클러스터를 생성할 때는 두 개 이상의 VPC 서브넷을 지정해야 합니다.
  • EKS는 클러스터 생성 중에 지정된 각 서브넷(클러스터 서브넷이라고도 함)에 X-ENI를 배치합니다.
  • Kubernetes API 서버는 이러한 교차 계정 ENI를 사용하여 customer-managed 클러스터 VPC 서브넷에 배포된 노드와 통신합니다.
  • 이러한 네트워크 인터페이스를 통해 Kubernetes 및 kubectl exec와 같은 kubectl logs 기능을 사용 설정할 수 있습니다

 

 보안 그룹(Security groups) - (선택 사항) 생성하는 네트워크 인터페이스에 Amazon EKS가 연결하려는 보안 그룹을 하나 이상 지정합니다. Cloudfomation으로 VPC 생성시 만들어진 SG를 선택합니다.

 

 클러스터 엔드포인트 액세스(Cluster endpoint access)

새 클러스터를 생성할 때 Amazon EKS에서는 클러스터와 통신하는 데 사용하는 관리형 Kubernetes API 서버에 대한 엔드포인트를 생성합니다(kubectl과 같은 Kubernetes 관리 도구 사용). 

Amazon VPC 콘솔에서 엔드포인트로 표시되지 않습니다.

1️⃣ 퍼블릭

 제어부 => (EKS owned ENI) => 워커노드(kubelet)

 워커노드 => (퍼블릭 도메인) => 제어부

 사용자(kubectl) => (퍼블릭 도메인) => 제어부

  • 인터넷을 통해 Kubernetes API 서버에 액세스할 수 있습니다.
  • 선택적으로 퍼블릭 엔드포인트에 액세스할 수 있는 CIDR 블록을 제한할 수 있습니다.

2️⃣ 퍼블릭 및 프라이빗

 제어부 => (EKS owned ENI) => 워커노드(kubelet)

 워커노드 => (프라이빗 도메인, EKS owned ENI) => 제어부

 사용자(kubectl) => (퍼블릭 도메인) => 제어부

  • 클러스터의 VPC 내 Kubernetes API 요청은 프라이빗 VPC 엔드포인트를 사용합니다.
  • VPC 내에서 Kubernetes API 요청이 VPC 내 X-ENI를 통해 컨트롤 플레인과 통신합니다.
  • 이 경우 X-ENIs는 교차 계정 ENIs(Cross-Account ENIs)를 의미하며, EKS control plane에서 생성됩니다. VPC 내부에서의 Kubernetes API 요청은 VPC 내부의 교차 계정 ENIs를 통해 EKS control plane에 접근하며, 외부에서의 API 요청은 인터넷을 통해 EKS control plane에 접근할 수 있게 됩니다.

🧿 Cluster endpoint access를 private으로 활성화하면 ?

  • Amazon EKS에서는 사용자 대신 Route 53 프라이빗 호스팅 영역을 생성하고 클러스터의 VPC에 연결합니다.
  • 이 프라이빗 호스팅 영역은 Amazon EKS에서 관리하며, 사용자 계정의 Route 53 리소스에는 표시되지 않습니다.
  • 프라이빗 호스팅 영역이 API 서버로 트래픽을 올바로 라우팅하려면 VPC에서 enableDnsHostnames  enableDnsSupport 가 true 로 설정되어야 하고, VPC에 설정된 DHCP 옵션이 도메인 이름 서버 목록에 AmazonProvidedDNS 를 포함해야 합니다. 

3️⃣ 프라이빗

 제어부 => (EKS owned ENI) => 워커노드(kubelet)

 워커노드 => (프라이빗 도메인, EKS owned ENI) => 제어부

 사용자(kubectl) => (프라이빗 도메인, EKS owned ENI) => 제어부

  • VPC 내부에서만 클러스터 API에 액세스할 수 있습니다.
  • 노드는 VPC 내의 X-ENI를 통해 API 서버와 통신합니다.
  • 인터넷에서 API 서버로 퍼블릭 액세스할 수 없습니다. 모든 kubectl 명령은 VPC 또는 연결된 네트워크 내에서 가져와야 합니다.

보안상의 이유로 클러스터 엔드포인트 액세스에는 퍼블릭 엔드포인트를 사용하지 않는 것이 좋습니다. 대부분의 경우 퍼블릭 및 프라이빗 또는 프라이빗 엔드포인트를 선택하여 VPC 내부에서만 클러스터 API에 액세스할 수 있도록 구성하는 것이 좋습니다.

 

🧿 3단계. 로깅 구성

활성화할 로그 유형을 선택적으로 선택할 수 있습니다. 기본적으로 각 로그 유형은 비활성(Disabled)입니다

🧿 4단계. 추가 기능 선택

🧿 5단계. 선택한 추가 기능 설정 구성

🧿 6단계. 검토 및 생성

 

 생성된 클러스터 정보를 확인합니다.

 

🧿 kubectl config 파일에 새 컨텍스트를 추가하여 kubectl이 클러스터와 통신하도록 설정합니다.

aws eks update-kubeconfig --region region-code --name my-cluster

🧿 클러스터와의 통신을 확인합니다.

🧿 앞서 클러스터 생성시 선택한 서브넷에 엔드포인트가 생성된것을 확인할 수 있습니다.

🧿  EKS 컨트롤 플레인 과 모든 관리형 워크로드에 연결된 ENI에 적용되는 보안 그룹을 확인합니다.

  • 클러스터를 생성할 때 Amazon EKS에서 eks-cluster-sg-my-cluster-uniqueID라는 보안 그룹을 만듭니다.
  • EKS는 이 보안 그룹을 생성하는 다음 리소스에 자동으로 연결합니다.
    • 클러스터를 생성할 때 생성되는 ENI
    • 생성한 모든 관리형 노드 그룹에 있는 노드의 ENI
규칙 유형 프로토콜 포트 소스 대상 주소
인바운드 모두 모두 자체  
아웃바운드 모두 모두   0.0.0.0/0 (IPv4) or ::/0 (IPv6)
  • 클러스터 보안 그룹(Cluster Security Group):
    • Control Plane 과 클러스터의 컴퓨팅 리소스 간의 통신을 제어하는 데 사용되는 통합 보안 그룹입니다.
    • Amazon EKS에서 관리하는 Control Plane 과 Amazon EKS API를 통해 생성된 모든 관리형 컴퓨팅 리소스에 적용합니다.
  • 추가 보안 그룹(Additional Security Group)
    • 노드 그룹에서 허용되는 트래픽을 제어할 수 있습니다. ?

클러스터 보안 그룹(Cluster Security Group) 과 추가 보안 그룹(Additional Security Group)의 차이점?

Comments