Outpost에서 로컬 클러스터 생성 - Amazon EKS

Outpost에서 로컬 클러스터 생성

이 주제에서는 Outpost에서 로컬 클러스터를 실행할 때 고려할 내용의 개요를 제공합니다. 이 주제에서는 Outpost에 로컬 클러스터를 배포하는 방법에 대한 지침도 제공합니다.

고려 사항
중요
  • 이러한 고려 사항은 관련 Amazon EKS 설명서에 나와 있지 않습니다. 기타 Amazon EKS 설명서 주제가 여기의 고려 사항과 충돌하는 경우 여기의 고려 사항을 따릅니다.

  • 이러한 고려 사항은 변경될 수 있으며 자주 변경될 수 있습니다. 따라서 이 주제를 주기적으로 검토하는 것이 좋습니다.

  • AWS 클라우드에서 클러스터를 생성하기 위한 고려 사항과 많은 고려 사항이 다릅니다.

  • 로컬 클러스터는 Outpost 랙만 지원합니다. 단일 로컬 클러스터는 단일 논리적 Outpost를 구성하는 여러 물리적 Outpost 랙에서 실행할 수 있습니다. 단일 로컬 클러스터는 여러 논리적 Outposts에서 실행할 수 없습니다. 각 논리적 Outpost에는 단일 Outpost ARN이 있습니다.

  • 로컬 클러스터는 Outpost의 계정에서 Kubernetes 컨트롤 플레인을 실행하고 관리합니다. Kubernetes 컨트롤 플레인 인스턴스에 대한 워크로드를 실행하거나 Kubernetes 컨트롤 플레인 구성 요소를 수정할 수 없습니다. 이러한 노드는 Amazon EKS 서비스에서 관리합니다. Kubernetes 컨트롤 플레인에 대한 변경 사항은 패치와 같은 자동 Amazon EKS 관리 작업 시 유지되지 않습니다.

  • 로컬 클러스터는 자체 관리형 추가 기능 및 자체 관리형 Amazon Linux 2 노드 그룹을 지원합니다. Amazon VPC CNI plugin for Kubernetes, kube-proxyCoreDNS 추가 기능은 로컬 클러스터에 자동으로 설치됩니다.

  • 로컬 클러스터는 Outposts에서 Amazon EBS를 사용해야 합니다. Outpost에는 Kubernetes 컨트롤 플레인 스토리지에 사용할 수 있는 Amazon EBS가 있어야 합니다.

  • 로컬 클러스터는 Outposts에서 Amazon EBS를 사용합니다. Outpost에는 Kubernetes 컨트롤 플레인 스토리지에 사용할 수 있는 Amazon EBS가 있어야 합니다. Outposts는 Amazon EBS gp2 볼륨만 지원합니다.

  • Amazon EBS 지원 Kubernetes PersistentVolumes은 Amazon EBS CSI 드라이버를 사용하여 지원됩니다.

사전 조건

로컬 Amazon EKS 클러스터가 생성될 때 클러스터를 생성하는 IAM 보안 주체가 영구적으로 추가됩니다. 보안 주체는 특히 Kubernetes RBAC 권한 부여 표에 관리자로 추가됩니다. 이 엔터티에는 system:masters 권한이 있습니다. 이 엔터티의 ID는 클러스터 구성에 표시되지 않습니다. 따라서 클러스터를 생성한 엔터티를 기록하고 절대로 삭제하지 않도록 하는 것이 중요합니다. 처음에는 서버를 생성한 보안 주체만 kubectl를 사용하여 Kubernetes API 서버를 호출할 수 있습니다. 콘솔을 사용하여 클러스터를 생성하는 경우 클러스터에서 kubectl 명령을 실행할 때 동일한 IAM 보안 인증 정보가 AWS SDK 보안 인증 정보 체인에 있어야 합니다. 클러스터가 생성되면 클러스터에 대한 액세스 권한을 다른 IAM 보안 주체에 부여할 수 있습니다.

로컬 Amazon EKS 로컬 클러스터 생성

