서비스에 할당할 수 있는 외부 IP 주소 제한

서비스에 할당할 수 있는 외부 IP 주소 제한

Kubernetes 서비스는 클러스터 안에서 다음을 통해 도달할 수 있습니다.

  • Kubernetes가 자동으로 할당하는 클러스터 IP 주소
  • 서비스 사양의 externalIPs 속성에 지정하는 모든 IP 주소. 외부 IP 주소는 Kubernetes가 관리하지 않으며 클러스터 관리자의 책임입니다. externalIPs로 지정된 외부 IP 주소는 클라우드 공급자가 LoadBalancer 유형의 서비스에 할당하는 외부 IP 주소와 다릅니다.

Kubernetes 서비스에 대해 자세히 알아보려면 Kubernetes 문서의 Service를 참조하세요. 서비스 사양에서 externalIPs에 지정할 수 있는 IP 주소를 제한할 수 있습니다.

출처: 문서

본문

webhook 인증서를 관리하도록 cert-manager를 배포합니다. 자세한 내용은 cert-manager 문서를 참조하세요.

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

cert-manager Pod가 실행 중인지 확인합니다.

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

기존 서비스를 검토해 어떤 서비스에도 주소를 제한하려는 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             9402/TCP        20m
cert-manager                   cert-manager-webhook                    ClusterIP      10.100.6.136               443/TCP         20m
default                        kubernetes                              ClusterIP      10.100.0.1                 443/TCP         2d1h
externalip-validation-system   externalip-validation-webhook-service   ClusterIP      10.100.234.179             443/TCP         16s
kube-system                    kube-dns                                ClusterIP      10.100.0.10                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 주소가 할당되어 있습니다.

외부 IP webhook 매니페스트를 다운로드합니다. webhook의 소스 코드는 GitHub에서도 볼 수 있습니다.

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

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

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

10.0.0.0/8을 사용자의 CIDR 블록으로 바꿉니다. 원하는 만큼 많은 블록을 지정할 수 있습니다. 여러 블록을 지정하면 블록 사이에 쉼표를 추가합니다.

클러스터가 us-west-2 AWS 리전에 없으면 다음 명령으로 파일에서 us-west-2, 602401143452, amazonaws.com을 바꿉니다. 명령을 실행하기 전에 region-code와 111122223333을 Amazon EKS 추가 기능용 Amazon 컨테이너 이미지 레지스트리 보기의 목록에서 사용자 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

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

kubectl apply -f externalip-webhook.yaml

CIDR 블록 지정 단계에서 지정한 블록 안에 포함되지 않은 externalIPs에 지정된 IP 주소로 서비스를 클러스터에 배포하려 하면 실패합니다.

더 알아보기 (Learn more)