네트워크 연결 해제에 대비하여 AWS Outposts에 로컬 Amazon EKS 클러스터 준비 - Amazon EKS

네트워크 연결 해제에 대비하여 AWS Outposts에 로컬 Amazon EKS 클러스터 준비

로컬 네트워크와 AWS 클라우드의 연결이 끊어진 경우 Outpost에서 로컬 Amazon EKS 클러스터를 계속 사용할 수 있습니다. 이 주제에서는 로컬 클러스터에서 네트워크 연결 해제에 대비하는 방법과 관련 고려 사항을 설명합니다.

  • 로컬 클러스터를 사용하면 계획되지 않은 임시 네트워크 연결 해제 중에 안정성과 지속적인 작업을 수행할 수 있습니다. AWS Outposts는 데이터 센터에서 AWS 클라우드의 확장 역할을 하는 완전 연결형 제품으로 남아 있습니다. Outpost와 AWS 클라우드 간 네트워크 연결이 해제된 경우 연결 복원을 시도하는 것이 좋습니다. 지침은 AWS Outposts 사용 설명서AWS Outposts 랙 네트워크 문제 해결 체크리스트를 참조하세요. 로컬 클러스터 문제를 해결하는 방법에 대한 자세한 내용은 AWS Outposts의 로컬 Amazon EKS 클러스터 문제 해결 섹션을 참조하세요.

  • Outposts는 Outpost의 연결 상태를 모니터링하는 데 사용할 수 있는 ConnectedStatus 지표를 내보냅니다. 자세한 내용을 알아보려면 AWS Outposts 사용 설명서에서 Outposts 지표를 참조하세요.

  • 로컬 클러스터는 Kubernetes용 AWS ID 및 액세스 관리 인증자를 사용하여 IAM을 기본 인증 메커니즘으로 사용합니다. 네트워크 연결 해제 중에는 IAM을 사용할 수 없습니다. 따라서 로컬 클러스터에서는 네트워크 연결 해제 중 클러스터에 연결하는 데 사용할 수 있는 x.509 인증서를 사용하는 대체 인증 메커니즘을 지원합니다. 클러스터에 대한 x.509 인증서를 받고 사용하는 방법에 대한 내용은 네트워크 연결 해제 중 로컬 클러스터에 인증 섹션을 참조하세요.

  • 네트워크 연결 해제 중 Route 53에 액세스할 수 없는 경우 온프레미스 환경에서 로컬 DNS 서버를 사용하는 것이 좋습니다. Kubernetes 컨트롤 플레인 인스턴스는 고정 IP 주소를 사용합니다. 로컬 DNS 서버를 사용하는 대신 엔드포인트 호스트 이름과 IP 주소를 사용하여 클러스터에 연결하는 데 사용하는 호스트를 구성할 수 있습니다. 자세한 내용은 AWS Outposts 사용 설명서에서 DNS를 참조하세요.

  • 네트워크 연결 해제 중 애플리케이션 트래픽이 증가할 것으로 예상되는 경우 클라우드에 연결될 때 클러스터에 여분의 컴퓨팅 용량을 프로비저닝할 수 있습니다. Amazon EC2 인스턴스는 AWS Outposts의 가격에 포함됩니다. 따라서 여분의 인스턴스를 실행해도 AWS 사용 비용에 영향을 미치지 않습니다.

  • 네트워크 연결 해제 중 워크로드에 대한 생성, 업데이트 및 조정 작업을 활성화하려면 로컬 네트워크를 통해 애플리케이션의 컨테이너 이미지에 액세스할 수 있어야 하고 클러스터에 충분한 용량이 있어야 합니다. 로컬 클러스터는 컨테이너 레지스트리를 호스팅하지 않습니다. Pods가 이전에 해당 노드에서 실행된 경우 컨테이너 이미지가 노드에서 캐시됩니다. 일반적으로 클라우드의 Amazon ECR에서 애플리케이션의 컨테이너 이미지를 가져오는 경우 로컬 캐시 또는 레지스트리를 실행해 보세요. 네트워크 연결 해제 중 워크로드 리소스에 대한 생성, 업데이트 또는 조정 작업이 필요한 경우 로컬 캐시 또는 레지스트리가 도움이 됩니다.

  • 로컬 클러스터는 Amazon EBS를 영구 볼륨의 기본 스토리지 클래스로 사용하고 Amazon EBS CSI 드라이버를 사용하여 Amazon EBS 영구 볼륨의 수명 주기를 관리합니다. 네트워크 연결 해제 중 Amazon EBS에서 지원하는 Pods는 생성, 업데이트 또는 조정할 수 없습니다. 이러한 작업에는 클라우드의 Amazon EBS API에 대한 호출이 필요하기 때문입니다. 로컬 클러스터에 상태 저장 워크로드를 배포하고 네트워크 연결 해제 중 생성, 업데이트 또는 조정 작업이 필요한 경우 대체 스토리지 메커니즘을 사용하는 것이 좋습니다.

  • AWS Outposts 에서 관련 AWS 리전 내 API(예: Amazon EBS 또는 Amazon S3용 API)에 액세스할 수 없는 경우 Amazon EBS 스냅샷을 생성하거나 삭제할 수 없습니다.

  • ALB(수신)를 AWS 인증 관리(ACM)와 통합하면 인증서가 푸시되어 AWS Outposts ALB Compute 인스턴스의 메모리에 저장됩니다. AWS 리전에서 연결이 해제되는 경우 현재 TLS 종료는 계속 작동합니다. 이 컨텍스트에서는 변형 작업(예: 새 수신 정의, 새 ACM 기반 인증서 API 작업, ALB 컴퓨팅 크기 조정 또는 인증서 교체)에 실패합니다. 자세한 내용은 AWS 사용 설명서관리형 인증서 갱신 문제 해결을 참조하세요.

  • Amazon EKS 컨트롤 플레인 로그는 네트워크 연결 해제 중 Kubernetes 컨트롤 플레인 인스턴스에서 로컬로 캐시됩니다. 다시 연결되면 로그가 상위 AWS 리전의 CloudWatch Logs로 전송됩니다. Prometheus, Grafana 또는 Amazon EKS 파트너 솔루션을 사용하여 Kubernetes API 서버의 지표 엔드포인트를 사용하거나 로그에 Fluent Bit를 사용하여 로컬로 클러스터를 모니터링할 수 있습니다.

  • 애플리케이션 트래픽을 위해 Outposts에서 AWS Load Balancer Controller를 사용하는 경우 AWS Load Balancer Controller 뒤에 있는 기존 Pods는 네트워크 연결 해제 중 트래픽을 계속 수신합니다. 네트워크 연결 해제 중 생성된 새 Pods는 Outpost가 AWS 클라우드에 다시 연결될 때까지 트래픽을 수신하지 않습니다. 네트워크 연결 해제 중 조정 요구 사항을 수용할 수 있도록 AWS 클라우드에 연결되어 있는 동안 애플리케이션의 복제본 수를 설정하는 것이 좋습니다.

  • Amazon VPC CNI plugin for Kubernetes는 기본적으로 보조 IP 모드입니다. WARM_ENI_TARGET=1로 구성되어 플러그인이 사용 가능한 IP 주소의 '전체 탄력적 네트워크 인터페이스'를 사용 가능한 상태로 유지할 수 있습니다. 연결 해제된 상태에서 조정 요구 사항에 따라 WARM_ENI_TARGET, WARM_IP_TARGETMINIMUM_IP_TARGET 값을 변경하는 것을 고려하세요. 자세한 내용을 알아보려면 GitHub에서 플러그인의 readme 파일을 참조하세요. 각 인스턴스 유형별로 지원되는 최대 Pods 수 목록은 GitHub의 eni-max-pods.txt 파일을 참조하세요.