eksctl, AWS Management Console, AWS CLI, Amazon EKS API, AWS SDK, AWS CloudFormation 또는 Terraform을 사용하여 로컬 클러스터를 생성할 수 있습니다.

  1. 로컬 클러스터를 생성합니다.

    eksctl
    전제 조건

    디바이스 또는 0.169.0에 설치된 버전 AWS CloudShell 이상의 eksctl 명령줄 도구. eksctl을 설치 또는 업그레이드하려면 eksctl 설명서에서 Installation을 참조하세요.

    eksctl를 사용하여 클러스터를 생성하려면
    1. 다음 콘텐츠를 디바이스에 복사합니다. 다음 값을 바꾼 다음 수정된 명령을 실행하여 outpost-control-plane.yaml 파일을 생성합니다.

      • region-code를 클러스터를 생성할 지원되는 AWS 리전으로 바꿉니다.

      • my-cluster를 클러스터 이름으로 바꿉니다. 이름에는 영숫자(대소문자 구분)와 하이픈만 사용할 수 있습니다. 영문자로 시작해야 하며 100자 이하여야 합니다. 이름은 클러스터를 생성하는 AWS 리전과 AWS 계정 내에서 고유해야 합니다.

      • vpc-ExampleID1subnet-ExampleID1을 기존 VPC 및 서브넷의 ID로 바꿉니다. VPC와 서브넷은 Amazon EKS 로컬 클러스터 VPC 및 서브넷 요구 사항과 고려 사항의 요구 사항을 충족해야 합니다.

      • uniqueid를 Outpost의 ID로 바꿉니다.

      • m5.large를 Outpost에서 사용 가능한 인스턴스 유형으로 바꿉니다. 인스턴스 유형을 선택하기 전에 용량 고려 사항 섹션을 참조하세요. 3개의 컨트롤 플레인 인스턴스가 배포됩니다. 이 수는 변경할 수 없습니다.

      cat >outpost-control-plane.yaml <<EOF apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: region-code version: "1.24" vpc: clusterEndpoints: privateAccess: true id: "vpc-vpc-ExampleID1" subnets: private: outpost-subnet-1: id: "subnet-subnet-ExampleID1" outpost: controlPlaneOutpostARN: arn:aws:outposts:region-code:111122223333:outpost/op-uniqueid controlPlaneInstanceType: m5.large EOF

      사용 가능한 모든 옵션 및 기본값의 전체 목록은 eksctl 설명서의 AWS Outposts 지원구성 파일 스키마를 참조하세요.

    2. 이전 단계에서 생성한 구성 파일을 사용하여 클러스터를 생성합니다. eksctl은 클러스터를 배포할 Outpost에 VPC와 서브넷 하나를 생성합니다.

      eksctl create cluster -f outpost-control-plane.yaml

      클러스터 프로비저닝에는 몇 분 정도 걸립니다. 클러스터가 생성되는 동안 여러 줄의 출력이 나타납니다. 출력의 마지막 줄은 다음 예제와 유사합니다.

      [✓]  EKS cluster "my-cluster" in "region-code" region is ready
    작은 정보

    eksctl을 사용하여 클러스터를 생성할 때 지정할 수 있는 대부분의 옵션을 보려면 eksctl create cluster --help 명령을 사용합니다. 사용 가능한 옵션을 모두 확인하려면 config 파일을 사용할 수 있습니다. 자세한 내용은 eksctl 설명서에서 config 파일 사용config 파일 스키마 부분을 참조하세요. GitHub에서 구성 파일 예제를 찾을 수 있습니다.

    Eksctl에서는 클러스터를 생성한 IAM 보안 주체(사용자 또는 역할)에 대한 액세스 항목을 자동으로 생성하고 IAM 보안 주체 관리자에게 클러스터의 Kubernetes 객체에 대한 권한을 부여합니다. 클러스터 생성자가 클러스터의 Kubernetes 객체에 대한 관리자 액세스 권한을 갖지 않도록 하려면 이전 구성 파일에 bootstrapClusterCreatorAdminPermissions: false 텍스트를 추가합니다(metadata, vpcoutpost와 같은 수준). 옵션을 추가한 경우 클러스터를 생성한 후 하나 이상의 IAM 보안 주체에 대한 액세스 항목을 생성해야 합니다. 그렇지 않으면 어떤 IAM 보안 주체도 클러스터의 Kubernetes 객체에 액세스할 수 없습니다.

    AWS Management Console
    전제 조건

    Amazon EKS 요구 사항을 충족하는 기존 VPC 및 서브넷. 자세한 내용은 Amazon EKS 로컬 클러스터 VPC 및 서브넷 요구 사항과 고려 사항 섹션을 참조하세요.

    AWS Management Console를 사용하여 클러스터를 생성하려면
    1. 이미 로컬 클러스터 IAM 역할이 있거나 eksctl을 사용하여 클러스터를 생성하려는 경우 이 단계를 건너뛸 수 있습니다. 기본적으로 eksctl은 사용자를 위한 역할을 생성합니다.

      1. 다음 명령을 실행하여 IAM 신뢰 정책 JSON 파일을 생성합니다.

        cat >eks-local-cluster-role-trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF
      2. Amazon EKS 클러스터 IAM 역할을 생성합니다. IAM 보안 주체를 생성하려면 역할을 생성하는 IAM 보안 주체에 iam:CreateRole 작업(권한)을 할당해야 합니다.

        aws iam create-role --role-name myAmazonEKSLocalClusterRole --assume-role-policy-document file://"eks-local-cluster-role-trust-policy.json"
      3. Amazon EKS 관리형 AmazonEKSLocalOutpostClusterPolicy를 역할에 연결합니다. IAM 정책을 IAM 보안 주체에 연결하려면 정책을 연결하는 보안 주체에 iam:AttachUserPolicy 또는 iam:AttachRolePolicy의 IAM 작업(권한) 중 하나를 할당해야 합니다.

        aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSLocalOutpostClusterPolicy --role-name myAmazonEKSLocalClusterRole
    2. https://console.aws.amazon.com/eks/home#/clusters에서 Amazon EKS 콘솔을 엽니다.

    3. 콘솔 화면 상단에서 지원되는 AWS 리전을 선택했는지 확인합니다.

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

    5. Configure cluster(클러스터 구성) 페이지에서 다음 필드의 값을 입력하거나 선택합니다.

      • Kubernetes 컨트롤 플레인 위치 - AWS Outposts를 선택합니다.

      • Outpost ID - 컨트롤 플레인을 생성할 Outpost의 ID를 선택합니다.

      • Instance type(인스턴스 유형) - 인스턴스 유형을 선택합니다. Outpost에서 사용 가능한 인스턴스 유형만 표시됩니다. 드롭다운 목록에서 각 인스턴스 유형은 인스턴스 유형이 권장되는 노드 수를 설명합니다. 인스턴스 유형을 선택하기 전에 용량 고려 사항 부분을 참조하세요. 모든 복제본은 동일한 인스턴스 유형을 사용하여 배포됩니다. 클러스터가 생성된 후에는 인스턴스 유형을 변경할 수 없습니다. 3개의 컨트롤 플레인 인스턴스가 배포됩니다. 이 수는 변경할 수 없습니다.

      • 이름(Name) - 클러스터의 이름 AWS 계정에서 고유해야 합니다. 이름에는 영숫자(대소문자 구분)와 하이픈만 사용할 수 있습니다. 영문자로 시작해야 하며 100자 이하여야 합니다. 이름은 클러스터를 생성하는 AWS 리전과 AWS 계정 내에서 고유해야 합니다.

      • Kubernetes 버전 – 클러스터에 사용하려는 Kubernetes 버전을 선택합니다. 이전 버전이 필요한 경우가 아니면 최신 버전을 선택하는 것이 좋습니다.

      • Cluster service role(클러스터 서비스 역할) - 이전 단계에서 생성한 Amazon EKS 클러스터 IAM 역할을 선택하여 Kubernetes 컨트롤 플레인에서 AWS 리소스를 관리하게 할 수 있습니다.

      • Kubernetes 클러스터 관리자 액세스 - 클러스터를 생성하는 IAM 보안 주체(역할 또는 사용자)가 클러스터의 Kubernetes 객체에 대한 관리자 액세스 권한을 갖도록 하려면 기본값(허용)을 그대로 수락합니다. Amazon EKS는 IAM 보안 주체에 대한 액세스 항목을 생성하고 클러스터 관리자에게 액세스 항목에 대한 권한을 부여합니다. 액세스 항목에 대한 자세한 내용은 Amazon EKS 클러스터의 Kubernetes 객체에 대한 IAM 역할 또는 사용자 액세스 허용 섹션을 참조하십시오.

        클러스터를 생성하는 주체가 아닌 다른 IAM 보안 주체가 Kubernetes 클러스터 객체에 대한 관리자 액세스 권한을 갖도록 하려면 거부 옵션을 선택합니다. 클러스터를 생성한 후 액세스 항목을 생성할 수 있는 IAM 권한이 있는 IAM 보안 주체는 Kubernetes 클러스터 객체에 액세스해야 하는 모든 IAM 보안 주체에 대한 액세스 항목을 추가할 수 있습니다. 필수 IAM 권한에 대한 자세한 내용은 서비스 권한 부여 참조에서 Actions defined by Amazon Elastic Kubernetes Service를 참조하세요. 거부 옵션을 선택하고 액세스 항목을 생성하지 않으면 어떤 IAM 보안 주체도 클러스터의 Kubernetes 객체에 액세스할 수 없습니다.

      • 태그(Tags) - (선택 사항) 클러스터에 태그를 추가합니다. 자세한 내용은 Amazon EKS 리소스 태깅 섹션을 참조하세요.

      이 페이지를 모두 완료하면 다음을 선택합니다.

    6. 네트워킹 지정(Specify networking) 페이지에서 다음 필드의 값을 선택합니다.

      • VPC – 기존 VPC를 선택합니다. VPC에는 생성하려는 클러스터, 노드 및 기타 Kubernetes 리소스에 사용 가능한 IP 주소가 충분해야 합니다. VPC에서는 VPC 요구 사항 및 고려 사항의 요구 사항을 충족해야 합니다.

      • 서브넷(Subnets) - 기본적으로 이전 필드에서 지정한 VPC에서 사용 가능한 모든 서브넷이 사전 선택됩니다. 선택한 서브넷은 서브넷 요구 사항 및 고려 사항의 요구 사항을 충족해야 합니다.

        보안 그룹(Security groups) – (선택 사항) 생성하는 네트워크 인터페이스에 Amazon EKS가 연결하려는 보안 그룹을 하나 이상 지정합니다. Amazon EKS에서는 클러스터와 VPC 간 통신을 활성화하는 보안 그룹을 자동으로 생성합니다. Amazon EKS는 이 보안 그룹과 사용자가 선택한 보안 그룹을 생성하는 네트워크 인터페이스에 연결합니다. Amazon EKS에서 생성하는 클러스터 보안 그룹에 대한 자세한 내용을 알아보려면 Amazon EKS 보안 그룹 요구 사항 및 고려 사항 부분을 참조하세요. Amazon EKS가 생성하는 클러스터 보안 그룹에서 규칙을 수정할 수 있습니다. 자체 보안 그룹을 추가하도록 선택한 경우 클러스터 생성 후 선택한 보안 그룹은 변경할 수 없습니다. 온프레미스 호스트가 클러스터 엔드포인트와 통신하려면 클러스터 보안 그룹의 인바운드 트래픽을 허용해야 합니다. 수신 및 송신 인터넷 연결이 없는 클러스터(프라이빗 클러스터라고도 함)의 경우 다음 중 하나를 수행해야 합니다.

        • 필수 VPC 엔드포인트와 연결된 보안 그룹을 추가합니다. 필수 엔드포인트에 대한 자세한 내용은 서브넷 액세스AWS 서비스VPC 엔드포인트를 참조하세요.

        • VPC 엔드포인트와 연결된 보안 그룹의 트래픽을 허용하려면 Amazon EKS에서 생성한 보안 그룹을 수정합니다.

      이 페이지를 모두 완료하면 다음을 선택합니다.

    7. 관찰성 구성 페이지에서 설정할 지표컨트롤 플레인 로깅 옵션을 선택할 수 있습니다. 기본적으로 각 로그 유형은 해제되어 있습니다.

      이 페이지를 모두 완료하면 다음을 선택합니다.

    8. 검토 및 생성 페이지에서 이전 페이지에서 입력하거나 선택한 정보를 검토합니다. 변경해야 하는 경우 편집(Edit)을 선택합니다 만족하는 경우 생성(Create)을 선택합니다. 클러스터가 프로비저닝되는 동안 상태(Status) 필드에는 생성 중(CREATING)이 표시됩니다.

      클러스터 프로비저닝에는 몇 분 정도 걸립니다.

  2. 클러스터가 생성된 후 생성된 Amazon EC2 컨트롤 플레인 인스턴스를 볼 수 있습니다.

    aws ec2 describe-instances --query 'Reservations[*].Instances[*].{Name:Tags[?Key==`Name`]|[0].Value}' | grep my-cluster-control-plane

    예제 출력은 다음과 같습니다.

    "Name": "my-cluster-control-plane-id1"
    "Name": "my-cluster-control-plane-id2"
    "Name": "my-cluster-control-plane-id3"

    컨트롤 플레인 인스턴스에서 워크로드가 예약되지 않도록 각 인스턴스는 node-role.eks-local.amazonaws.com/control-plane으로 테인트됩니다. 테인트에 대한 자세한 내용을 알아보려면 Kubernetes 문서의 테인트(Taints)와 톨러레이션(Tolerations)을 참조하세요. Amazon EKS는 로컬 클러스터의 상태를 지속적으로 모니터링합니다. 보안 패치 및 비정상 인스턴스 복구와 같은 자동 관리 작업을 수행합니다. 로컬 클러스터가 클라우드에서 연결 해제되면 재연결 시 클러스터가 정상 상태로 복구되도록 조치를 완료합니다.

  3. eksctl을 사용하여 클러스터를 생성한 경우 이 단계를 건너뛸 수 있습니다. eksctl에서 자동으로 이 단계를 완료합니다. kubectl config 파일에 새 컨텍스트를 추가하여 kubectl이 클러스터와 통신하도록 사용 설정합니다. 파일 생성 설치 및 업데이트 방법에 대한 지침은 Amazon EKS 클러스터용 kubeconfig 파일 생성 또는 업데이트 부분을 참조하세요.

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

    예제 출력은 다음과 같습니다.

    Added new context arn:aws:eks:region-code:111122223333:cluster/my-cluster to /home/username/.kube/config
  4. 로컬 클러스터의 Kubernetes API 서버에 연결하려면 서브넷의 로컬 게이트웨이에 액세스하거나 VPC 내에서 연결해야 합니다. Outpost 랙을 온프레미스 네트워크에 연결하는 방법을 자세히 알아보려면 AWS Outposts 사용 설명서의 랙용 로컬 게이트웨이 작동 방식을 참조하세요. Direct VPC Routing을 사용하며 Outpost 서브넷에 로컬 게이트웨이에 대한 경로가 있으면 Kubernetes 컨트롤 플레인 인스턴스의 프라이빗 IP 주소가 로컬 네트워크를 통해 자동으로 브로드캐스트됩니다. 로컬 클러스터의 Kubernetes API 서버 엔드포인트는 Amazon Route 53(Route 53)에서 호스팅됩니다. API 서비스 엔드포인트는 퍼블릭 DNS 서버에서 Kubernetes API 서버의 프라이빗 IP 주소로 확인할 수 있습니다.

    로컬 클러스터의 Kubernetes 컨트롤 플레인 인스턴스는 클러스터 수명 주기 동안 변경되지 않는 고정 프라이빗 IP 주소를 사용하여 정적 탄력적 네트워크 인터페이스로 구성됩니다. Kubernetes API 서버와 상호 작용하는 머신은 네트워크 연결이 해제된 동안 Route 53에 연결되지 않을 수도 있습니다. 이 경우 계속되는 작업을 위해 고정 프라이빗 IP 주소로 /etc/hosts를 구성하는 것이 좋습니다. 또한 로컬 DNS 서버를 설정하고 Outpost에 연결하는 것이 좋습니다. 자세한 내용은 AWS Outposts 설명서를 참조하세요. 다음 명령을 실행하여 클러스터와 설정된 통신을 확인합니다.

    kubectl get svc

    예제 출력은 다음과 같습니다.

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 28h
  5. (선택 사항) 로컬 클러스터가 AWS 클라우드에서 연결 해제된 상태일 때 인증을 테스트합니다. 지침은 네트워크 연결 해제 준비 을 참조하세요.

