

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# 네트워크 연결 해제에 대비하여 EC2 인스턴스 저장소로 구성된 AWS Outposts에 로컬 Amazon EKS 클러스터 준비
<a name="eks-outposts-instance-store-network-disconnects"></a>

로컬 네트워크를 AWS 클라우드에 연결하는 AWS Outpost 서비스 링크의 연결이 해제된 경우 로컬 Amazon EKS 클러스터를 Outpost에서 계속 사용할 수 있습니다. 이 주제에서는 네트워크 연결 해제에 대비하여 로컬 클러스터를 준비하는 방법과 관련 고려 사항을 설명합니다.
+ 로컬 클러스터를 사용하면 계획되지 않은 임시 네트워크 연결 해제 중에 안정성과 지속적인 작업을 수행할 수 있습니다. AWS Outposts는 데이터 센터에서 AWS 클라우드의 확장 역할을 하는 완전 연결형 제품으로 남아 있습니다. Outpost와 AWS 클라우드 간 네트워크 연결이 해제된 경우 연결 복원을 시도하는 것이 좋습니다. 지침은 *AWS Outposts 사용 설명서*의 [AWS Outposts 랙 네트워크 문제 해결 체크리스트](https://docs.aws.amazon.com/outposts/latest/userguide/network-troubleshoot.html)를 참조하세요.
+ Outposts는 Outpost의 연결 상태를 모니터링하는 데 사용할 수 있는 `ConnectedStatus` 지표를 내보냅니다. 자세한 내용을 알아보려면 * AWS Outposts 사용 설명서*에서 [Outposts 지표](https://docs.aws.amazon.com/outposts/latest/userguide/outposts-cloudwatch-metrics.html#outposts-metrics)를 참조하세요.

## 네트워크 연결 해제 중 인증
<a name="eks-outposts-instance-store-network-disconnects-authentication"></a>

로컬 클러스터는 여러 인증 메커니즘을 지원합니다. 네트워크 연결 해제 중 가용성은 다음과 같이 각각 다릅니다.


| 인증 메커니즘 | 연결 해제 중에 사용할 수 있나요? | 
| --- | --- | 
|  AWS IAM(액세스 항목, `aws-auth` ConfigMap) | 아니요. IAM은 AWS 리전 연결이 필요합니다. | 
| OIDC(고객 제공 공급자) | 공급자 위치에 따라 다릅니다. Outpost의 로컬 네트워크에서 OIDC 공급자에 연결할 수 있는 경우 인증이 계속 작동합니다. | 
| x.509 클라이언트 인증서 | 예. 인증서는 Kubernetes API 서버에서 로컬로 검증됩니다. | 
| IRSA(서비스 계정에 대한 IAM 역할) | 아니요. [연결 해제 중 IRSA 및 Pod Identity](#eks-outposts-instance-store-network-disconnects-irsa)를 참조하세요. | 
| EKS Pod Identity | 아니요. [연결 해제 중 IRSA 및 Pod Identity](#eks-outposts-instance-store-network-disconnects-irsa)를 참조하세요. | 

### x.509 클라이언트 인증서
<a name="eks-outposts-instance-store-network-disconnects-x509"></a>

네트워크 연결 해제 중에 `kubectl` 액세스를 유지하려면 연결 해제가 발생하기 전에 클라이언트 X.509 인증서를 생성합니다.

관리자 인증서를 생성하려면:

1. 프라이빗 키와 인증서 서명 요청(CSR)을 생성합니다.

   ```
   openssl req -new -newkey rsa:4096 -nodes \
       -keyout admin.key -out admin.csr -subj "/CN=admin"
   ```

1. Kubernetes `CertificateSigningRequest` 리소스를 생성하고 승인합니다.

   ```
   cat admin.csr | base64 | tr -d '\n' > admin.csr.b64
   ```

   ```
   apiVersion: certificates.k8s.io/v1
   kind: CertificateSigningRequest
   metadata:
     name: admin-csr
   spec:
     request: <base64-encoded-csr>
     signerName: kubernetes.io/kube-apiserver-client
     usages:
       - client auth
   ```

   ```
   kubectl apply -f admin-csr.yaml
   kubectl certificate approve admin-csr
   ```

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

   ```
   kubectl get csr admin-csr -o jsonpath='{.status.certificate}' | base64 --decode > admin.crt
   ```

1. `ClusterRoleBinding`을 생성하여 관리자 액세스 권한을 부여합니다.

   ```
   kubectl create clusterrolebinding admin --clusterrole=cluster-admin \
       --user=admin --group=system:masters
   ```

1. 인증서를 사용하는 `kubeconfig`를 구축합니다.

   ```
   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
   ```

### 연결 해제 중 클러스터 엔드포인트 DNS 확인
<a name="eks-outposts-instance-store-network-disconnects-cluster-dns"></a>

로컬 클러스터의 Kubernetes API 서버 엔드포인트는 Amazon Route 53에서 호스팅되며 Amazon EKS가 서브넷에 생성하는 교차 계정 탄력적 네트워크 인터페이스(ENI)의 프라이빗 IP 주소로 확인됩니다. 이러한 ENI에는 정상 클러스터 작업 중에 변경되지 않는 고정 프라이빗 IP 주소가 있습니다.

네트워크 연결 해제 중에는 Outpost가 Route 53에 연결할 수 없으므로 로컬 확인 경로를 준비하지 않으면 클러스터 엔드포인트 호스트 이름이 확인되지 않습니다. API 서버에 연결하려면 다음 세 가지 범주의 클라이언트가 필요합니다.
+  `kubectl`을 실행하는 **클러스터 관리자**.
+  노드 하트비트를 전송하고 사양을 가져오는 **워커 노드**(`kubelet`).
+  클러스터 서비스 IP를 설정하는 각 노드의 **`kube-proxy`**.

#### 옵션 1: 로컬 DNS 솔루션(권장)
<a name="_option_1_local_dns_solution_recommended"></a>

 AWS는 클러스터 엔드포인트 레코드를 캐싱하고 Outpost 연결이 해제된 동안 이를 처리하는 로컬 DNS 솔루션을 배포할 것을 권장합니다. 클러스터 엔드포인트 레코드를 캐싱하는 온프레미스 환경에서 자체 DNS 서버를 실행할 수 있습니다.

로컬 DNS 솔루션을 사용하는 경우 확인이 로컬 DNS 솔루션과 일치하도록 클러스터 엔드포인트 호스트 이름(ENI IP 주소 아님)에서 `kubeconfig` 및 워커 노드 AMI를 가리키는 것이 좋습니다.

#### 옵션 2: 고정 IP 기반 액세스
<a name="_option_2_static_ip_based_access"></a>

로컬 DNS 솔루션을 실행하지 않으려는 경우 고정 IP 기반 액세스를 사용할 수 있습니다.
+  **관리자:** 교차 계정 ENI 프라이빗 IP 주소를 직접 가리키도록 `kubeconfig`를 구성합니다. AWS 계정에서 `Amazon EKS {{cluster-name}} ` 설명으로 네트워크 인터페이스를 검색하여 ENI를 찾습니다. 각 ENI의 IP 주소는 정상 작동 시 클러스터 수명 동안 안정적입니다.
+  **워커 노드(Amazon EKS 최적화 AMI):** Amazon EKS 최적화 AMI에서 워커 노드를 시작하면 부트스트랩 스크립트가 클러스터 엔드포인트를 ENI IP 주소가 있는 `/etc/hosts`에 추가합니다. 필요한 추가 구성은 없습니다.
+  **워커 노드(사용자 지정 AMI):** 클러스터 엔드포인트 호스트 이름과 ENI IP 주소를 사용자 지정 부트스트랩의 `/etc/hosts`에 추가합니다. 그렇지 않으면 연결 해제 중에 `kubelet`과 `kube-proxy`가 API 서버에 연결할 수 없습니다.

**중요**  
교차 계정 ENI가 삭제되거나 IP 주소가 변경되는 경우(예: 삭제하거나 Amazon EKS가 다시 연결하지 못하도록 수정하는 경우) 고정 IP 기반 액세스를 사용하는 모든 노드와 모든 관리자를 수동으로 업데이트해야 합니다. 로컬 DNS 솔루션을 사용하면 수동 개입이 필요하지 않습니다.

### 연결 해제 중 포드 DNS 확인
<a name="eks-outposts-instance-store-network-disconnects-pod-dns"></a>

연결 해제된 작업 중에 DNS 실패를 방지하려면 `kubelet’s `resolvConf` 설정을 재정의하도록 워커 노드 시작 템플릿을 구성하세요. 사용자 데이터에서 (VPC 검색 도메인 없이) `nameserver 10.0.0.2`만 포함하는 사용자 지정 `resolv.conf` 파일(예:`/etc/kubernetes/resolv.conf`)을 생성한 다음 `NodeConfig`에서 `spec.kubelet.config.resolvConf: /etc/kubernetes/resolv.conf`를 설정합니다. 이렇게 하면 포드 DNS 구성에서 ` {{region-code}}.compute.internal` 검색 도메인이 제거되므로 연결 해제 동안 연결할 수 없는 VPC DNS 리졸버로 쿼리가 전달되지 않습니다.

다음 예제는 워커 노드 사용자 데이터를 보여줍니다.

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="BOUNDARY"

--BOUNDARY
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
mkdir -p /etc/kubernetes
echo "nameserver [.replaceable]``10.0.0.2``" > /etc/kubernetes/resolv.conf

--BOUNDARY
Content-Type: application/node.eks.aws

---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name: my-cluster
    ...
  kubelet:
    config:
      resolvConf: /etc/kubernetes/resolv.conf

--BOUNDARY--
```

### 연결 해제 중 IRSA 및 Pod Identity
<a name="eks-outposts-instance-store-network-disconnects-irsa"></a>

**중요**  
IRSA와 EKS Pod Identity는 AWS 리전에서 실행되는 AWS STS에 의존합니다. 네트워크 연결 해제 중에 IRSA 또는 Pod Identity를 사용하는 워크로드는 새 자격 증명을 얻을 수 없습니다. 기존 자격 증명은 일정 기간이 지나면 만료됩니다.

네트워크 연결 해제 중에 가용성을 유지해야 하는 워크로드의 경우 리전 기반 AWS 서비스에서 기능 또는 운영 종속성을 사용하지 않는 것이 좋습니다.

## 연결 해제 중 `etcd` 동작
<a name="eks-outposts-instance-store-network-disconnects-etcd"></a>

네트워크 연결 해제 중에는 `etcd` 스냅샷을 백업할 수 없습니다. 연결 해제 중에 둘 이상의 `etcd` 인스턴스를 사용할 수 없게 되면 Outpost가 다시 연결되고 `etcd` 쿼럼이 복원될 때까지 `etcd`에서 쿼럼이 손실되고 Kubernetes API 작업을 사용할 수 없습니다. 이미 실행 중인 워크로드는 계속 작동합니다.

## 연결 해제 중 컨트롤 플레인 로깅
<a name="eks-outposts-instance-store-network-disconnects-cp-logs"></a>

네트워크 연결 해제 중에 컨트롤 플레인 로그는 컨트롤 플레인 인스턴스에서 로컬로 캐시됩니다. 연결이 복원되면 로그가 상위 AWS 리전의 Amazon CloudWatch Logs로 전송됩니다. 컨트롤 플레인에 로깅 에이전트를 설치하거나 유지할 필요가 없습니다.

## 로컬 관찰성
<a name="eks-outposts-instance-store-network-disconnects-local-observability"></a>

[Prometheus](https://prometheus.io/), [Grafana](https://grafana.com/) 또는 기타 서드 파티 솔루션을 사용하여 연결 해제 중에 로컬에서 클러스터를 모니터링하여 Kubernetes API 서버 지표 엔드포인트를 스크레이프할 수 있습니다.

## 로컬 이미지 리포지토리
<a name="eks-outposts-instance-store-network-disconnects-image-repo"></a>

추가 복제본으로 배포 규모를 조정하거나 연결 해제 중에 포드 장애로부터 복구하려면 로컬 컨테이너 이미지 리포지토리(예: Docker 레지스트리)가 있거나 연결 해제 전에 노드에 이미지를 캐시해야 합니다. 네트워크 연결 해제 중에는 Amazon ECR을 사용할 수 없습니다.

## Kubernetes 포드 장애 조치 동작 조정
<a name="eks-outposts-instance-store-network-disconnects-pod-failover"></a>

네트워크 연결 해제 중에는 Kubernetes 컨트롤 플레인이 AWS 리전과 통신할 수 없습니다. 노드에 연결할 수 없게 되는 경우 기본 Kubernetes 동작은 제한 시간 이후에 포드를 제거하는 것입니다. 포드 사양에서 톨러레이션과 `tolerationSeconds`를 사용하여 이 동작을 튜닝하면 파티션 중에 포드가 다시 예약되는 속도를 제어할 수 있습니다. 자세한 지침과 예제는 Amazon EKS 모범 사례 안내서의 https://docs.aws.amazon.com/eks/latest/best-practices/hybrid-nodes-network-disconnection-best-practices.html\#*tune\_kubernetes\_pod\_failover\_behavior[Tune Kubernetes pod failover behavior]*를 참조하세요.

## 네트워크 연결 해제 시뮬레이션
<a name="eks-outposts-instance-store-network-disconnects-simulate"></a>

로컬 클러스터를 사용하여 프로덕션에 들어가기 전에 연결 해제를 시뮬레이션하여 연결 해제된 상태에서도 클러스터에 계속 액세스할 수 있는지 확인해야 합니다.

1. Outpost를 AWS 리전에 연결하는 네트워킹 디바이스에 방화벽 규칙을 적용합니다. 그러면 Outpost의 서비스 링크 연결이 해제됩니다.

1. 생성한 X.509 인증서를 사용하여 로컬 클러스터에 대한 연결을 테스트합니다.

   ```
   kubectl --kubeconfig admin.kubeconfig get nodes
   ```

**참고**  
Outpost에서 이미 프로덕션 단계인 서비스가 있는 경우 연결 해제를 시뮬레이션하지 마세요. 서비스 링크를 연결 해제하면 Outpost에서 실행되는 모든 서비스가 영향을 받습니다.