네트워크 연결 해제 중 로컬 클러스터에 인증

네트워크 연결 해제 중에는 AWS ID 및 액세스 관리(IAM)를 사용할 수 없습니다. 연결이 해제된 동안에는 IAM 자격 증명을 사용하여 로컬 클러스터에 인증할 수 없습니다. 그러나 연결이 해제되면 x509 인증서를 사용하여 로컬 네트워크를 통해 클러스터에 연결할 수 있습니다. 연결 해제 중 사용할 클라이언트 X509 인증서를 다운로드하여 저장해야 합니다. 이 주제에서는 연결 해제된 상태일 때 클러스터에 인증하기 위해 인증서를 생성하고 사용하는 방법을 알아봅니다.

  1. 인증서 서명 요청을 생성합니다.

    1. 인증서 서명 요청을 생성합니다.

      openssl req -new -newkey rsa:4096 -nodes -days 365 \ -keyout admin.key -out admin.csr -subj "/CN=admin"
    2. Kubernetes에서 인증서 서명 요청을 생성합니다.

      BASE64_CSR=$(cat admin.csr | base64 -w 0) cat << EOF > admin-csr.yaml apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: admin-csr spec: signerName: kubernetes.io/kube-apiserver-client request: ${BASE64_CSR} usages: - client auth EOF
  2. kubectl을 사용하여 인증서 서명 요청을 생성합니다.

    kubectl create -f admin-csr.yaml
  3. 인증서 서명 요청의 상태를 확인합니다.

    kubectl get csr admin-csr

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

    NAME AGE REQUESTOR CONDITION admin-csr 11m kubernetes-admin Pending

    Kubernetes에서 인증서 서명 요청을 생성했습니다.

  4. 인증서 서명 요청을 승인합니다.

    kubectl certificate approve admin-csr
  5. 인증서 서명 요청의 승인 상태를 다시 확인합니다.

    kubectl get csr admin-csr

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

    NAME AGE REQUESTOR CONDITION admin-csr 11m kubernetes-admin Approved
  6. 인증서를 검색하고 확인합니다.

    1. 인증서를 검색합니다.

      kubectl get csr admin-csr -o jsonpath='{.status.certificate}' | base64 --decode > admin.crt
    2. 인증서를 확인합니다.

      cat admin.crt
  7. admin 사용자에 대한 클러스터 역할 바인딩을 생성합니다.

    kubectl create clusterrolebinding admin --clusterrole=cluster-admin \ --user=admin --group=system:masters
  8. 연결 해제된 상태에 대한 사용자 범위 kubeconfig를 생성합니다.

    다운로드한 admin 인증서를 사용하여 kubeconfig 파일을 생성할 수 있습니다. 다음 명령에서 my-clusterapiserver-endpoint를 바꿉니다.

    aws eks describe-cluster --name my-cluster \ --query "cluster.certificateAuthority" \ --output text | base64 --decode > ca.crt
    kubectl config --kubeconfig admin.kubeconfig set-cluster my-cluster \ --certificate-authority=ca.crt --server apiserver-endpoint --embed-certs
    kubectl config --kubeconfig admin.kubeconfig set-credentials admin \ --client-certificate=admin.crt --client-key=admin.key --embed-certs
    kubectl config --kubeconfig admin.kubeconfig set-context admin@my-cluster \ --cluster my-cluster --user admin
    kubectl config --kubeconfig admin.kubeconfig use-context admin@my-cluster
  9. kubeconfig 파일을 봅니다.

    kubectl get nodes --kubeconfig admin.kubeconfig
  10. Outpost에서 서비스가 이미 프로덕션에 있는 경우 이 단계를 건너뜁니다. Amazon EKS가 Outpost에서 실행되는 유일한 서비스이고 Outpost가 현재 프로덕션에 없는 경우 네트워크 연결 해제를 시뮬레이션할 수 있습니다. 로컬 클러스터를 사용하여 프로덕션에 들어가기 전에 연결 해제를 시뮬레이션하여 연결 해제된 상태에서도 클러스터에 계속 액세스할 수 있는지 확인해야 합니다.

    1. Outpost를 AWS 리전에 연결하는 네트워킹 디바이스에 방화벽 규칙을 적용합니다. 그러면 Outpost의 서비스 링크 연결이 해제됩니다. 새 인스턴스를 생성할 수 없습니다. 현재 실행 중인 인스턴스는 AWS 리전 및 인터넷 연결이 끊어집니다.

    2. x509 인증서를 사용하여 연결이 해제된 동안 로컬 클러스터 연결을 테스트할 수 있습니다. kubeconfig를 이전 단계에서 생성한 admin.kubeconfig로 변경해야 합니다. my-cluster를 로컬 클러스터의 이름으로 바꿉니다.

      kubectl config use-context admin@my-cluster --kubeconfig admin.kubeconfig

    연결 해제된 상태에서 로컬 클러스터에 문제가 있는 경우 지원 티켓을 여는 것이 좋습니다.