내부 리소스

Amazon EKS는 클러스터에 다음 리소스를 생성합니다. 리소스는 Amazon EKS 내부용입니다. 클러스터가 제대로 작동하려면 이러한 리소스를 편집하거나 수정하지 않습니다.

  • 다음 미러 Pods:

    • aws-iam-authenticator-node-hostname

    • eks-certificates-controller-node-hostname

    • etcd-node-hostname

    • kube-apiserver-node-hostname

    • kube-controller-manager-node-hostname

    • kube-scheduler-node-hostname

  • 다음 자체 관리형 추가 기능:

    • kube-system/coredns

    • kube-system/kube-proxy(첫 번째 노드를 추가할 때까지 생성되지 않음)

    • kube-system/aws-node(첫 번째 노드를 추가할 때까지 생성되지 않음). 로컬 클러스터는 클러스터 네트워킹에 Amazon VPC CNI plugin for Kubernetes 플러그인을 사용합니다. 컨트롤 플레인 인스턴스(aws-node-controlplane-*라는 포드)의 구성을 변경하지 않습니다. 플러그인에서 새 네트워크 인터페이스를 생성할 때 기본값 변경에 사용할 수 있는 구성 변수가 있습니다. 자세한 내용을 알아보려면 GitHub의 설명서를 참조하세요.

  • 다음 서비스:

    • default/kubernetes

    • kube-system/kube-dns

  • 이름이 eks.systemPodSecurityPolicy

  • 이름이 eks:system:podsecuritypolicyClusterRole

  • 이름이 eks:systemClusterRoleBinding

  • 기본 포드 보안 정책

  • 클러스터 보안 그룹 외에도 Amazon EKS에서는 AWS 계정에 이름이 eks-local-internal-do-not-use-or-edit-cluster-name-uniqueid인 보안 그룹을 생성합니다. 이 보안 그룹을 사용하면 컨트롤 플레인 인스턴스에서 실행되는 Kubernetes 구성 요소 간에 트래픽이 자유롭게 흐를 수 있습니다.

권장되는 다음 단계: