

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

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

# 서비스에 할당할 수 있는 외부 IP 주소 제한
<a name="restrict-service-external-ip"></a>

Kubernetes 서비스는 클러스터 내부에서 다음을 통해 연결할 수 있습니다.
+ Kubernetes가 자동으로 할당하는 클러스터 IP 주소
+ 서비스 사양에서 `externalIPs` 속성에 대해 지정하는 모든 IP 주소. 외부 IP 주소는 Kubernetes에서 관리하지 않으며 클러스터 관리자의 책임입니다. `externalIPs`로 지정된 외부 IP 주소는 클라우드 공급자가 지정하여 `LoadBalancer` 서비스 유형에 할당되는 외부 IP 주소와 다릅니다.

Kubernetes 서비스에 대한 자세한 내용은 Kubernetes 문서의 [서비스](https://kubernetes.io/docs/concepts/services-networking/service/)를 참조하세요. 서비스 사양에서 `externalIPs`에 대해 지정할 수 있는 IP 주소를 제한할 수 있습니다.

1. `cert-manager`를 배포하여 Webhook 인증서를 관리합니다. 자세한 내용은 [cert-manager](https://cert-manager.io/docs/) 문서를 참조하세요.

   ```
   kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
   ```

1. `cert-manager` 포드가 실행 중인지 확인하세요.

   ```
   kubectl get pods -n cert-manager
   ```

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

   ```
   NAME                                       READY   STATUS    RESTARTS   AGE
   cert-manager-58c8844bb8-nlx7q              1/1     Running   0          15s
   cert-manager-cainjector-745768f6ff-696h5   1/1     Running   0          15s
   cert-manager-webhook-67cc76975b-4v4nk      1/1     Running   0          14s
   ```

1. 기존 서비스를 검토하여 주소를 제한하려는 CIDR 블록 내에 포함되지 않은 외부 IP 주소가 할당되지 않았는지 확인합니다.

   ```
   kubectl get services -A
   ```

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

   ```
   NAMESPACE                      NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)         AGE
   cert-manager                   cert-manager                            ClusterIP      10.100.102.137   <none>          9402/TCP        20m
   cert-manager                   cert-manager-webhook                    ClusterIP      10.100.6.136     <none>          443/TCP         20m
   default                        kubernetes                              ClusterIP      10.100.0.1       <none>          443/TCP         2d1h
   externalip-validation-system   externalip-validation-webhook-service   ClusterIP      10.100.234.179   <none>          443/TCP         16s
   kube-system                    kube-dns                                ClusterIP      10.100.0.10      <none>          53/UDP,53/TCP   2d1h
   my-namespace                   my-service                              ClusterIP      10.100.128.10    192.168.1.1     80/TCP          149m
   ```

   값이 액세스를 제한하려는 블록 내에 있지 않은 IP 주소인 경우 블록 내에 포함되도록 주소를 변경하고 서비스를 다시 배포해야 합니다. 예를 들어, 이전 출력의 `my-service` 서비스에는 5단계에서 CIDR 블록 예제 내에 없는 외부 IP 주소가 할당되어 있습니다.

1. 외부 IP Webhook 매니페스트를 다운로드합니다. 또한 GitHub에서 [Webhook의 소스 코드](https://github.com/kubernetes-sigs/externalip-webhook)를 볼 수도 있습니다.

   ```
   curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/docs/externalip-webhook.yaml
   ```

1. CIDR 블록을 지정합니다. 편집기에서 다운로드한 파일을 열고 다음 행의 시작 부분에 있는 `\#`을 제거합니다.

   ```
   #args:
   #- --allowed-external-ip-cidrs=10.0.0.0/8
   ```

   `10.0.0.0/8`을 실제 CIDR 블록으로 바꿉니다. 원하는 만큼 블록을 지정할 수 있습니다. 여러 블록을 지정하는 경우 블록 사이에 쉼표를 추가합니다.

1. 클러스터가 `us-west-2` AWS 리전에 없는 경우 파일에서 `us-west-2`, `602401143452` 및 `amazonaws.com`를 다음 명령으로 바꿉니다. 명령을 실행하기 전에 *region-code* 및 *111122223333*을 [Amazon EKS 추가 기능용 Amazon 컨테이너 이미지 레지스트리 보기](add-ons-images.md)의 목록에서 AWS 리전 값으로 바꿉니다.

   ```
   sed -i.bak -e 's|602401143452|111122223333|' externalip-webhook.yaml
   sed -i.bak -e 's|us-west-2|region-code|' externalip-webhook.yaml
   sed -i.bak -e 's|amazonaws.com||' externalip-webhook.yaml
   ```

1. 매니페스트를 클러스터에 적용합니다.

   ```
   kubectl apply -f externalip-webhook.yaml
   ```

   CIDR 블록 지정 단계에서 지정한 블록에 포함되지 않은 `externalIPs`의 지정된 IP 주소를 통해 클러스터에 서비스를 배포하려고 시도할 경우 실패합니다.