eks Elastic Load Balancer Kubernetes search exclude true Kubernetes AWS

Answer:
---
search:
  exclude: true
---

# Kubernetes 애플리케이션 및 AWS 로드밸런서를 통한 오류 및 타임아웃 방지

필요한 쿠버네티스 리소스 (서비스, 디플로이먼트, 인그레스 등) 를 생성한 후, 파드는 Elastic Load Balancer를 통해 클라이언트로부터 트래픽을 수신할 수 있어야 합니다. 하지만 애플리케이션 또는 Kubernetes 환경을 변경할 때 오류, 시간 초과 또는 연결 재설정이 생성될 수 있습니다. 이런 변경으로 인해 애플리케이션 배포 또는 조정 작업 (수동 또는 자동) 이 트리거될 수 있습니다.

안타깝게도 이런 오류는 애플리케이션이 문제를 기록하지 않는 경우에도 생성될 수 있습니다. 클러스터의 리소스를 제어하는 Kubernetes 시스템이 로드밸런서의 대상 등록 및 상태를 제어하는 AWS 시스템보다 빠르게 실행될 수 있기 때문입니다. 애플리케이션이 요청을 수신할 준비가 되기 전에 파드가 트래픽을 수신하기 시작할 수도 있습니다.

파드가 Ready 상태가 되는 프로세스와 트래픽을 파드로 라우팅하는 방법을 살펴보겠습니다.

## 파드 Readiness

[2019 Kubecon talk](https://www.youtube.com/watch?v=Vw9GmSeomFg)에서 발췌한 이 다이어그램은 파드가 레디 상태가 되고 '로드밸런서' 서비스에 대한 트래픽을 수신하기 위해 거쳐진 단계를 보여준다.
*[Ready? A Deep Dive into Pod Readiness Gates for Service Health... - Minhan Xia & Ping Zou](https://www.youtube.com/watch?v=Vw9GmSeomFg)*
NodePort 서비스의 멤버인 파드가 생성되면 쿠버네티스는 다음 단계를 거칩니다.

1. 파드는 쿠버네티스 컨트롤 플레인 (즉, `kubectl` 명령 또는 스케일링 액션으로부터) 에서 생성됩니다.
2. 파드는 `kube-scheduler`에 의해 스케줄링되며 클러스터의 노드에 할당됩니다.
3. 할당된 노드에서 실행 중인 kubelet은 업데이트를 수신하고 ('watch'를 통해) 로컬 컨테이너 런타임과 통신하여 파드에 지정된 컨테이너를 시작한다.
    1. 컨테이너가 실행을 시작하면 (그리고 선택적으로 `ReadinessProbes`만 전달하면), kubelet은 `kube-apiserver`로 업데이트를 전송하여 파드 상태를 `Ready`로 업데이트합니다.
4.  엔드포인트 컨트롤러는 ('watch'를 통해) 서비스의 엔드포인트 목록에 추가할 새 파드가 `Ready`라는 업데이트를 수신하고 적절한 엔드포인트 배열에 파드 IP/포트 튜플을 추가합니다.
5. `kube-proxy`는 서비스에 대한 iptables 규칙에 추가할 새 IP/포트가 있다는 업데이트 (`watch`를 통해) 를 수신한다.
    1. 워커 노드의 로컬 iptables 규칙이 NodePort 서비스의 추가 대상 파드로 업데이트됩니다.

!!! 참조
    인그레스 리소스와 인그레스 컨트롤러 (예: AWS 로드밸런서 컨트롤러) 를 사용하는 경우 5단계는 `kube-proxy` 대신 관련 컨트롤러에서 처리됩니다.그러면 컨트롤러는 필요한 구성 단계 (예: 로드밸런서에 대상 등록/등록 취소) 를 수행하여 트래픽이 예상대로 흐르도록 합니다.

[파드가 종료되거나](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination) 준비되지 않은 상태로 변경되는 경우에도 유사한 프로세스가 발생합니다. API 서버는 컨트롤러, kubelet 또는 kubectl 클라이언트로부터 업데이트를 수신하여 파드를 종료합니다. 3~5단계는 거기서부터 계속되지만, 엔드포인트 목록과 iptables 규칙에서 파드 IP/튜플을 삽입하는 대신 제거합니다.

### 배포에 미치는 영향

다음은 애플리케이션 배포로 인해 파드 교체가 트리거될 때 취해진 단계를 보여주는 다이어그램입니다:
*[Ready? A Deep Dive into Pod Readiness Gates for Service Health... - Minhan Xia & Ping Zou](https://www.youtube.com/watch?v=Vw9GmSeomFg)*
이 다이어그램에서 주목할 점은 첫 번째 파드가 "Ready" 상태에 도달할 때까지 두 번째 파드가 배포되지 않는다는 것입니다. 이전 섹션의 4단계와 5단계도 위의 배포 작업과 병행하여 수행됩니다.

즉, 디플로이먼트 컨트롤러가 다음 파드로 넘어갈 때 새 파드 상태를 전파하는 액션이 여전히 진행 중일 수 있습니다. 이 프로세스는 이전 버전의 파드도 종료하므로, 파드가 Ready 상태에 도달했지만 변경 사항이 계속 전파되고 이전 버전의 파드가 종료되는 상황이 발생할 수 있습니다.

위에서 설명한 Kubernetes 시스템은 기본적으로 로드밸런서의 등록 시간이나 상태 확인을 고려하지 않기 때문에 AWS와 같은 클라우드 공급자의 로드밸런서를 사용하면 이 문제가 더욱 악화됩니다. **즉 디플로이먼트 업데이트가 파드 전체에 걸쳐 완전히 순환될 수 있지만 로드밸런서가 상태 점검 수행 또는 새 파드 등록을 완료하지 않아 운영 중단이 발생할 수 있습니다.**

파드가 종료될 때도 비슷한 문제가 발생합니다. 로드밸런서 구성에 따라 파드의 등록을 취소하고 새 요청 수신을 중지하는 데 1~2분 정도 걸릴 수 있습니다. **쿠버네티스는 이런 등록 취소를 위해 롤링 디플로이먼트를 지연시키지 않으며, 이로 인해 로드밸런서가 이미 종료된 대상 파드의 IP/포트로 트래픽을 계속 보내는 상태로 이어질 수 있습니다.**

이런 문제를 방지하기 위해 Kubernetes 시스템이 AWS Load Balancer 동작에 더 부합하는 조치를 취하도록 구성을 추가할 수 있습니다.

## 권장 사항

### IP 대상 유형 로드밸런서 이용

`LoadBalancer` 유형의 서비스를 생성할 때, **인스턴스 대상 유형** 등록을 통해 로드밸런서에서 *클러스터의 모든 노드*로 트래픽이 전송됩니다. 그러면 각 노드가 'NodePort'의 트래픽을 서비스 엔드포인트 어레이의 파드/IP 튜플로 리디렉션합니다. 이 타겟은 별도의 워커 노드에서 실행될 수 있습니다.

!!! note
    배열에는 "Ready" 파드만 있어야 한다는 점을 기억하세요.

이렇게 하면 요청에 홉이 추가되고 로드밸런서 구성이 복잡해집니다.예를 들어 위의 로드밸런서가 세션 어피니티로 구성된 경우 어피니티는 어피니티 구성에 따라 로드밸런서와 백엔드 노드 사이에만 유지될 수 있습니다.

로드밸런서가 백엔드 파드와 직접 통신하지 않기 때문에 쿠버네티스 시스템으로 트래픽 흐름과 타이밍을 제어하기가 더 어려워집니다.

[AWS 로드밸런서 컨트롤러](https://github.com/kubernetes-sigs/aws-load-balancer-controller)를 사용하는 경우, **IP 대상 유형**을 사용하여 파드 IP/포트 튜플을 로드밸런서에 직접 등록할 수 있습니다.

이는 로드밸런서에서 대상 파드로의 트래픽 경로를 단순화 합니다. 즉 새 대상이 등록되면 대상이 "Ready" 파드 IP 및 포트인지 확인할 수 있고, 로드밸런서의 상태 확인이 파드에 직접 전달되며, VPC 흐름 로그를 검토하거나 유틸리티를 모니터링할 때 로드밸런서와 파드 간의 트래픽을 쉽게 추적할 수 있습니다.

또한 IP 등록을 사용하면 `NodePort` 규칙을 통해 연결을 관리하는 대신 백엔드 파드에 대한 트래픽의 타이밍과 구성을 직접 제어할 수 있습니다.

### 파드 Readiness 게이트 활용

[파드 Readiness 게이트](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-readiness-gate) 는 파드가 "Ready" 상태에 도달하기 전에 충족되어야 하는 추가 요구사항이다.

>[[...] AWS Load Balancer 컨트롤러는 인그레스 또는 서비스 백엔드를 구성하는 파드에 대한 준비 조건을 설정할 수 있습니다. ALB/NLB 대상 그룹의 해당 대상의 상태가 "Healthy"로 표시되는 경우에만 파드의 조건 상태가 'True'로 설정됩니다. 이렇게 하면 새로 생성된 파드가 ALB/NLB 대상 그룹에서 "정상"으로 되어 트래픽을 받을 준비가 될 때까지 디플로이먼트의 롤링 업데이트가 기존 파드를 종료하지 않도록 한다.](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/deploy/pod_readiness_gate/)

Readiness 게이트는 배포 중에 새 복제본을 생성할 때 쿠버네티스가 "너무 빨리" 움직이지 않도록 하고 쿠버네티스는 배포를 완료했지만 새 파드가 등록을 완료하지 않은 상황을 방지합니다.

이를 활성화하려면 다음을 수행해야 합니다.

1. 최신 버전의 [AWS 로드밸런서 컨트롤](https://github.com/kubernetes-sigs/aws-load-balancer-controller)를 배포합니다. (**[*이전 버전을 업그레이드하는 경우 설명서를 참조*](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/deploy/upgrade/migrate_v1_v2/)**)
2. 파드 Readiness 게이트를 자동으로 주입하려면 `elbv2.k8s.aws/pod-readiness-gate-inject: enabled` 레이블로 [타겟 파드가 실행 중인 네임스페이스에 레이블을 붙입니다.](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/deploy/pod_readiness_gate/).
3. 네임스페이스의 모든 파드가 준비 게이트 컨피그레이션을 가져오도록 하려면 인그레스 또는 서비스를 생성하고 파드를 생성하기 ***전에*** 네임스페이스에 레이블을 지정해야 한다.

### 종료*전*에 로드밸런서에서 파드의 등록이 취소되었는지 확인

When a pod is terminated steps 4 and 5 from the pod readiness section occur at the same time that the container processes receive the termination signals. This means that if your container is able to shut down quickly it may shut down faster than the Load Balancer is able to deregister the target. To avoid this situation adjust the Pod spec with:

1. 애플리케이션이 등록을 취소하고 연결을 정상적으로 종료할 수 있도록 'PreStop' 라이프사이클 훅을 추가합니다. 이 훅은 API 요청 또는 관리 이벤트 (예: 라이브니스/스타트업 프로브 실패, 선점, 리소스 경합 등) 로 인해 컨테이너가 종료되기 직전에 호출됩니다. 중요한 점은 [이 훅이 호출되어 종료 신호가 전송되기 **전에** 완료되도록 허용됨](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination) 입니다. 단, 유예 기간이 실행을 수용할 수 있을 만큼 충분히 길어야 합니다.

```
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "sleep 180"]
```
위와 같은 간단한 sleep 명령을 사용하면 파드가 `Terminating (종료 중)`으로 표시된 시점 (그리고 로드밸런서 등록 취소가 시작되는 시점) 과 종료 신호가 컨테이너 프로세스로 전송되는 시점 사이에 짧은 지연을 발생시킬 수 있다.필요한 경우 이 훅를 고급 애플리케이션 종료/종료 절차에도 활용할 수 있습니다.

2. 전체 `프리스톱` 실행 시간과 애플리케이션이 종료 신호에 정상적으로 응답하는 데 걸리는 시간을 수용할 수 있도록 'TerminationGracePeriodsSeconds'를 연장하십시오.아래 예시에서는 유예 기간을 200초로 연장하여 전체 `sleep 180` 명령을 완료한 다음, 앱이 정상적으로 종료될 수 있도록 20초 더 연장했습니다.

```
    spec:
      terminationGracePeriodSeconds: 200
      containers:
      - name: webapp
        image: webapp-st:v1.3
        [...]
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "sleep 180"]
```

### 파드에 Readiness 프로브가 있는지 확인

쿠버네티스에서 파드를 생성할 때 기본 준비 상태는 "Ready"이지만, 대부분의 애플리케이션은 인스턴스화하고 요청을 받을 준비가 되는 데 1~2분 정도 걸립니다. [파드 스펙에서 'Readiness 프로브'를 정의할 수 있습니다.](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) 실행 명령어 또는 네트워크 요청을 사용하여 애플리케이션이 시작을 완료하고 트래픽을 처리할 준비가 되었는지 확인하는 데 사용됩니다.

`Readiness 프로브`로 정의된 파드는 "NotReady" 상태에서 시작하며, `Readiness 프로브`가 성공했을 때만 "준비 완료"로 변경됩니다. 이렇게 하면 애플리케이션 시작이 완료될 때까지 애플리케이션이 "서비스 중"으로 전환되지 않습니다.

장애 상태 (예: 교착 상태) 에 들어갈 때 애플리케이션을 다시 시작할 수 있도록 라이브니스 프로브를 사용하는 것이 좋지만, 활성 장애가 발생하면 애플리케이션 재시작을 트리거하므로 Stateful 애플리케이션을 사용할 때는 주의해야 합니다. 시작 속도가 느린 애플리케이션에도 [스타트업 프로브](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-startup-probes)를 활용할 수 있습니다.

아래 프로브는 포트 80에 대한 HTTP 프로브를 사용하여 웹 애플리케이션이 언제 준비되는지 확인합니다 (활성 프로브에도 동일한 프로브 구성이 사용됨).

```
        [...]
        ports:
        - containerPort: 80
        livenessProbe:
          httpGet:
            path: /
            port: 80
          failureThreshold: 1
          periodSeconds: 10
          initialDelaySeconds: 5
        readinessProbe:
          httpGet:
            path: /
            port: 80
          periodSeconds: 5
        [...]
```

### 파드 중단 예산 (PDB) 설정

[파드 중단 예산 (PDB)](https://kubernetes.io/docs/concepts/workloads/pods/disruptions/#pod-disruption-budgets)은 복제된 애플리케이션 중 [자발적 중단](https://kubernetes.io/docs/concepts/workloads/pods/disruptions/#voluntary-and-involuntary-disruptions)으로 인해 동시에 다운되는 파드의 수를 제한합니다. 예를 들어 쿼럼 기반 응용 프로그램에서는 실행 중인 복제본 수가 쿼럼에 필요한 수 이하로 떨어지지 않도록 하려는 경우가 있습니다. 웹 프런트 엔드는 부하를 처리하는 복제본의 수가 전체 복제본의 특정 비율 이하로 떨어지지 않도록 해야 할 수 있습니다.

PDB는 노드 드레이닝 또는 애플리케이션 배포와 같은 것으로부터 애플리케이션을 보호합니다. PDB는 이런 조치를 취하는 동안 사용할 수 있는 파드의 수 또는 비율을 최소한으로 유지합니다.

!!! caution
    PDB는 호스트 OS 장애 또는 네트워크 연결 손실과 같은 비자발적 중단으로부터 애플리케이션을 보호하지 않습니다.

아래 예시는 `app: echoserver` 레이블이 붙은 파드를 항상 1개 이상 사용할 수 있도록 만듭니다. [애플리케이션에 맞는 올바른 레플리카 수를 구성하거나 백분율을 사용할 수 있습니다.](https://kubernetes.io/docs/tasks/run-application/configure-pdb/#think-about-how-your-application-reacts-to-disruptions):

```
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: echoserver-pdb
  namespace: echoserver
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: echoserver
```

### 종료 신호를 정상적으로 처리

파드가 종료되면 컨테이너 내에서 실행되는 애플리케이션은 두 개의 [Signal](https://www.gnu.org/software/libc/manual/html_node/Standard-Signals.html)을 수신합니다. 첫 번째는 [`SIGTERM` 신호](https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html)이며, 이는 프로세스 실행을 중단하라는 "정중한" 요청입니다. 이 신호는 차단될 수도 있고 애플리케이션이 단순히 이 신호를 무시할 수도 있으므로, `terminationGracePeriodSeconds`이 경과하면 애플리케이션은 [`SIGKILL` 신호](https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html)를 받게 됩니다. `SIGKILL`은 프로세스를 강제로 중지하는 데 사용되며, [차단, 처리 또는 무시](https://man7.org/linux/man-pages/man7/signal.7.html) 될 수 없으므로 항상 치명적입니다.

이런 신호는 컨테이너 런타임에서 애플리케이션 종료를 트리거하는 데 사용됩니다.또한 `SIGTERM` 신호는 `preStop` 훅이 실행된 후에 전송됩니다. 위 구성에서 `preStop` 훅은 로드밸런서에서 파드의 등록이 취소되었는지 확인하므로 애플리케이션은 `SIGTERM` 신호가 수신될 때 열려 있는 나머지 연결을 정상적으로 종료할 수 있습니다.

!!! 참조
    [애플리케이션의 진입점에 "래퍼 스크립트"를 사용할 경우 컨테이너 환경에서의 신호 처리는 복잡할 수 있습니다.](https://petermalmgren.com/signal-handling-docker/) 스크립트는 PID 1이므로 신호를 애플리케이션으로 전달하지 않을 수 있습니다.

### 등록 취소 지연에 주의

Elastic Load Balancing은 등록 취소 중인 대상에 대한 요청 전송을 중지합니다.기본적으로 Elastic Load Balancing은 등록 취소 프로세스를 완료하기 전에 300초 정도 대기하므로 대상에 대한 진행 중인 요청을 완료하는 데 도움이 될 수 있습니다. Elastic Load Balancing이 대기하는 시간을 변경하려면 등록 취소 지연 값을 업데이트하십시오.
등록 취소 대상의 초기 상태는 `draining`입니다. 등록 취소 지연이 경과하면 등록 취소 프로세스가 완료되고 대상의 상태는 `unused`가 됩니다. 대상이 Auto Scaling 그룹의 일부인 경우 대상을 종료하고 교체할 수 있습니다.

등록 취소 대상에 진행 중인 요청이 없고 활성 연결이 없는 경우 Elastic Load Balancing은 등록 취소 지연이 경과할 때까지 기다리지 않고 등록 취소 프로세스를 즉시 완료합니다.

!!! caution
    대상 등록 취소가 완료되더라도 등록 취소 지연 제한 시간이 만료될 때까지 대상 상태가 '드레이닝 중'으로 표시됩니다. 제한 시간이 만료되면 대상은 '미사용' 상태로 전환됩니다.

[등록 취소 지연이 경과하기 전에 등록 취소 대상이 연결을 종료하면 클라이언트는 500레벨 오류 응답을 받습니다.](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html#deregistration-delay).

이는 [`alb.ingress.kubernetes.io/target-group-attributes` 어노테이션](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/ingress/annotations/#target-group-attributes)을 사용하여 인그레스 리소스의 어노테이션을 사용하여 구성할 수 있습니다. 아래는 예제입니다.

```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: echoserver-ip
  namespace: echoserver
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/load-balancer-name: echoserver-ip
    alb.ingress.kubernetes.io/target-group-attributes: deregistration_delay.timeout_seconds=30
spec:
  ingressClassName: alb
  rules:
    - host: echoserver.example.com
      http:
        paths:
          - path: /
            pathType: Exact
            backend:
              service:
                name: echoserver-service
                port:
                  number: 8080
```

search    exclude  true         Kubernetes          AWS                                                                          Elastic Load Balancer                                                Kubernetes                                                                                Kubernetes                              AWS                                                                                Ready                                                 Readiness   2019 Kubecon talk  https   www youtube com watch v Vw9GmSeomFg                                                                            Ready  A Deep Dive into Pod Readiness Gates for Service Health      Minhan Xia   Ping Zou  https   www youtube com watch v Vw9GmSeomFg     NodePort                                        1                         kubectl                               2       kube scheduler                              3                 kubelet               watch                                                 1                             ReadinessProbes          kubelet   kube apiserver                      Ready            4                 watch                                 Ready                                IP               5   kube proxy           iptables           IP                watch                   1            iptables     NodePort                                                             AWS                       5     kube proxy                                                                                https   kubernetes io docs concepts workloads pods pod lifecycle  pod termination                                         API           kubelet    kubectl                                3 5                           iptables         IP                                                                                Ready  A Deep Dive into Pod Readiness Gates for Service Health      Minhan Xia   Ping Zou  https   www youtube com watch v Vw9GmSeomFg                                Ready                                              4    5                                                                                Ready                                                                   Kubernetes                                              AWS                                                                                1 2                                                                                IP                                                   Kubernetes      AWS Load Balancer                                                    IP                  LoadBalancer                                                                                NodePort                          IP                                                 note           Ready                                                                                AWS             https   github com kubernetes sigs aws load balancer controller              IP                  IP                                                                                Ready     IP                                             VPC                                                                 IP           NodePort                                                                     Readiness             Readiness      https   kubernetes io docs concepts workloads pods pod lifecycle  pod readiness gate         Ready                                            AWS Load Balancer                                                       ALB NLB                    Healthy                         True                            ALB NLB                                                                           https   kubernetes sigs github io aws load balancer controller v2 4 deploy pod readiness gate    Readiness                                                                                1          AWS            https   github com kubernetes sigs aws load balancer controller                                           https   kubernetes sigs github io aws load balancer controller v2 4 deploy upgrade migrate v1 v2      2     Readiness                  elbv2 k8s aws pod readiness gate inject  enabled                                         https   kubernetes sigs github io aws load balancer controller v2 4 deploy pod readiness gate    3                                                                                When a pod is terminated steps 4 and 5 from the pod readiness section occur at the same time that the container processes receive the termination signals  This means that if your container is able to shut down quickly it may shut down faster than the Load Balancer is able to deregister the target  To avoid this situation adjust the Pod spec with   1                                        PreStop                        API                                                                                https   kubernetes io docs concepts workloads pods pod lifecycle  pod termination                                                           lifecycle            preStop              exec                command     bin sh     c    sleep 180                  sleep               Terminating                                                                                2                                                                  TerminationGracePeriodsSeconds                          200            sleep 180                                 20                     spec        terminationGracePeriodSeconds  200       containers          name  webapp         image  webapp st v1 3                       lifecycle            preStop              exec                command     bin sh     c    sleep 180                 Readiness                                           Ready                                           1 2                     Readiness                    https   kubernetes io docs tasks configure pod container configure liveness readiness startup probes                                                                              Readiness                NotReady              Readiness                                                                                Stateful                                                        https   kubernetes io docs tasks configure pod container configure liveness readiness startup probes  define startup probes                           80     HTTP                                                                                ports            containerPort  80         livenessProbe            httpGet              path                port  80           failureThreshold  1           periodSeconds  10           initialDelaySeconds  5         readinessProbe            httpGet              path                port  80           periodSeconds  5                                  PDB                 PDB   https   kubernetes io docs concepts workloads pods disruptions  pod disruption budgets                         https   kubernetes io docs concepts workloads pods disruptions  voluntary and involuntary disruptions                                                                                PDB                                                PDB                                                        caution     PDB      OS                                                              app  echoserver                 1                                                                     https   kubernetes io docs tasks run application configure pdb  think about how your application reacts to disruptions        apiVersion  policy v1beta1 kind  PodDisruptionBudget metadata    name  echoserver pdb   namespace  echoserver spec    minAvailable  1   selector      matchLabels        app  echoserver                                                                Signal  https   www gnu org software libc manual html node Standard Signals html                  SIGTERM      https   www gnu org software libc manual html node Termination Signals html                                                                                terminationGracePeriodSeconds                  SIGKILL      https   www gnu org software libc manual html node Termination Signals html            SIGKILL                                         https   man7 org linux man pages man7 signal 7 html                                                                      SIGTERM       preStop                           preStop                                           SIGTERM                                                                                https   petermalmgren com signal handling docker         PID 1                                                     Elastic Load Balancing                                     Elastic Load Balancing                      300                                                 Elastic Load Balancing                                                         draining                                               unused            Auto Scaling                                                                      Elastic Load Balancing                                                       caution                                                                                500                 https   docs aws amazon com elasticloadbalancing latest application load balancer target groups html deregistration delay         alb ingress kubernetes io target group attributes         https   kubernetes sigs github io aws load balancer controller v2 4 guide ingress annotations  target group attributes                                                          apiVersion  networking k8s io v1 kind  Ingress metadata    name  echoserver ip   namespace  echoserver   annotations      alb ingress kubernetes io scheme  internet facing     alb ingress kubernetes io target type  ip     alb ingress kubernetes io load balancer name  echoserver ip     alb ingress kubernetes io target group attributes  deregistration delay timeout seconds 30 spec    ingressClassName  alb   rules        host  echoserver example com       http          paths              path                pathType  Exact             backend                service                  name  echoserver service                 port                    number  8080


eks exclude true search Amazon VPC CNI IP ENI CIDR

Answer:
---
search:
  exclude: true
---

# 사용자 지정 네트워킹

기본적으로 Amazon VPC CNI는 기본 서브넷에서 선택한 IP 주소를 파드에 할당합니다. 기본 서브넷은 기본 ENI가 연결된 서브넷 CIDR이며, 일반적으로 노드/호스트의 서브넷입니다.

서브넷 CIDR이 너무 작으면 CNI가 파드에 할당하기에 충분한 보조 IP 주소를 확보하지 못할 수 있습니다. 이는 EKS IPv4 클러스터의 일반적인 문제입니다.

사용자 지정 네트워킹은 이 문제에 대한 한 가지 해결책입니다.

사용자 지정 네트워킹은 보조 VPC 주소 공간 (CIDR) 에서 노드 및 파드 IP를 할당하여 IP 고갈 문제를 해결합니다. 사용자 지정 네트워킹 지원은 Eniconfig 사용자 지정 리소스를 지원합니다. ENIConfig에는 파드가 속하게 될 보안 그룹과 함께 대체 서브넷 CIDR 범위 (보조 VPC CIDR에서 파밍) 가 포함되어 있습니다. 사용자 지정 네트워킹이 활성화되면 VPC CNI는 eniconfig에 정의된 서브넷에 보조 ENI를 생성합니다. CNI는 ENIConfig CRD에 정의된 CIDR 범위의 IP 주소를 파드에 할당합니다.

사용자 지정 네트워킹에서는 기본 ENI를 사용하지 않으므로, 노드에서 실행할 수 있는 최대 파드 수는 더 적다. 호스트 네트워크 파드는 기본 ENI에 할당된 IP 주소를 계속 사용합니다. 또한 기본 ENI는 소스 네트워크 변환을 처리하고 파드 트래픽을 노드 외부로 라우팅하는 데 사용됩니다.

## 예제 구성

사용자 지정 네트워킹은 보조 CIDR 범위에 유효한 VPC 범위를 허용하지만 CG-NAT 공간 (예: 100.64.0.0/10 또는 198.19.0.0/16) 의 CIDR (/16) 은 다른 RFC1918 범위보다 기업 환경에서 사용될 가능성이 적기 때문에 사용하는 것이 좋습니다. VPC에서 사용할 수 있는 허용 및 제한된 CIDR 블록 연결에 대한 자세한 내용은 VPC 설명서의 VPC 및 서브넷 크기 조정 섹션에서 [IPv4 CIDR 블록 연결 제한](https://docs.aws.amazon.com/vpc/latest/userguide/configure-your-vpc.html#add-cidr-block-restrictions)을 참조하십시오.

아래 다이어그램에서 볼 수 있듯이 워커 노드의 기본 엘라스틱 네트워크 인터페이스 ([ENI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html)) 는 여전히 기본 VPC CIDR 범위 (이 경우 10.0.0.0/16) 를 사용하지만 보조 ENI는 보조 VPC CIDR 범위 (이 경우 100.64.0.0/16) 를 사용합니다. 이제 파드가 100.64.0.0/16 CIDR 범위를 사용하도록 하려면 사용자 지정 네트워킹을 사용하도록 CNI 플러그인을 구성해야 합니다. [여기](https://docs.aws.amazon.com/eks/latest/userguide/cni-custom-network.html)에 설명된 대로 단계를 수행하면 됩니다.

![illustration of pods on secondary subnet](./image.png)

CNI에서 사용자 지정 네트워킹을 사용하도록 하려면 `AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG` 환경 변수를 `true`로 설정하십시오.

```
kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
```

`AWS_VPC_K8S_CNI_CUSTOM_Network_CFG=true`인 경우, CNI는 `ENIConfig`에 정의된 서브넷의 파드 IP 주소를 할당한다. `ENIConfig` 사용자 지정 리소스는 파드가 스케줄링될 서브넷을 정의하는 데 사용됩니다.

```
apiVersion : crd.k8s.amazonaws.com/v1alpha1
kind : ENIConfig
metadata:
  name: us-west-2a
spec:
  securityGroups:
    - sg-0dff111a1d11c1c11
  subnet: subnet-011b111c1f11fdf11
```

`ENIconfig` 사용자 지정 리소스를 생성할 때 새 워커 노드를 생성하고 기존 노드를 비워야 합니다. 기존 워커 노드와 파드는 영향을 받지 않습니다.

## 권장 사항

### 사용자 지정 네트워킹 이용을 권장하는 경우

IPv4가 고갈되고 있고 아직 IPv6를 사용할 수 없는 경우 사용자 지정 네트워킹을 고려하는 것이 좋습니다. Amazon EKS는 [RFC6598](https://datatracker.ietf.org/doc/html/rfc6598) 공간을 지원하므로 [RFC1918](https://datatracker.ietf.org/doc/html/rfc1918) 문제 소모 문제 이상으로 파드를 확장할 수 있습니다.사용자 지정 네트워킹과 함께 Prefix 위임을 사용하여 노드의 파드 밀도를 높이는 것을 고려해 보십시오.

보안 그룹 요구 사항이 다른 다른 네트워크에서 Pod를 실행해야 하는 보안 요구 사항이 있는 경우 사용자 지정 네트워킹을 고려할 수 있습니다. 사용자 지정 네트워킹이 활성화되면 파드는 Eniconfig에 정의된 대로 노드의 기본 네트워크 인터페이스와 다른 서브넷 또는 보안 그룹을 사용합니다.

사용자 지정 네트워킹은 여러 EKS 클러스터 및 애플리케이션을 배포하여 온프레미스 데이터 센터 서비스를 연결하는 데 가장 적합한 옵션입니다. Amazon Elastic Load Balancing 및 NAT-GW와 같은 서비스를 위해 VPC에서 EKS로 액세스할 수 있는 프라이빗 주소 (RFC1918) 의 수를 늘리는 동시에 여러 클러스터에서 파드에 라우팅할 수 없는 CG-NAT 공간을 사용할 수 있습니다. [트랜짓 게이트웨이](https://aws.amazon.com/transit-gateway/) 및 공유 서비스 VPC (고가용성을 위한 여러 가용영역에 걸친 NAT 게이트웨이 포함) 를 사용한 사용자 지정 네트워킹을 통해 확장 가능하고 예측 가능한 트래픽 흐름을 제공할 수 있습니다. 이 [블로그 게시물](https://aws.amazon.com/blogs/containers/eks-vpc-routable-ip-address-conservation/) 에서는 사용자 지정 네트워킹을 사용하여 EKS Pod를 데이터 센터 네트워크에 연결하는 데 가장 권장되는 방법 중 하나인 아키텍처 패턴을 설명합니다.

### 사용자 지정 네트워킹 이용을 권장하지 않는 경우

#### IPv6 구현 준비 완료

사용자 지정 네트워킹은 IP 고갈 문제를 완화할 수 있지만 추가 운영 오버헤드가 필요합니다. 현재 이중 스택 (IPv4/IPv6) VPC를 배포 중이거나 계획에 IPv6 지원이 포함된 경우 IPv6 클러스터를 대신 구현하는 것이 좋습니다. IPv6 EKS 클러스터를 설정하고 앱을 마이그레이션할 수 있습니다. IPv6 EKS 클러스터에서는 쿠버네티스와 파드 모두 IPv6 주소를 얻고 IPv4 및 IPv6 엔드포인트 모두와 송수신할 수 있습니다. [IPv6 EKS 클러스터 실행](../ipv6/index.md)에 대한 모범 사례를 검토하십시오.

#### 고갈된 CG-NAT 공간

또한 현재 CG-NAT 공간의 CIDR을 사용하고 있거나 보조 CIDR을 클러스터 VPC와 연결할 수 없는 경우 대체 CNI 사용과 같은 다른 옵션을 탐색해야 할 수도 있습니다. 상용 지원을 받거나 사내 지식을 보유하여 오픈소스 CNI 플러그인 프로젝트를 디버깅하고 패치를 제출하는 것이 좋습니다. 자세한 내용은 [대체 CNI 플러그인](https://docs.aws.amazon.com/eks/latest/userguide/alternate-cni-plugins.html) 사용 설명서를 참조하십시오.

#### 프라이빗 NAT 게이트웨이 사용

Amazon VPC는 이제 [프라이빗 NAT 게이트웨이](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) 기능을 제공합니다. Amazon의 프라이빗 NAT 게이트웨이를 사용하면 프라이빗 서브넷의 인스턴스를 CIDR이 겹치는 다른 VPC 및 온프레미스 네트워크에 연결할 수 있습니다. 이 [블로그 게시물](https://aws.amazon.com/blogs/containers/addressing-ipv4-address-exhaustion-in-amazon-eks-clusters-using-private-nat-gateways/)에 설명된 방법을 활용하여 프라이빗 NAT 게이트웨이를 사용하여 CIDR 중복으로 인한 EKS 워크로드의 통신 문제를 해결하는 것을 고려해 보십시오. 이는 고객이 제기한 중대한 불만 사항입니다. 맞춤형 네트워킹만으로는 중복되는 CIDR 문제를 해결할 수 없으며 구성 문제가 가중됩니다.

이 블로그 게시물 구현에 사용된 네트워크 아키텍처는 Amazon VPC 설명서의 [중복 네트워크 간 통신 활성화](https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-scenarios.html#private-nat-overlapping-networks)에 있는 권장 사항을 따릅니다. 이 블로그 게시물에서 설명한 것처럼 프라이빗 NAT 게이트웨이를 RFC6598 주소와 함께 사용하여 고객의 프라이빗 IP 고갈 문제를 관리할 수 있는 방법을 모색할 수 있습니다. EKS 클러스터, 워커 노드는 라우팅이 불가능한 100.64.0.0/16 VPC 보조 CIDR 범위에 배포되는 반면, 사설 NAT 게이트웨이인 NAT 게이트웨이는 라우팅 가능한 RFC1918 CIDR 범위에 배포됩니다. 이 블로그에서는 라우팅이 불가능한 CIDR 범위가 겹치는 VPC 간의 통신을 용이하게 하기 위해 트랜짓 게이트웨이를 사용하여 VPC를 연결하는 방법을 설명합니다. VPC의 라우팅 불가능한 주소 범위에 있는 EKS 리소스가 주소 범위가 겹치지 않는 다른 VPC와 통신해야 하는 사용 사례의 경우 고객은 VPC 피어링을 사용하여 이런 VPC를 상호 연결할 수 있습니다. 이제 VPC 피어링 연결을 통한 가용영역 내의 모든 데이터 전송이 무료이므로 이 방법을 사용하면 비용을 절감할 수 있습니다.

![illustration of network traffic using private NAT gateway](./image-3.png)

#### 노드 및 파드를 위한 고유한 네트워크

보안상의 이유로 노드와 파드를 특정 네트워크로 격리해야 하는 경우, 더 큰 보조 CIDR 블록 (예: 100.64.0.0/8) 의 서브넷에 노드와 파드를 배포하는 것이 좋습니다. VPC에 새 CIDR을 설치한 후에는 보조 CIDR을 사용하여 다른 노드 그룹을 배포하고 원래 노드를 드레인하여 파드를 새 워커 노드에 자동으로 재배포할 수 있습니다. 이를 구현하는 방법에 대한 자세한 내용은 이 [블로그](https://aws.amazon.com/blogs/containers/optimize-ip-addresses-usage-by-pods-in-your-amazon-eks-cluster/) 게시물을 참조하십시오.

아래 다이어그램에 표시된 설정에서는 사용자 지정 네트워킹이 사용되지 않습니다. 대신 쿠버네티스 워커 노드는 VPC의 보조 VPC CIDR 범위 (예: 100.64.0.0/10) 에 속하는 서브넷에 배포됩니다. EKS 클러스터를 계속 실행할 수 있지만 (컨트롤 플레인은 원래 서브넷에 유지됨), 노드와 파드는 보조 서브넷으로 이동합니다. 이는 VPC에서 IP 고갈의 위험을 완화하기 위한 흔하지는 않지만 또 다른 기법입니다.새 워커 노드에 파드를 재배포하기 전에 기존 노드를 비우는 것이 좋습니다.

![illustration of worker nodes on secondary subnet](./image-2.png)

### 가용영역 레이블을 사용한 구성 자동화

Kubernetes를 활성화하여 워커 노드 가용영역 (AZ) 에 해당하는 eniConfig를 자동으로 적용할 수 있습니다.

쿠버네티스는 워커 노드에 [`topology.kubernetes.io/zone`](http://topology.kubernetes.io/zone) 태그를 자동으로 추가합니다. Amazon EKS는 AZ당 보조 서브넷 (대체 CIDR) 이 하나뿐인 경우 가용영역을 ENI 구성 이름으로 사용할 것을 권장합니다. 참고로 `failure-domain.beta.kubernetes.io/zone` 태그는 더 이상 사용되지 않으며 `topology.kubernetes.io/zone` 태그로 대체되었습니다.

1. `name` 필드를 VPC의 가용영역으로 설정합니다.
2. 다음 명령을 사용하여 자동 구성을 활성화합니다.

```
kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
```

가용영역당 보조 서브넷이 여러 개 있는 경우, 특정 `ENI_CONFIG_LABEL_DEF`를 생성해야 합니다. `ENI_CONFIG_LABEL_DEF`를 [`k8s.amazonaws.com/eniConfig`](http://k8s.amazonaws.com/eniConfig)로 구성하고 [`k8s.amazonaws.com/eniConfig=us-west-2a-subnet-1`](http://k8s.amazonaws.com/eniConfig=us-west-2a-subnet-1) 및 [`k8s.amazonaws.com/eniConfig=us-west-2a-subnet-2`](http://k8s.amazonaws.com/eniConfig=us-west-2a-subnet-2) 같은 사용자 정의 eniConfig 이름으로 노드를 레이블링하는 것을 고려할 수 있습니다.

### 보조 네트워킹 구성 시 파드 교체

사용자 지정 네트워킹을 활성화해도 기존 노드는 수정되지 않습니다. 맞춤형 네트워킹은 파괴적인 조치입니다. 사용자 지정 네트워킹을 활성화한 후 클러스터의 모든 워커 노드를 순차적으로 교체하는 대신, 워커 노드가 프로비저닝되기 전에 사용자 지정 네트워킹이 가능하도록 Lambda 함수를 호출하는 사용자 지정 리소스로 [EKS 시작 안내서](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)의 AWS CloudFormation 템플릿을 업데이트하여 환경 변수로 `aws-node` 데몬셋을 업데이트하는 것이 좋습니다.

사용자 지정 CNI 네트워킹 기능으로 전환하기 전에 클러스터에 파드를 실행하는 노드가 있는 경우, 파드를 차단하고 [드레이닝](https://aws.amazon.com/premiumsupport/knowledge-center/eks-worker-node-actions/) 하여 파드를 정상적으로 종료한 다음 노드를 종료해야 합니다. ENIConfig 레이블 또는 주석과 일치하는 새 노드만 사용자 지정 네트워킹을 사용하므로 이런 새 노드에 스케줄링된 파드에는 보조 CIDR의 IP를 할당받을 수 있습니다.

### 노드당 최대 파드 수 계산

노드의 기본 ENI는 더 이상 Pod IP 주소를 할당하는 데 사용되지 않으므로 특정 EC2 인스턴스 유형에서 실행할 수 있는 Pod 수가 감소합니다. 이 제한을 우회하기 위해 사용자 지정 네트워킹과 함께 Prefix 할당을 사용할 수 있습니다. Prefix를 할당하면 보조 ENI에서 각 보조 IP가 /28 Prefix로 대체됩니다.

사용자 지정 네트워킹이 있는 m5.large 인스턴스의 최대 파드 수를 고려해봅시다.

Prefix를 할당하지 않고 실행할 수 있는 최대 파드 수는 29개입니다.

* ((3 ENIs - 1) * (10 secondary IPs per ENI - 1)) + 2 = 20

프리픽스 어태치먼트를 활성화하면 파드의 수가 290개로 늘어납니다.

* (((3 ENIs - 1) * ((10 secondary IPs per ENI - 1) * 16)) + 2 = 290

하지만 인스턴스의 가상 CPU 수가 매우 적기 때문에 max-pod를 290이 아닌 110으로 설정하는 것이 좋습니다. 더 큰 인스턴스의 경우 EKS는 최대 파드 값을 250으로 설정할 것을 권장합니다. 더 작은 인스턴스 유형 (예: m5.large) 에 Prefix 첨부 파일을 사용할 경우 IP 주소보다 훨씬 먼저 인스턴스의 CPU 및 메모리 리소스가 고갈될 수 있습니다.

!!! info
    CNI Prefix가 ENI에 /28 Prefix를 할당할 때는 연속된 IP 주소 블록이어야 합니다. Prefix가 생성되는 서브넷이 고도로 분할된 경우 Prefix 연결에 실패할 수 있습니다. 클러스터용 전용 VPC를 새로 만들거나 서브넷에 Prefix 첨부 전용으로 CIDR 세트를 예약하여 이런 문제가 발생하지 않도록 할 수 있습니다. 이 주제에 대한 자세한 내용은 [서브넷 CIDR 예약](https://docs.aws.amazon.com/vpc/latest/userguide/subnet-cidr-reservation.html)을 참조하십시오.

### CG-NAT 공간의 기존 사용 현황 파악

사용자 지정 네트워킹을 사용하면 IP 소모 문제를 완화할 수 있지만 모든 문제를 해결할 수는 없습니다. 클러스터에 이미 CG-NAT 공간을 사용하고 있거나 단순히 보조 CIDR을 클러스터 VPC에 연결할 수 없는 경우에는 대체 CNI를 사용하거나 IPv6 클러스터로 이동하는 등의 다른 옵션을 살펴보는 것이 좋습니다.

search    exclude  true                            Amazon VPC CNI               IP                           ENI          CIDR                               CIDR         CNI                   IP                        EKS IPv4                                                                        VPC        CIDR             IP       IP                               Eniconfig                    ENIConfig                              CIDR        VPC CIDR                                       VPC CNI  eniconfig              ENI         CNI  ENIConfig CRD      CIDR     IP                                   ENI                                                          ENI      IP                     ENI                                                                            CIDR         VPC           CG NAT        100 64 0 0 10    198 19 0 0 16    CIDR   16       RFC1918                                            VPC                     CIDR                   VPC      VPC                   IPv4 CIDR           https   docs aws amazon com vpc latest userguide configure your vpc html add cidr block restrictions                                                           ENI  https   docs aws amazon com AWSEC2 latest UserGuide using eni html            VPC CIDR          10 0 0 0 16             ENI     VPC CIDR          100 64 0 0 16                  100 64 0 0 16 CIDR                                  CNI                      https   docs aws amazon com eks latest userguide cni custom network html                           illustration of pods on secondary subnet    image png   CNI                           AWS VPC K8S CNI CUSTOM NETWORK CFG          true                kubectl set env daemonset aws node  n kube system AWS VPC K8S CNI CUSTOM NETWORK CFG true        AWS VPC K8S CNI CUSTOM Network CFG true       CNI   ENIConfig               IP            ENIConfig                                                apiVersion   crd k8s amazonaws com v1alpha1 kind   ENIConfig metadata    name  us west 2a spec     securityGroups        sg 0dff111a1d11c1c11   subnet  subnet 011b111c1f11fdf11       ENIconfig                                                                                IPv4             IPv6                                         Amazon EKS   RFC6598  https   datatracker ietf org doc html rfc6598             RFC1918  https   datatracker ietf org doc html rfc1918                                               Prefix                                                                 Pod                                                                          Eniconfig                                                                     EKS                                                            Amazon Elastic Load Balancing   NAT GW             VPC   EKS                     RFC1918                                       CG NAT                             https   aws amazon com transit gateway            VPC                       NAT                                                                                https   aws amazon com blogs containers eks vpc routable ip address conservation                         EKS Pod                                                                                IPv6                        IP                                               IPv4 IPv6  VPC              IPv6            IPv6                        IPv6 EKS                               IPv6 EKS                      IPv6        IPv4   IPv6                         IPv6 EKS             ipv6 index md                               CG NAT           CG NAT     CIDR              CIDR       VPC                 CNI                                                           CNI                                                CNI       https   docs aws amazon com eks latest userguide alternate cni plugins html                             NAT           Amazon VPC           NAT        https   docs aws amazon com vpc latest userguide vpc nat gateway html             Amazon       NAT                             CIDR         VPC                                       https   aws amazon com blogs containers addressing ipv4 address exhaustion in amazon eks clusters using private nat gateways                      NAT             CIDR         EKS                                                                           CIDR                                                           Amazon VPC                         https   docs aws amazon com vpc latest userguide nat gateway scenarios html private nat overlapping networks                                            NAT        RFC6598                      IP                                 EKS                        100 64 0 0 16 VPC    CIDR                 NAT        NAT                RFC1918 CIDR                               CIDR         VPC                                   VPC                  VPC                     EKS                       VPC                        VPC              VPC                    VPC                                                                   illustration of network traffic using private NAT gateway    image 3 png                                                                           CIDR        100 64 0 0 8                               VPC    CIDR             CIDR                                                                                https   aws amazon com blogs containers optimize ip addresses usage by pods in your amazon eks cluster                                                                             VPC     VPC CIDR        100 64 0 0 10                    EKS                                                                       VPC   IP                                                                                illustration of worker nodes on secondary subnet    image 2 png                             Kubernetes                    AZ         eniConfig                                    topology kubernetes io zone   http   topology kubernetes io zone                  Amazon EKS  AZ             CIDR                  ENI                            failure domain beta kubernetes io zone                     topology kubernetes io zone                1   name      VPC                2                                  kubectl set env daemonset aws node  n kube system AWS VPC K8S CNI CUSTOM NETWORK CFG true                                    ENI CONFIG LABEL DEF              ENI CONFIG LABEL DEF     k8s amazonaws com eniConfig   http   k8s amazonaws com eniConfig          k8s amazonaws com eniConfig us west 2a subnet 1   http   k8s amazonaws com eniConfig us west 2a subnet 1      k8s amazonaws com eniConfig us west 2a subnet 2   http   k8s amazonaws com eniConfig us west 2a subnet 2            eniConfig                                                                                Lambda                       EKS         https   docs aws amazon com eks latest userguide getting started html   AWS CloudFormation                     aws node                               CNI                                                             https   aws amazon com premiumsupport knowledge center eks worker node actions                                     ENIConfig                                                                 CIDR  IP                                           ENI       Pod IP                         EC2                    Pod                                         Prefix                 Prefix          ENI        IP   28 Prefix                          m5 large                         Prefix                            29           3 ENIs   1     10 secondary IPs per ENI   1     2   20                           290                3 ENIs   1      10 secondary IPs per ENI   1    16     2   290               CPU              max pod  290     110                              EKS           250                                  m5 large    Prefix               IP                  CPU                             info     CNI Prefix  ENI   28 Prefix             IP               Prefix                       Prefix                          VPC               Prefix         CIDR                                                          CIDR     https   docs aws amazon com vpc latest userguide subnet cidr reservation html                CG NAT                                    IP                                               CG NAT                     CIDR       VPC                   CNI        IPv6


eks Security Group for Pod SGP search exclude true AWS EC2 Amazon VPC CNI ENI

Answer:
---
search:
  exclude: true
---

# 파드용 보안 그룹 (Security Group for Pod, SGP)

AWS 보안 그룹은 인바운드 및 아웃바운드 트래픽을 제어하기 위해 EC2 인스턴스에 대한 가상 방화벽의 역할을 수행합니다. 기본적으로 Amazon VPC CNI는 노드의 ENI와 연결된 보안 그룹을 사용합니다. 따라서 모든 파드는 기본적으로 파드가 동작하는 노드와 동일한 보안 그룹을 공유하여 이용합니다.

아래 그림에서 볼 수 있듯이, 워커 노드에서 동작하는 모든 애플리케이션 파드는 RDS 데이터베이스 서비스에 액세스할 수 있습니다. (RDS 인바운드가 노드의 보안 그룹을 허용한다는 가정하에). 보안 그룹은 노드에서 실행되는 모든 파드에 적용되기 때문에 큰 그룹 단위로 보안 규칙이 적용됩니다. 파드용 보안 그룹 기능을 이용하면 각 Pod별로 보안 규칙을 설정할 수 있으며, 이는 세세한 보안 전략을 세울수 있도록 도와줍니다.

![illustration of node with security group connecting to RDS](./image.png)
파드용 보안 그룹을 사용하면 공유 컴퓨팅 리소스에서 다양한 네트워크 보안 요구 사항을 가진 애플리케이션을 실행하여 컴퓨팅 효율성을 개선할 수 있습니다. EC2 보안 그룹과 함께 파드와 파드 사이 또는 파드에서 외부 AWS 서비스와 같은 여러 유형의 보안 규칙을 한 곳에서 정의하고 Kubernetes 네이티브 API를 사용하여 워크로드에 적용할 수 있습니다. 아래의 그림은 파드 수준에서 적용된 보안 그룹을 나타내고 있으며, 이런 보안 그룹이 애플리케이션 배포 및 노드 아키텍처를 간소화하는 방법을 보여줍니다. 이제 파드에서 Amazon RDS 데이터베이스에 액세스할 수 있습니다.

![illustration of pod and node with different security groups connecting to RDS](./image-2.png)

VPC CNI에 대해 `ENABLE_POD_ENI=true`로 설정하여 파드에 대한 보안 그룹을 활성화할 수 있습니다. 활성화되면 EKS의 컨트롤 플레인에서 실행되는 "[VPC 리소스 컨트롤러](https://github.com/aws/amazon-vpc-resource-controller-k8s)"가 "aws-k8s-trunk-eni"라는 트렁크 인터페이스를 생성하여 노드에 연결합니다. 트렁크 인터페이스는 인스턴스에 연결된 표준 네트워크 인터페이스 역할을 합니다. 트렁크 인터페이스를 관리하려면 Amazon EKS 클러스터와 함께 제공되는 클러스터 역할에 'AmazonEKSVPCResourceController' 관리형 정책을 추가해야 합니다.

또한 컨트롤러는 "aws-k8s-branch-eni"라는 브랜치 인터페이스를 생성하여 트렁크 인터페이스와 연결합니다. 파드는 [SecurityGroupPolicy](https://github.com/aws/amazon-vpc-resource-controller-k8s/blob/master/config/crd/bases/vpcresources.k8s.aws_securitygrouppolicies.yaml) 커스텀 리소스를 사용하여 보안 그룹을 할당받고 브랜치 인터페이스와 연결됩니다. 보안 그룹은 네트워크 인터페이스 단위로 지정되므로, 이제 이런 추가 네트워크 인터페이스에서 특정 보안 그룹을 필요로 하는 파드를 스케줄링할 수 있습니다. 배포 사전 요구 사항을 포함하여 [파드용 보안 그룹에 대한 EKS 사용자 가이드 섹션](https://docs.aws.amazon.com/eks/latest/userguide/security-groups-for-pods.html)에서 좀더 자세한 내용들을 확인할 수 있습니다.

![illustration of worker subnet with security groups associated with ENIs](./image-3.png)

분기 인터페이스 용량은 보조 IP 주소에 대한 기존 인스턴스 유형 제한에 *추가*됩니다. 보안 그룹을 사용하는 파드는 max-pods 공식에서 고려되지 않으며 파드에 보안 그룹을 사용하는 경우 max-pods 값을 높이는 것을 고려하거나 노드가 실제로 지원할 수 있는 것보다 적은 수의 파드를 실행해도 괜찮습니다.

m5.large에는 최대 9개의 분기 네트워크 인터페이스가 있을 수 있으며 표준 네트워크 인터페이스에 최대 27개의 보조 IP 주소가 할당될 수 있습니다. 아래 예에 표시된 것처럼 m5.large의 기본 max-pods는 29이며 EKS는 보안 그룹을 사용하는 Pod를 최대 Pod 수로 계산합니다. 노드의 max-pods를 변경하는 방법에 대한 지침은 [EKS 사용자 가이드](https://docs.aws.amazon.com/eks/latest/userguide/cni-increase-ip-addresses.html)를 참조하십시오.

파드용 보안 그룹을 [사용자 지정 네트워킹](https://docs.aws.amazon.com/eks/latest/userguide/cni-custom-network.html)과 함께 사용하는 경우, ENIConfig에 지정된 보안 그룹 대신 파드용 보안 그룹에 정의된 보안 그룹이 사용됩니다. 따라서 사용자 지정 네트워킹이 활성화되면 파드별 보안 그룹을 사용하면서 보안 그룹 순서를 신중하게 살펴봐야 합니다.

## 권장 사항

### 활성 프로브를 위한 TCP Early Demux 기능 비활성화

활성 또는 준비 상태 프로브를 사용하는 경우, kubelet이 TCP를 통해 브랜치 네트워크 인터페이스의 파드에 연결할 수 있도록 TCP Early Dmux 기능을 비활성화 해야 합니다. 이는 엄격 모드에서만 필요합니다. 이 작업을 수행하려면 다음 명령을 실행합니다.

```
kubectl edit daemonset aws-node -n kube-system
```

`초기화 컨테이너` 섹션에서 `DISABLE_TCP_EARLY_DEMUX`의 값을 `true`로 변경합니다.

### Pod용 보안 그룹을 사용하여 기존 AWS 구성을 활용하십시오.

보안 그룹을 사용하면 RDS 데이터베이스 또는 EC2 인스턴스와 같은 VPC 리소스에 대한 네트워크 액세스를 더 쉽게 제한할 수 있습니다. 파드용 보안 그룹의 분명한 이점 중 하나는 기존 AWS 보안 그룹 리소스를 재사용할 수 있다는 것입니다.
보안 그룹을 네트워크 방화벽으로 사용하여 AWS 서비스에 대한 액세스를 제한하는 경우, 브랜치 ENI를 사용하여 파드에 보안 그룹을 적용하는 것이 좋습니다. EC2 인스턴스에서 EKS로 앱을 전송하고 보안 그룹을 통해 다른 AWS 서비스에 대한 액세스를 제한하는 경우 파드용 보안 그룹을 사용하는 것을 고려해 보십시오.

### 파드용 보안 그룹 Enforcing 모드 구성

Amazon VPC CNI 플러그인 버전 1.11에는 `POD_SECURITY_GROUP_ENFORCING_MODE`("enforcing 모드")라는 새로운 설정이 추가되었습니다. 적용 모드는 파드에 적용되는 보안 그룹과 소스 NAT 활성화 여부를 모두 제어합니다. 적용 모드를 엄격 또는 표준으로 지정할 수 있습니다. 엄격이 기본값이며 `ENABLE_POD_ENI`가 `true`로 설정된 VPC CNI의 이전 동작을 반영합니다.

Strict 모드에서는 분기 ENI 보안 그룹만 적용됩니다. 소스 NAT도 비활성화됩니다.

Standard 모드에서는 기본 ENI 및 분기 ENI(파드와 연결됨)와 연결된 보안 그룹이 적용됩니다. 네트워크 트래픽은 두 보안 그룹을 모두 준수해야 합니다.

!!! warning
    모든 모드 변경은 새로 출시된 파드에만 영향을 미칩니다. 기존 파드는 파드가 생성될 때 구성된 모드를 사용한다. 고객은 트래픽 동작을 변경하려는 경우 보안 그룹과 함께 기존 파드를 재활용해야 합니다.

### Enforcing 모드: 파드 및 노드 트래픽을 격리하기 위해 Strict 모드를 사용

기본적으로 Pod의 보안 그룹은 “Strict 모드”로 설정됩니다. 파드 트래픽을 나머지 노드 트래픽과 완전히 분리해야 하는 경우 이 설정을 사용한다. Strict 모드에서는 소스 NAT가 꺼져 브랜치 ENI 아웃바운드 보안 그룹을 사용할 수 있습니다.

!!! Warning
    모든 모드 변경은 새로 실행된 파드에만 영향을 미칩니다. 기존 파드는 파드가 생성될 때 구성된 모드를 사용합니다. 고객이 트래픽 동작을 변경하려면 보안 그룹이 포함된 기존 파드를 재활용해야 합니다.

### Enforcing 모드: 다음 상황에서는 Standard 모드를 사용

**파드의 컨테이너에 표시되는 클라이언트 소스 IP**

클라이언트 소스 IP를 파드의 컨테이너에 표시되도록 유지해야 하는 경우 `POD_SECURITY_GROUP_ENFORCING_MODE`를 `standard`으로 설정하는 것이 좋습니다. Kubernetes 서비스는 클라이언트 소스 IP(기본 유형 클러스터) 보존을 지원하기 위해 externalTrafficPolicy=local을 지원합니다. 이제 표준 모드에서 externalTrafficPolicy가 Local로 설정된 인스턴스 대상을 사용하여 NodePort 및 LoadBalancer 유형의 Kubernetes 서비스를 실행할 수 있습니다. `Local`은 클라이언트 소스 IP를 유지하고 LoadBalancer 및 NodePort 유형 서비스에 대한 두 번째 홉을 방지합니다.

**NodeLocal DNSCache 배포**

파드에 보안 그룹을 사용하는 경우 [NodeLocal DNSCache](https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/)를 사용하는 파드를 지원하도록 표준 모드를 구성합니다. NodeLocal DNSCache는 클러스터 노드에서 DNS 캐싱 에이전트를 DaemonSet으로 실행하여 클러스터 DNS 성능을 향상시킵니다. 이렇게 하면 DNS QPS 요구 사항이 가장 높은 파드가 로컬 캐시가 있는 로컬 kube-dns/CoreDNS를 쿼리하는 데 도움이 되어 대기 시간이 향상됩니다.

NodeLocal DNSCache는 노드에 대한 모든 네트워크 트래픽이 VPC로 진입하므로 strict 모드에서는 지원되지 않습니다.

**Kubernetes 네트워크 정책 지원**

연결된 보안 그룹이 있는 파드에 네트워크 정책을 사용할 때는 표준 시행 모드를 사용하는 것이 좋습니다.

클러스터에 속하지 않은 AWS 서비스에 대한 네트워크 수준 액세스를 제한하려면 파드용 보안 그룹을 활용하는 것이 좋습니다. 클러스터 내부 파드 간의 네트워크 트래픽(종종 East/West 트래픽이라고도 함)을 제한하려면 네트워크 정책을 고려하세요.

### 파드당 보안 그룹과의 비호환성 식별

Windows 기반 및 비 Nitro 인스턴스는 파드에 대한 보안 그룹을 지원하지 않습니다. 파드에서 보안 그룹을 활용하려면 인스턴스에 isTrunkingEnabled 태그를 지정해야 합니다. 파드가 VPC 내부 또는 외부의 AWS 서비스에 의존하지 않는 경우 네트워크 정책을 사용하여 보안 그룹이 아닌 파드 간의 액세스를 관리합니다.

### 파드당 보안 그룹을 사용하여 AWS 서비스에 대한 트래픽을 효율적으로 제어

EKS 클러스터 내에서 실행되는 애플리케이션이 VPC 내의 다른 리소스와 통신해야 하는 경우. RDS 데이터베이스를 구축한 다음 파드에 SG를 사용하는 것을 권장 드립니다. CIDR 또는 DNS 이름을 지정할 수 있는 정책 엔진이 있지만 VPC 내에 엔드포인트가 있는 AWS 서비스와 통신할 때는 덜 최적의 선택입니다.

이와 대조적으로 Kubernetes [네트워크 정책](https://kubernetes.io/docs/concepts/services-networking/network-policies/)은 클러스터 내부 및 외부 모두에서 수신 및 송신 트래픽을 제어하기 위한 메커니즘을 제공합니다. 애플리케이션이 다른 AWS 서비스에 대한 종속성이 제한적인 경우 Kubernetes 네트워크 정책을 고려해야 합니다. SG와 같은 AWS 기본 의미 체계와 반대로 AWS 서비스에 대한 액세스를 제한하기 위해 CIDR 범위를 기반으로 송신 규칙을 지정하는 네트워크 정책을 구성할 수 있습니다. Kubernetes 네트워크 정책을 사용하여 파드 간(종종 East/West 트래픽이라고도 함) 및 파드와 외부 서비스 간의 네트워크 트래픽을 제어할 수 있습니다. Kubernetes 네트워크 정책은 OSI 레벨 3과 4에서 구현됩니다.

Amazon EKS를 사용하면 [Calico](https://projectcalico.docs.tigera.io/getting-started/kubernetes/managed-public-cloud/eks) 및 [Cilium](https://와 같은 네트워크 정책 엔진을 사용할 수 있습니다. docs.cilium.io/en/stable/intro/). 기본적으로 네트워크 정책 엔진은 설치되지 않습니다. 설정 방법에 대한 지침은 해당 설치 가이드를 확인하세요. 네트워크 정책 사용 방법에 대한 자세한 내용은 [EKS 보안 모범 사례](https://aws.github.io/aws-eks-best-practices/security/docs/network/#network-policy)를 참조하세요. DNS 호스트 이름 기능은 엔터프라이즈 버전의 네트워크 정책 엔진에서 사용할 수 있으며, 이는 Kubernetes 서비스/파드와 AWS 외부에서 실행되는 리소스 간의 트래픽을 제어하는 데 유용할 수 있습니다. 또한 기본적으로 보안 그룹을 지원하지 않는 AWS 서비스에 대한 DNS 호스트 이름 지원을 고려할 수 있습니다.

### AWS Loadbalancer Controller를 사용하도록 단일 보안 그룹에 태그 지정

많은 보안 그룹이 파드에 할당된 경우 Amazon EKS는 공유 또는 소유된 [`kubernetes.io/cluster/$name`](http://kubernetes.io/cluster/$name)으로 단일 보안 그룹에 태그를 지정할 것을 권장합니다. 태그를 사용하면 AWS Loadbalancer Controller가 보안 그룹의 규칙을 업데이트하여 트래픽을 파드로 라우팅할 수 있습니다. 파드에 하나의 보안 그룹만 제공되는 경우 태그 할당은 선택 사항입니다. 보안 그룹에 설정된 권한은 추가되므로 로드밸런서 컨트롤러가 규칙을 찾고 조정하려면 단일 보안 그룹에 태그를 지정하는 것으로 충분합니다. 또한 보안 그룹에서 정의한 [기본 할당량](https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html#vpc-limits-security-groups)을 준수하는 데 도움이 됩니다.

### 아웃바운드 트래픽에 대한 NAT 구성

소스 NAT는 보안 그룹이 할당된 파드의 아웃바운드 트래픽에 대해 비활성화됩니다. 인터넷 액세스가 필요한 보안 그룹을 사용하는 파드의 경우 NAT 게이트웨이 또는 인스턴스로 구성된 프라이빗 서브넷에서 워커 노드를 시작하고 CNI에서 [외부 SNAT](https://docs.aws.amazon.com/eks/latest/userguide/external-snat.html)를 활성화합니다.

```
kubectl set env daemonset -n kube-system aws-node AWS_VPC_K8S_CNI_EXTERNALSNAT=true
```

### 보안 그룹이 있는 파드를 프라이빗 서브넷에 배포

보안 그룹이 할당된 파드는 프라이빗 서브넷에 배포된 노드에서 실행되어야 합니다. 단 퍼블릭 서브넷에 배포된 보안 그룹이 할당된 파드는 인터넷에 액세스할 수 없습니다.

### 파드 스펙에서 *terminationGracePeriodSeconds* 부분 확인

파드 사양 파일에서 'terminationGracePeriodSeconds'가 0이 아닌지 확인하세요. (기본값 30초) 이는 Amazon VPC CNI가 워커 노드에서 파드 네트워크를 삭제하는 데 필수적입니다. 0으로 설정하면 CNI 플러그인이 호스트에서 파드 네트워크를 제거하지 않으며 분기 ENI가 효과적으로 정리되지 않습니다.

### Fargate를 이용하는 파드용 보안 그룹 사용

Fargate에서 실행되는 파드의 보안 그룹은 EC2 워커 노드에서 실행되는 파드와 매우 유사하게 작동한다. 예를 들어 Fargate 파드에 연결하는 보안 그룹 정책에서 보안 그룹을 참조하기 전에 먼저 보안 그룹을 생성해야 합니다.기본적으로 보안 그룹 정책을 Fargate 파드에 명시적으로 할당하지 않으면 [클러스터 보안 그룹](https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html)이 모든 Fargate 파드에 할당됩니다. 단순화를 위해 Fagate Pod의 SecurityGroupPolicy에 클러스터 보안 그룹을 추가할 수도 있습니다. 그렇지 않으면 보안 그룹에 최소 보안 그룹 규칙을 추가해야 합니다. 설명 클러스터 API를 사용하여 클러스터 보안 그룹을 찾을 수 있습니다.

```bash
 aws eks describe-cluster --name CLUSTER_NAME --query 'cluster.resourcesVpcConfig.clusterSecurityGroupId'
```

```bash
cat >my-fargate-sg-policy.yaml <<EOF
apiVersion: vpcresources.k8s.aws/v1beta1
kind: SecurityGroupPolicy
metadata:
  name: my-fargate-sg-policy
  namespace: my-fargate-namespace
spec:
  podSelector:
    matchLabels:
      role: my-fargate-role
  securityGroups:
    groupIds:
      - cluster_security_group_id
      - my_fargate_pod_security_group_id
EOF
```

최소 보안 그룹 규칙은 [여기](https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html)에 나와 있습니다. 이런 규칙을 통해 Fargate 파드는 kube-apiserver, kubelet, CoreDNS와 같은 클러스터 내 서비스와 통신할 수 있다. 또한 Fargate 파드와의 인바운드 및 아웃바운드 연결을 허용하는 규칙을 추가해야 합니다. 이렇게 하면 파드가 VPC의 다른 파드나 리소스와 통신할 수 있게 된다. 또한 Fargate가 Amazon ECR 또는 DockerHub와 같은 다른 컨테이너 레지스트리에서 컨테이너 이미지를 가져오도록 하는 규칙을 포함해야 합니다. 자세한 내용은 [AWS 일반 참조](https://docs.aws.amazon.com/general/latest/gr/aws-ip-ranges.html)의 AWS IP 주소 범위를 참조하십시오.

아래 명령을 사용하여 Fargate Pod에 적용된 보안 그룹을 찾을 수 있습니다.

```bash
kubectl get pod FARGATE_POD -o jsonpath='{.metadata.annotations.vpc\.amazonaws\.com/pod-eni}{"\n"}'
```

위 명령의 ENI ID를 적어 둡니다.

```bash
aws ec2 describe-network-interfaces --network-interface-ids ENI_ID --query 'NetworkInterfaces[*].Groups[*]'
```

새 보안 그룹을 적용하려면 기존 Fargate 파드를 삭제하고 다시 만들어야 합니다. 예를 들어 다음 명령은 example-app 배포를 시작합니다. 특정 파드를 업데이트하려면 아래 명령어에서 네임스페이스와 디플로이먼트 이름을 변경할 수 있습니다.

```bash
kubectl rollout restart -n example-ns deployment example-pod
```

search    exclude  true                    Security Group for Pod  SGP   AWS                                  EC2                                   Amazon VPC CNI      ENI                                                                                RDS                           RDS                                                                                Pod                                                     illustration of node with security group connecting to RDS    image png                                                                                EC2                                AWS                                  Kubernetes      API                                                                                Amazon RDS                         illustration of pod and node with different security groups connecting to RDS    image 2 png   VPC CNI      ENABLE POD ENI true                                         EKS                   VPC           https   github com aws amazon vpc resource controller k8s     aws k8s trunk eni                                                                                Amazon EKS                         AmazonEKSVPCResourceController                               aws k8s branch eni                                           SecurityGroupPolicy  https   github com aws amazon vpc resource controller k8s blob master config crd bases vpcresources k8s aws securitygrouppolicies yaml                                                                                EKS             https   docs aws amazon com eks latest userguide security groups for pods html                               illustration of worker subnet with security groups associated with ENIs    image 3 png                   IP                                                max pods                                  max pods                                                             m5 large      9                                             27      IP                               m5 large     max pods  29   EKS              Pod     Pod               max pods                   EKS          https   docs aws amazon com eks latest userguide cni increase ip addresses html                                     https   docs aws amazon com eks latest userguide cni custom network html               ENIConfig                                                                                TCP Early Demux                                    kubelet  TCP                                   TCP Early Dmux                                                                    kubectl edit daemonset aws node  n kube system                        DISABLE TCP EARLY DEMUX       true               Pod                 AWS                          RDS           EC2          VPC                                                               AWS                                                    AWS                           ENI                                EC2        EKS                       AWS                                                                  Enforcing        Amazon VPC CNI         1 11    POD SECURITY GROUP ENFORCING MODE   enforcing                                                   NAT                                                            ENABLE POD ENI    true       VPC CNI                 Strict          ENI                  NAT            Standard          ENI      ENI                                                                  warning                                                                                Enforcing                          Strict               Pod          Strict                                                            Strict          NAT         ENI                                Warning                                                                                Enforcing              Standard                                     IP             IP                              POD SECURITY GROUP ENFORCING MODE    standard                  Kubernetes               IP                         externalTrafficPolicy local                    externalTrafficPolicy  Local                    NodePort   LoadBalancer     Kubernetes                   Local            IP       LoadBalancer   NodePort                              NodeLocal DNSCache                           NodeLocal DNSCache  https   kubernetes io docs tasks administer cluster nodelocaldns                                   NodeLocal DNSCache            DNS          DaemonSet             DNS                    DNS QPS                               kube dns CoreDNS                               NodeLocal DNSCache                      VPC        strict                     Kubernetes                                                                                AWS                                                                               East West                                                             Windows        Nitro                                                        isTrunkingEnabled                   VPC           AWS                                                                                AWS                        EKS                       VPC                        RDS                    SG                   CIDR    DNS                         VPC              AWS                                    Kubernetes           https   kubernetes io docs concepts services networking network policies                                                                   AWS                      Kubernetes                    SG     AWS               AWS                      CIDR                                           Kubernetes                       East West                                                  Kubernetes          OSI    3  4           Amazon EKS        Calico  https   projectcalico docs tigera io getting started kubernetes managed public cloud eks     Cilium  https                                docs cilium io en stable intro                                                                                EKS           https   aws github io aws eks best practices security docs network  network policy          DNS                                                  Kubernetes         AWS                                                                    AWS         DNS                             AWS Loadbalancer Controller                                              Amazon EKS              kubernetes io cluster  name   http   kubernetes io cluster  name                                         AWS Loadbalancer Controller                                                                                https   docs aws amazon com vpc latest userguide amazon vpc limits html vpc limits security groups                                      NAT        NAT                                                                        NAT                                           CNI       SNAT  https   docs aws amazon com eks latest userguide external snat html                kubectl set env daemonset  n kube system aws node AWS VPC K8S CNI EXTERNALSNAT true                                                                                terminationGracePeriodSeconds                     terminationGracePeriodSeconds   0                  30      Amazon VPC CNI                                  0        CNI                                  ENI                        Fargate                     Fargate                   EC2                                      Fargate                                                                       Fargate                                 https   docs aws amazon com eks latest userguide sec group reqs html      Fargate                    Fagate Pod  SecurityGroupPolicy                                                                         API                                  bash  aws eks describe cluster   name CLUSTER NAME   query  cluster resourcesVpcConfig clusterSecurityGroupId          bash cat  my fargate sg policy yaml   EOF apiVersion  vpcresources k8s aws v1beta1 kind  SecurityGroupPolicy metadata    name  my fargate sg policy   namespace  my fargate namespace spec    podSelector       matchLabels        role  my fargate role   securityGroups      groupIds          cluster security group id         my fargate pod security group id EOF                        https   docs aws amazon com eks latest userguide sec group reqs html                      Fargate     kube apiserver  kubelet  CoreDNS                              Fargate                                                     VPC                              Fargate  Amazon ECR    DockerHub                                                               AWS        https   docs aws amazon com general latest gr aws ip ranges html   AWS IP                             Fargate Pod                            bash kubectl get pod FARGATE POD  o jsonpath    metadata annotations vpc  amazonaws  com pod eni    n               ENI ID               bash aws ec2 describe network interfaces   network interface ids ENI ID   query  NetworkInterfaces    Groups                            Fargate                                    example app                                                                       bash kubectl rollout restart  n example ns deployment example pod


Answer:
---
search:
  exclude: true
---

# 네트워크 성능 문제에 대한 EKS 워크로드 모니터링

## DNS 스로틀링 문제에 대한 CoreDNS 트래픽 모니터링

DNS 집약적 워크로드를 실행하면 DNS 스로틀링으로 인해 간헐적으로 CoreDNS 장애가 발생할 수 있으며, 이로 인해 가끔 알 수 없는 Hostexception 오류가 발생할 수 있는 애플리케이션에 영향을 미칠 수 있습니다.

CoreDNS 배포에는 Kubernetes 스케줄러가 클러스터의 개별 워커 노드에서 CoreDNS 인스턴스를 실행하도록 지시하는 반선호도 정책이 있습니다. 즉, 동일한 워커 노드에 복제본을 같은 위치에 배치하지 않도록 해야 합니다. 이렇게 하면 각 복제본의 트래픽이 다른 ENI를 통해 라우팅되므로 네트워크 인터페이스당 DNS 쿼리 수가 효과적으로 줄어듭니다. 초당 1024개의 패킷 제한으로 인해 DNS 쿼리가 병목 현상을 겪는 경우 1) 코어 DNS 복제본 수를 늘리거나 2) [NodeLocal DNS 캐시](https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/)를 구현해 볼 수 있습니다.자세한 내용은 [CoreDNS 메트릭 모니터링](https://aws.github.io/aws-eks-best-practices/reliability/docs/networkmanagement/#monitor-coredns-metrics)을 참조하십시오.

### 도전 과제
* 패킷 드롭은 몇 초 만에 발생하며 DNS 스로틀링이 실제로 발생하는지 확인하기 위해 이런 패턴을 적절하게 모니터링하는 것은 까다로울 수 있습니다.
* DNS 쿼리는 엘라스틱 네트워크 인터페이스 수준에서 조절됩니다. 따라서 병목 현상이 발생한 쿼리는 쿼리 로깅에 나타나지 않습니다.
* 플로우 로그는 모든 IP 트래픽을 캡처하지 않습니다. 예: 인스턴스가 Amazon DNS 서버에 접속할 때 생성되는 트래픽 자체 DNS 서버를 사용하는 경우 해당 DNS 서버로 향하는 모든 트래픽이 로깅됩니다.

### 솔루션
워커 노드의 DNS 조절 문제를 쉽게 식별할 수 있는 방법은 `linklocal_allowance_exeded` 메트릭을 캡처하는 것입니다. [linklocal_allowance_exceeded](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html#linux-metrics-enabled-by-CloudWatch-agent)는 로컬 프록시 서비스에 대한 트래픽의 PPS가 네트워크 인터페이스의 최대값을 초과하여 삭제된 패킷 수입니다. 이는 DNS 서비스, 인스턴스 메타데이터 서비스 및 Amazon Time Sync 서비스에 대한 트래픽에 영향을 미칩니다. 이 이벤트를 실시간으로 추적하는 대신 이 지표를 [Amazon Managed Service for Prometheus](https://aws.amazon.com/prometheus/)에도 스트리밍하여 [Amazon Managed Grafana](https://aws.amazon.com/grafana/)에서 시각화할 수 있습니다.

## Conntrack 메트릭을 사용하여 DNS 쿼리 지연 모니터링

CoreDNS 스로틀링/쿼리 지연을 모니터링하는 데 도움이 될 수 있는 또 다른 지표는 `conntrack_allowance_available`과 `conntrack_allowance_exceed`입니다.
연결 추적 허용량을 초과하여 발생하는 연결 장애는 다른 허용치를 초과하여 발생하는 연결 실패보다 더 큰 영향을 미칠 수 있습니다. TCP를 사용하여 데이터를 전송하는 경우, 대역폭, PPS 등과 같이 EC2 인스턴스 네트워크 허용량을 초과하여 대기열에 있거나 삭제되는 패킷은 일반적으로 TCP의 혼잡 제어 기능 덕분에 정상적으로 처리됩니다. 영향을 받은 흐름은 느려지고 손실된 패킷은 재전송됩니다. 그러나 인스턴스가 Connections Tracked 허용량을 초과하는 경우 새 연결을 위한 공간을 마련하기 위해 기존 연결 중 일부를 닫기 전까지는 새 연결을 설정할 수 없습니다.

`conntrack_allowance_available` 및 `conntrack_allowance_exceed`는 고객이 모든 인스턴스마다 달라지는 연결 추적 허용량을 모니터링하는 데 도움이 됩니다. 이런 네트워크 성능 지표를 통해 고객은 네트워크 대역폭, 초당 패킷 수 (PPS), 추적된 연결, 링크 로컬 서비스 액세스 (Amazon DNS, 인스턴스 메타 데이터 서비스, Amazon Time Sync) 와 같은 인스턴스의 네트워킹 허용량을 초과했을 때 대기 또는 삭제되는 패킷 수를 파악할 수 있습니다.

`conntrack_allowance_available`은 해당 인스턴스 유형의 추적된 연결 허용량에 도달하기 전에 인스턴스가 설정할 수 있는 추적된 연결 수입니다 (니트로 기반 인스턴스에서만 지원됨).
`conntrack_allowance_exceed`는 인스턴스의 연결 추적이 최대치를 초과하여 새 연결을 설정할 수 없어서 삭제된 패킷 수입니다.

## 기타 중요한 네트워크 성능 지표

기타 중요한 네트워크 성능 지표는 다음과 같습니다.

`bw_in_allowance_exceed` (이상적인 지표 값은 0이어야 함) 는 인바운드 집계 대역폭이 인스턴스의 최대값을 초과하여 대기 및/또는 삭제된 패킷 수입니다.

`bw_out_allowance_exceed` (이상적인 지표 값은 0이어야 함) 는 아웃바운드 총 대역폭이 해당 인스턴스의 최대값을 초과하여 대기 및/또는 삭제된 패킷 수입니다.

`pps_allowance_exceed` (이상적인 지표 값은 0이어야 함) 는 양방향 PPS가 인스턴스의 최대값을 초과하여 대기 및/또는 삭제된 패킷 수입니다.

## 네트워크 성능 문제에 대한 워크로드 모니터링을 위한 지표 캡처

Elastic Network Adapter (ENA) 드라이버는 위에서 설명한 네트워크 성능 메트릭이 활성화된 인스턴스로부터 해당 메트릭을 게시합니다. CloudWatch 에이전트를 사용하여 모든 네트워크 성능 지표를 CloudWatch에 게시할 수 있습니다. 자세한 내용은 [블로그](https://aws.amazon.com/blogs/networking-and-content-delivery/amazon-ec2-instance-level-network-performance-metrics-uncover-new-insights/)를 참조하십시오.

이제 위에서 설명한 지표를 캡처하여 Prometheus용 Amazon Managed Service에 저장하고 Amazon Managed Grafana를 사용하여 시각화해 보겠습니다.

### 사전 요구 사항
* ethtool - 워커 노드에 ethtool이 설치되어 있는지 확인하십시오.
* AWS 계정에 구성된 AMP 워크스페이스.지침은 AMP 사용 설명서의 [워크스페이스 만들기](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-onboard-create-workspace.html)를 참조하십시오.
* Amazon Managed Grafana 워크스페이스

### 프로메테우스 ethtool 익스포터 구축
배포에는 ethtool에서 정보를 가져와 프로메테우스 형식으로 게시하는 Python 스크립트가 포함되어 있습니다.

```
kubectl apply -f https://raw.githubusercontent.com/Showmax/prometheus-ethtool-exporter/master/deploy/k8s-daemonset.yaml
```

### ADOT 컬렉터를 배포하여 ethtool 메트릭을 스크랩하고 프로메테우스용 아마존 매니지드 서비스 워크스페이스에 저장
OpenTelemetry용 AWS 배포판 (ADOT) 을 설치하는 각 클러스터에는 이 역할이 있어야 AWS 서비스 어카운트에 메트릭을 Prometheus용 Amazon 관리형 서비스에 저장할 수 있는 권한을 부여할 수 있습니다.다음 단계에 따라 IRSA를 사용하여 IAM 역할을 생성하고 Amazon EKS 서비스 어카운트에 연결하십시오.

```
eksctl create iamserviceaccount --name adot-collector --namespace default --cluster <CLUSTER_NAME> --attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess --attach-policy-arn arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy --region <REGION> --approve  --override-existing-serviceaccounts
```

ADOT 컬렉터를 배포하여 프로메테우스 ethtool 익스포터의 메트릭을 스크랩하여 프로메테우스용 아마존 매니지드 서비스에 저장해 보겠습니다.

다음 절차에서는 배포를 모드 값으로 사용하는 예제 YAML 파일을 사용합니다. 이 모드는 기본 모드이며 독립 실행형 응용 프로그램과 유사하게 ADOT Collector를 배포합니다. 이 구성은 클러스터의 파드에서 스크랩한 샘플 애플리케이션과 Amazon Managed Service for Prometheus 지표로부터 OTLP 지표를 수신합니다.

```
curl -o collector-config-amp.yaml https://raw.githubusercontent.com/aws-observability/aws-otel-community/master/sample-configs/operator/collector-config-amp.yaml
```

컬렉터-config-amp.yaml에서 다음을 사용자 고유의 값으로 바꾸십시오.
* mode: deployment
* serviceAccount: adot-collector
* endpoint: "<YOUR_REMOTE_WRITE_ENDPOINT>"
* region: "<YOUR_AWS_REGION>"
* name: adot-collector

```
kubectl apply -f collector-config-amp.yaml
```

채택 수집기가 배포되면 지표가 Amazon Prometheus에 성공적으로 저장됩니다.

### Prometheus가 알림을 보내도록 Amazon 관리 서비스의 알림 관리자를 구성
지금까지 설명한 메트릭을 확인하기 위해 기록 규칙 및 경고 규칙을 구성해 보겠습니다.

[프로메테우스용 아마존 매니지드 서비스용 ACK 컨트롤러](https://github.com/aws-controllers-k8s/prometheusservice-controller)를 사용하여 알림 및 기록 규칙을 규정할 것입니다.

프로메테우스용 Amazon 관리 서비스 서비스를 위한 ACL 컨트롤러를 배포해 보겠습니다.

```
export SERVICE=prometheusservice
export RELEASE_VERSION=`curl -sL https://api.github.com/repos/aws-controllers-k8s/$SERVICE-controller/releases/latest | grep '"tag_name":' | cut -d'"' -f4`
export ACK_SYSTEM_NAMESPACE=ack-system
export AWS_REGION=us-east-1
aws ecr-public get-login-password --region us-east-1 | helm registry login --username AWS --password-stdin public.ecr.aws
helm install --create-namespace -n $ACK_SYSTEM_NAMESPACE ack-$SERVICE-controller \
oci://public.ecr.aws/aws-controllers-k8s/$SERVICE-chart --version=$RELEASE_VERSION --set=aws.region=$AWS_REGION
```

명령을 실행하면 몇 분 후 다음 메시지가 표시됩니다.

```
You are now able to create Amazon Managed Service for Prometheus (AMP) resources!

The controller is running in "cluster" mode.

The controller is configured to manage AWS resources in region: "us-east-1"

The ACK controller has been successfully installed and ACK can now be used to provision an Amazon Managed Service for Prometheus workspace.
```

이제 경고 관리자 정의 및 규칙 그룹을 프로비저닝하기 위한 yaml 파일을 생성해 보겠습니다.
아래 파일을 `rulegroup.yaml`로 저장합니다.

```
apiVersion: prometheusservice.services.k8s.aws/v1alpha1
kind: RuleGroupsNamespace
metadata:
   name: default-rule
spec:
   workspaceID: <Your WORKSPACE-ID>
   name: default-rule
   configuration: |
     groups:
     - name: ppsallowance
       rules:
       - record: metric:pps_allowance_exceeded
         expr: rate(node_net_ethtool{device="eth0",type="pps_allowance_exceeded"}[30s])
       - alert: PPSAllowanceExceeded
         expr: rate(node_net_ethtool{device="eth0",type="pps_allowance_exceeded"} [30s]) > 0
         labels:
           severity: critical

         annotations:
           summary: Connections dropped due to total allowance exceeding for the  (instance )
           description: "PPSAllowanceExceeded is greater than 0"
     - name: bw_in
       rules:
       - record: metric:bw_in_allowance_exceeded
         expr: rate(node_net_ethtool{device="eth0",type="bw_in_allowance_exceeded"}[30s])
       - alert: BWINAllowanceExceeded
         expr: rate(node_net_ethtool{device="eth0",type="bw_in_allowance_exceeded"} [30s]) > 0
         labels:
           severity: critical

         annotations:
           summary: Connections dropped due to total allowance exceeding for the  (instance )
           description: "BWInAllowanceExceeded is greater than 0"
     - name: bw_out
       rules:
       - record: metric:bw_out_allowance_exceeded
         expr: rate(node_net_ethtool{device="eth0",type="bw_out_allowance_exceeded"}[30s])
       - alert: BWOutAllowanceExceeded
         expr: rate(node_net_ethtool{device="eth0",type="bw_out_allowance_exceeded"} [30s]) > 0
         labels:
           severity: critical

         annotations:
           summary: Connections dropped due to total allowance exceeding for the  (instance )
           description: "BWoutAllowanceExceeded is greater than 0"
     - name: conntrack
       rules:
       - record: metric:conntrack_allowance_exceeded
         expr: rate(node_net_ethtool{device="eth0",type="conntrack_allowance_exceeded"}[30s])
       - alert: ConntrackAllowanceExceeded
         expr: rate(node_net_ethtool{device="eth0",type="conntrack_allowance_exceeded"} [30s]) > 0
         labels:
           severity: critical

         annotations:
           summary: Connections dropped due to total allowance exceeding for the  (instance )
           description: "ConnTrackAllowanceExceeded is greater than 0"
     - name: linklocal
       rules:
       - record: metric:linklocal_allowance_exceeded
         expr: rate(node_net_ethtool{device="eth0",type="linklocal_allowance_exceeded"}[30s])
       - alert: LinkLocalAllowanceExceeded
         expr: rate(node_net_ethtool{device="eth0",type="linklocal_allowance_exceeded"} [30s]) > 0
         labels:
           severity: critical

         annotations:
           summary: Packets dropped due to PPS rate allowance exceeded for local services  (instance )
           description: "LinkLocalAllowanceExceeded is greater than 0"
```

WORKSPACE-ID를 사용 중인 작업 공간의 작업 영역 ID로 바꾸십시오.

이제 알림 관리자 정의를 구성해 보겠습니다.아래 파일을 `alertmanager.yaml`으로 저장합니다.

```
apiVersion: prometheusservice.services.k8s.aws/v1alpha1
kind: AlertManagerDefinition
metadata:
  name: alert-manager
spec:
  workspaceID: <Your WORKSPACE-ID >
  configuration: |
    alertmanager_config: |
      route:
         receiver: default_receiver
       receivers:
       - name: default_receiver
          sns_configs:
          - topic_arn: TOPIC-ARN
            sigv4:
              region: REGION
            message: |
              alert_type:
              event_type:
```

WORKSPACE-ID를 새 작업 공간의 작업 공간 ID로, TOPIC-ARN을 알림을 보내려는 [Amazon 단순 알림 서비스](https://aws.amazon.com/sns/) 주제의 ARN으로, 그리고 REGION을 워크로드의 현재 지역으로 대체합니다. 작업 영역에 Amazon SNS로 메시지를 보낼 권한이 있는지 확인하십시오.

### 아마존 매니지드 그라파나에서 ethtool 메트릭을 시각화
Amazon Managed Grafana 내에서 지표를 시각화하고 대시보드를 구축해 보겠습니다.프로메테우스용 아마존 매니지드 서비스를 아마존 매니지드 그라파나 콘솔 내에서 데이터 소스로 구성하십시오.지침은 [아마존 프로메테우스를 데이터 소스로 추가](https://docs.aws.amazon.com/grafana/latest/userguide/AMP-adding-AWS-config.html)를 참조하십시오.

이제 아마존 매니지드 그라파나의 메트릭을 살펴보겠습니다.
탐색 버튼을 클릭하고 ethtool을 검색하세요.

![Node_ethtool metrics](./explore_metrics.png)

`rate (node_net_ethtool {device="eth0", type="linklocal_allowance_Exceed "} [30s])` 쿼리를 사용하여 linklocal_allowance_Exceed 지표에 대한 대시보드를 만들어 보겠습니다.그러면 아래 대시보드가 나타납니다.

![linklocal_allowance_exceeded dashboard](./linklocal.png)

값이 0이므로 삭제된 패킷이 없음을 분명히 알 수 있습니다.

`rate (node_net_ethtool {device="eth0", type="conntrack_allowance_Exceed "} [30s])` 쿼리를 사용하여 conntrack_allowance_Exceed 메트릭에 대한 대시보드를 만들어 보겠습니다.결과는 아래 대시보드와 같습니다.

![conntrack_allowance_exceeded dashboard](./conntrack.png)

[여기](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-network-performance.html)에 설명된 대로 클라우드워치 에이전트를 실행하면 `conntrack_allowance_exceed` 지표를 CloudWatch에서 시각화할 수 있습니다. CloudWatch의 결과 대시보드는 다음과 같이 표시됩니다.

![CW_NW_Performance](./cw_metrics.png)

값이 0이므로 삭제된 패킷이 없음을 분명히 알 수 있습니다.Nitro 기반 인스턴스를 사용하는 경우 'conntrack_allowance_available'에 대한 유사한 대시보드를 만들고 EC2 인스턴스의 연결을 사전에 모니터링할 수 있습니다.Amazon Managed Grafana에서 슬랙, SNS, Pagerduty 등에 알림을 보내도록 알림을 구성하여 이를 더욱 확장할 수 있습니다.

search    exclude  true                        EKS               DNS             CoreDNS           DNS                DNS                 CoreDNS                                Hostexception                                      CoreDNS      Kubernetes                        CoreDNS                                                                                ENI                        DNS                       1024              DNS                  1     DNS             2   NodeLocal DNS     https   kubernetes io docs tasks administer cluster nodelocaldns                          CoreDNS           https   aws github io aws eks best practices reliability docs networkmanagement  monitor coredns metrics                                           DNS                                                              DNS                                                                                IP                          Amazon DNS                       DNS                DNS                                        DNS                         linklocal allowance exeded                   linklocal allowance exceeded  https   docs aws amazon com AmazonCloudWatch latest monitoring metrics collected by CloudWatch agent html linux metrics enabled by CloudWatch agent                       PPS                                        DNS                       Amazon Time Sync                                                    Amazon Managed Service for Prometheus  https   aws amazon com prometheus             Amazon Managed Grafana  https   aws amazon com grafana                      Conntrack           DNS             CoreDNS                                           conntrack allowance available    conntrack allowance exceed                                                                               TCP                          PPS       EC2                                             TCP                                                                      Connections Tracked                                                                            conntrack allowance available     conntrack allowance exceed                                                                                PPS                          Amazon DNS                   Amazon Time Sync                                                             conntrack allowance available                                                                                conntrack allowance exceed                                                                                bw in allowance exceed              0                                                             bw out allowance exceed              0                                                                pps allowance exceed              0             PPS                                                                               Elastic Network Adapter  ENA                                                         CloudWatch                           CloudWatch                            https   aws amazon com blogs networking and content delivery amazon ec2 instance level network performance metrics uncover new insights                                 Prometheus  Amazon Managed Service       Amazon Managed Grafana                                   ethtool          ethtool                     AWS         AMP            AMP                      https   docs aws amazon com prometheus latest userguide AMP onboard create workspace html             Amazon Managed Grafana                    ethtool              ethtool                            Python                       kubectl apply  f https   raw githubusercontent com Showmax prometheus ethtool exporter master deploy k8s daemonset yaml          ADOT           ethtool                                            OpenTelemetry  AWS      ADOT                            AWS                Prometheus  Amazon                                            IRSA       IAM          Amazon EKS                        eksctl create iamserviceaccount   name adot collector   namespace default   cluster  CLUSTER NAME    attach policy arn arn aws iam  aws policy AmazonPrometheusRemoteWriteAccess   attach policy arn arn aws iam  aws policy AWSXrayWriteOnlyAccess   attach policy arn arn aws iam  aws policy CloudWatchAgentServerPolicy   region  REGION    approve    override existing serviceaccounts      ADOT                  ethtool                                                                                YAML                                               ADOT Collector                                          Amazon Managed Service for Prometheus       OTLP                 curl  o collector config amp yaml https   raw githubusercontent com aws observability aws otel community master sample configs operator collector config amp yaml          config amp yaml                            mode  deployment   serviceAccount  adot collector   endpoint    YOUR REMOTE WRITE ENDPOINT     region    YOUR AWS REGION     name  adot collector      kubectl apply  f collector config amp yaml                        Amazon Prometheus                    Prometheus           Amazon                                                                                ACK       https   github com aws controllers k8s prometheusservice controller                                       Amazon                ACL                        export SERVICE prometheusservice export RELEASE VERSION  curl  sL https   api github com repos aws controllers k8s  SERVICE controller releases latest   grep   tag name      cut  d     f4  export ACK SYSTEM NAMESPACE ack system export AWS REGION us east 1 aws ecr public get login password   region us east 1   helm registry login   username AWS   password stdin public ecr aws helm install   create namespace  n  ACK SYSTEM NAMESPACE ack  SERVICE controller   oci   public ecr aws aws controllers k8s  SERVICE chart   version  RELEASE VERSION   set aws region  AWS REGION                                         You are now able to create Amazon Managed Service for Prometheus  AMP  resources   The controller is running in  cluster  mode   The controller is configured to manage AWS resources in region   us east 1   The ACK controller has been successfully installed and ACK can now be used to provision an Amazon Managed Service for Prometheus workspace                                        yaml                        rulegroup yaml               apiVersion  prometheusservice services k8s aws v1alpha1 kind  RuleGroupsNamespace metadata     name  default rule spec     workspaceID   Your WORKSPACE ID     name  default rule    configuration         groups         name  ppsallowance        rules           record  metric pps allowance exceeded          expr  rate node net ethtool device  eth0  type  pps allowance exceeded   30s            alert  PPSAllowanceExceeded          expr  rate node net ethtool device  eth0  type  pps allowance exceeded    30s     0          labels             severity  critical                      annotations             summary  Connections dropped due to total allowance exceeding for the   instance              description   PPSAllowanceExceeded is greater than 0         name  bw in        rules           record  metric bw in allowance exceeded          expr  rate node net ethtool device  eth0  type  bw in allowance exceeded   30s            alert  BWINAllowanceExceeded          expr  rate node net ethtool device  eth0  type  bw in allowance exceeded    30s     0          labels             severity  critical                      annotations             summary  Connections dropped due to total allowance exceeding for the   instance              description   BWInAllowanceExceeded is greater than 0         name  bw out        rules           record  metric bw out allowance exceeded          expr  rate node net ethtool device  eth0  type  bw out allowance exceeded   30s            alert  BWOutAllowanceExceeded          expr  rate node net ethtool device  eth0  type  bw out allowance exceeded    30s     0          labels             severity  critical                      annotations             summary  Connections dropped due to total allowance exceeding for the   instance              description   BWoutAllowanceExceeded is greater than 0                     name  conntrack        rules           record  metric conntrack allowance exceeded          expr  rate node net ethtool device  eth0  type  conntrack allowance exceeded   30s            alert  ConntrackAllowanceExceeded          expr  rate node net ethtool device  eth0  type  conntrack allowance exceeded    30s     0          labels             severity  critical                      annotations             summary  Connections dropped due to total allowance exceeding for the   instance              description   ConnTrackAllowanceExceeded is greater than 0         name  linklocal        rules           record  metric linklocal allowance exceeded          expr  rate node net ethtool device  eth0  type  linklocal allowance exceeded   30s            alert  LinkLocalAllowanceExceeded          expr  rate node net ethtool device  eth0  type  linklocal allowance exceeded    30s     0          labels             severity  critical                      annotations             summary  Packets dropped due to PPS rate allowance exceeded for local services   instance              description   LinkLocalAllowanceExceeded is greater than 0       WORKSPACE ID                     ID                                           alertmanager yaml                apiVersion  prometheusservice services k8s aws v1alpha1   kind  AlertManagerDefinition metadata    name  alert manager spec    workspaceID   Your WORKSPACE ID     configuration        alertmanager config          route           receiver  default receiver        receivers           name  default receiver           sns configs              topic arn  TOPIC ARN             sigv4                region  REGION             message                  alert type                 event type             WORKSPACE ID                 ID   TOPIC ARN            Amazon            https   aws amazon com sns       ARN        REGION                              Amazon SNS                                                  ethtool          Amazon Managed Grafana                                                                                https   docs aws amazon com grafana latest userguide AMP adding AWS config html                                                        ethtool            Node ethtool metrics    explore metrics png    rate  node net ethtool  device  eth0   type  linklocal allowance Exceed     30s             linklocal allowance Exceed                                               linklocal allowance exceeded dashboard    linklocal png      0                                rate  node net ethtool  device  eth0   type  conntrack allowance Exceed     30s             conntrack allowance Exceed                                               conntrack allowance exceeded dashboard    conntrack png        https   docs aws amazon com AmazonCloudWatch latest monitoring CloudWatch Agent network performance html                             conntrack allowance exceed      CloudWatch                CloudWatch                            CW NW Performance    cw metrics png      0                             Nitro                   conntrack allowance available                    EC2                            Amazon Managed Grafana       SNS  Pagerduty


eks search iframe width 560 height 315 src https www youtube com embed zdXpTT0bZXo title YouTube video player frameborder 0 allow accelerometer autoplay clipboard write encrypted media gyroscope picture in picture web share allowfullscreen iframe exclude true IPv6 EKS

Answer:
---
search:
  exclude: true
---

# IPv6 EKS 클러스터 실행

<iframe width="560" height="315" src="https://www.youtube.com/embed/zdXpTT0bZXo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

IPv6 모드의 EKS는 대규모 EKS 클러스터에서 자주 나타나는 IPv4 고갈 문제를 해결합니다. EKS의 IPv6 지원은 IPv4 주소 공간의 제한된 크기로 인해 발생하는 IPv4 고갈 문제를 해결하는 데 중점을 두고 있습니다. 이는 많은 고객이 제기한 중요한 우려 사항이며 Kubernetes의 "[IPv4/IPv6 이중 스택](https://kubernetes.io/docs/concepts/services-networking/dual-stack/)" 기능과는 다릅니다.

또한 EKS/IPv6는 IPv6 CIDR을 사용하여 네트워크 경계를 상호 연결할 수 있는 유연성을 제공하므로 CIDR 중복으로 발생할 가능성을 최소화하여 2중 문제(클러스터 내, 클러스터 간)를 해결합니다.

IPv6 EKS 클러스터에서 파드와 서비스는 레거시 IPv4 엔드포인트와의 호환성을 유지하면서 IPv6 주소를 수신합니다. 여기에는 외부 IPv4 엔드포인트가 클러스터 내 서비스에 액세스하는 기능과 파드가 외부 IPv4 엔드포인트에 액세스하는 기능이 포함됩니다.

Amazon EKS IPv6 지원은 네이티브 VPC IPv6 기능을 활용합니다. 각 VPC에는 IPv4 주소 Prefix (CIDR 블록 크기는 /16에서 /28까지 가능) 및 아마존 GUA (글로벌 유니캐스트 주소) 내의 고유한 /56 IPv6 주소 Prefix (고정) 가 할당됩니다. VPC의 각 서브넷에 /64 주소 Prefix를 할당할 수 있습니다. 라우팅 테이블, 네트워크 액세스 제어 목록, 피어링, DNS 확인과 같은 IPv4 기능은 IPv6 지원 VPC에서 동일한 방식으로 작동합니다. VPC를 이중 스택 VPC라고 하며 이중 스택 서브넷에 이어 다음 다이어그램은 EK/IPv6 기반 클러스터를 지원하는 IPv4&IPv6 VPC 기반 패턴을 보여줍니다.

![Dual Stack VPC, mandatory foundation for EKS cluster in IPv6 mode](./eks-ipv6-foundation.png)

IPv6 환경에서는 모든 주소를 인터넷으로 라우팅할 수 있습니다. 기본적으로 VPC는 퍼블릭 GUA 범위에서 IPv6 CIDR을 할당합니다. VPC는 RFC 4193 (fd00: :/8 또는 fc00: :/8) 에 정의된 [고유 로컬 주소 (ULA)](https://en.wikipedia.org/wiki/Unique_local_address) 범위에서 프라이빗 IPv6 주소를 할당하는 것을 지원하지 않습니다. 이는 사용자가 소유한 IPv6 CIDR을 할당하려는 경우에도 마찬가지입니다. VPC에 외부 전용 인터넷 게이트웨이 (EIGW) 를 구현하여 들어오는 트래픽은 모두 차단하면서 아웃바운드 트래픽은 허용함으로써 프라이빗 서브넷에서 인터넷으로 나가는 것을 지원합니다.
다음 다이어그램은 EKS/IPv6 클러스터 내의 Pod IPv6 인터넷 송신 흐름을 보여줍니다.

![Dual Stack VPC, EKS Cluster in IPv6 Mode, Pods in private subnets egressing to Internet IPv6 endpoints](./eks-egress-ipv6.png)

IPv6 서브넷을 구현하는 모범 사례는 [VPC 사용 설명서](https://docs.aws.amazon.com/whitepapers/latest/ipv6-on-aws/IPv6-on-AWS.html)에서 확인할 수 있습니다.

IPv6 EKS 클러스터에서 노드와 파드는 퍼블릭 IPv6 주소를 갖습니다. EKS는 고유한 로컬 IPv6 유니캐스트 주소 (ULA) 를 기반으로 서비스에 IPv6 주소를 할당합니다. IPv6 클러스터의 ULA 서비스 CIDR은 IPv4와 달리 클러스터 생성 단계에서 자동으로 할당되며 지정할 수 없습니다. 다음 다이어그램은 EKS/IPv6 기반 클러스터 컨트롤 플레인 및 데이터 플랜 기반 패턴을 보여줍니다.

![Dual Stack VPC, EKS Cluster in IPv6 Mode, control plane ULA, data plane IPv6 GUA for EC2 & Pods](./eks-cluster-ipv6-foundation.png)

## 개요

EKS/IPv6는 Prefix 모드 (VPC-CNI 플러그인 ENI IP 할당 모드) 에서만 지원됩니다. [Prefix 모드](https://aws.github.io/aws-eks-best-practices/networking/prefix-mode/index_linux/)에 대해 자세히 알아보십시오.

> Prefix 할당은 Nitro 기반 EC2 인스턴스에서만 작동하므로 EKS/IPv6는 클러스터 데이터 플레인이 EC2 Nitro 기반 인스턴스를 사용하는 경우에만 지원됩니다.

간단히 말해서 IPv6 Prefix가 /80 (워커 노드당) 이면 최대 10^14 IPv6 주소가 생성되며, 제한 요소는 더 이상 IP가 아니라 파드의 밀도입니다 (참고 자료 기준).

IPv6 Prefix 할당은 EKS 워커 노드 부트스트랩 시에만 발생합니다.
이 동작은 프라이빗 IPv4 주소를 적시에 할당하기 위한 VPC CNI 플러그인 (ipamd) 에서 생성되는 API 호출 속도 제한으로 인해 파드 스케줄링에서 파드 이탈이 심한 EKS/IPv4 클러스터가 종종 지연되는 시나리오를 완화하는 것으로 알려져 있습니다. 또한 VPC-CNI 플러그인 고급 설정 튜닝 [WARM_IP/ENI*, MINIMUM_IP*](https://github.com/aws/amazon-vpc-cni-k8s#warm_ip_target)을 불필요하게 만드는 것으로 알려져 있습니다.

다음 다이어그램은 IPv6 워커 노드 ENI (엘라스틱 네트워크 인터페이스) 를 확대한 것입니다.

![illustration of worker subnet, including primary ENI with multiple IPv6 Addresses](./image-2.png)

모든 EKS 워커 노드에는 해당 DNS 항목과 함께 IPv4 및 IPv6 주소가 할당됩니다. 특정 워커 노드의 경우 이중 스택 서브넷의 단일 IPv4 주소만 사용됩니다. IPv6에 대한 EKS 지원을 통해 독보적인 외부 전용 IPv4 모델을 통해 IPv4 엔드포인트 (AWS, 온프레미스, 인터넷) 와 통신할 수 있습니다. EKS는 Pod에 IPv4 주소를 할당하고 구성하는 VPC CNI 플러그인의 보조 기능인 호스트-로컬 CNI 플러그인을 구현합니다. CNI 플러그인은 169.254.172.0/22 범위의 파드에 대해 호스트별로 라우팅할 수 없는 IPv4 주소를 할당합니다. 파드에 할당된 IPv4 주소는 *워커 노드에 고유한* 것으로 *워커 노드 이외의 다른 주소는 알려지지 않습니다*. 169.254.172.0/22는 대규모 인스턴스 유형을 지원할 수 있는 최대 1024개의 고유한 IPv4 주소를 제공합니다.

다음 다이어그램은 클러스터 경계 외부 (인터넷 아님) 에 있는 IPv4 엔드포인트에 연결하는 IPv6 Pod의 흐름을 보여줍니다.

![EKS/IPv6, IPv4 egress-only flow](./eks-ipv4-snat-cni.png)

위 다이어그램에서 파드는 엔드포인트에 대한 DNS 조회를 수행하고, IPv4 "A" 응답을 받으면 파드의 노드 전용 고유 IPv4 주소가 소스 네트워크 주소 변환 (SNAT) 을 통해 EC2 워커 노드에 연결된 기본 네트워크 인터페이스의 프라이빗 IPv4 (VPC) 주소로 변환됩니다.

또한 EK/IPv6 파드는 퍼블릭 IPv4 주소를 사용하여 인터넷을 통해 IPv4 엔드포인트에 연결해야 비슷한 흐름이 존재할 수 있습니다.
다음 다이어그램은 클러스터 경계 외부의 IPv4 엔드포인트에 연결하는 IPv6 Pod의 흐름을 보여줍니다 (인터넷 라우팅 가능).

![EKS/IPv6, IPv4 Internet egress-only flow](./eks-ipv4-snat-cni-internet.png)

위 다이어그램에서 파드는 엔드포인트에 대한 DNS 조회를 수행하고, IPv4 "A" 응답을 받으면 파드의 노드 전용 고유 IPv4 주소는 소스 네트워크 주소 변환 (SNAT) 을 통해 EC2 워커 노드에 연결된 기본 네트워크 인터페이스의 프라이빗 IPv4 (VPC) 주소로 변환됩니다. 그런 다음 파드 IPv4 주소 (소스 IPv4: EC2 기본 IP) 는 IPv4 NAT 게이트웨이로 라우팅되며, 여기서 EC2 기본 IP는 유효한 인터넷 라우팅 가능한 IPv4 퍼블릭 IP 주소 (NAT 게이트웨이 할당 퍼블릭 IP) 로 변환됩니다.

노드 간의 모든 파드 간 통신은 항상 IPv6 주소를 사용합니다. VPC CNI는 IPv4 연결을 차단하면서 IPv6를 처리하도록 iptables를 구성합니다.

쿠버네티스 서비스는 고유한 [로컬 IPv6 유니캐스트 주소 (ULA)](https://datatracker.ietf.org/doc/html/rfc4193) 에서 IPv6 주소 (클러스터IP) 만 수신합니다. IPv6 클러스터용 ULA 서비스 CIDR은 EKS 클러스터 생성 단계에서 자동으로 할당되며 수정할 수 없습니다. 다음 다이어그램은 파드에서 쿠버네티스 서비스로의 흐름을 나타냅니다.

![EKS/IPv6, IPv6 Pod to IPv6 k8s service (ClusterIP ULA) flow](./Pod-to-service-ipv6.png)

서비스는 AWS 로드밸런서를 사용하여 인터넷에 노출됩니다. 로드밸런서는 퍼블릭 IPv4 및 IPv6 주소, 즉 듀얼 스택 로드밸런서를 수신합니다. IPv6 클러스터 쿠버네티스 서비스에 액세스하는 IPv4 클라이언트의 경우 로드밸런서는 IPv4에서 IPv6으로의 변환을 수행합니다.

Amazon EKS는 프라이빗 서브넷에서 워커 노드와 파드를 실행할 것을 권장합니다. 퍼블릭 서브넷에 퍼블릭 로드밸런서를 생성하여 프라이빗 서브넷에 있는 노드에서 실행되는 파드로 트래픽을 로드 밸런싱할 수 있습니다.
다음 다이어그램은 EKS/IPv6 인그레스 기반 서비스에 액세스하는 인터넷 IPv4 사용자를 보여줍니다.

![인터넷 IPv4 사용자를 EKS/IPv6 인그레스 서비스로](./ipv4-internet-to-eks-ipv6.png)

> 참고: 위 패턴을 사용하려면 AWS 로드밸런서 컨트롤러의 [최신 버전](https://kubernetes-sigs.github.io/aws-load-balancer-controller)을 배포해야 합니다.

### EKS 컨트롤 플레인 <-> 데이터 플레인 통신

EKS는 듀얼 스택 모드 (IPv4/IPv6) 에서 크로스 어카운트 ENI (X-eni) 를 프로비저닝할 예정입니다. kubelet 및 kube-proxy와 같은 쿠버네티스 노드 구성 요소는 이중 스택을 지원하도록 구성되어 있습니다. Kubelet과 kube-proxy는 호스트네트워크 모드에서 실행되며 노드의 기본 네트워크 인터페이스에 연결된 IPv4 및 IPv6 주소 모두에 바인딩됩니다. 쿠버네티스 API 서버는 IPv6 기반인 X-ENI를 통해 파드 및 노드 컴포넌트와 통신합니다. 파드는 X-ENI를 통해 API 서버와 통신하며, 파드와 API-서버 간 통신은 항상 IPv6 모드를 사용한다.

![illustration of cluster including X-ENIs](./image-5.png)

## 권장 사항

### IPv4 EKS API에 대한 액세스 유지

EKS API는 IPv4에서만 액세스할 수 있습니다. 여기에는 클러스터 API 엔드포인트도 포함됩니다. IPv6 전용 네트워크에서는 클러스터 엔드포인트와 API에 액세스할 수 없습니다. 네트워크는 (1) IPv6와 IPv4 호스트 간의 통신을 용이하게 하는 NAT64/DNS64와 같은 IPv6 전환 메커니즘과 (2) IPv4 엔드포인트의 변환을 지원하는 DNS 서비스를 지원해야 합니다.

### 컴퓨팅 리소스 기반 일정

단일 IPv6 Prefix는 단일 노드에서 많은 파드를 실행하기에 충분하다.또한 이는 노드의 최대 파드 수에 대한 ENI 및 IP 제한을 효과적으로 제거합니다. IPv6는 최대 POD에 대한 직접적인 종속성을 제거하지만 m5.large와 같은 작은 인스턴스 유형에 Prefix 첨부 파일을 사용하면 IP 주소를 모두 사용하기 훨씬 전에 인스턴스의 CPU와 메모리 리소스가 고갈될 수 있습니다. 자체 관리형 노드 그룹 또는 사용자 지정 AMI ID가 있는 관리형 노드 그룹을 사용하는 경우 EKS 권장 최대 파드 값을 직접 설정해야 합니다.

다음 공식을 사용하여 IPv6 EKS 클러스터의 노드에 배포할 수 있는 최대 파드 수를 결정할 수 있습니다.

* ((인스턴스 유형별 네트워크 인터페이스 수 (네트워크 인터페이스당 Prefix 수-1)* 16) + 2

* ((3 ENIs)*((10 secondary IPs per ENI-1)* 16)) + 2 = 460 (real)

관리형 노드 그룹은 자동으로 최대 파드 수를 계산합니다. 리소스 제한으로 인한 파드 스케줄링 실패를 방지하려면 최대 파드 수에 대한 EKS 권장값을 변경하지 마세요.

### 기존의 사용자 지정 네트워킹의 목적 평가

[사용자 지정 네트워킹](https://aws.github.io/aws-eks-best-practices/networking/custom-networking/)이 현재 활성화되어 있는 경우 Amazon EKS는 IPv6에서 해당 네트워킹 요구 사항을 재평가할 것을 권장합니다. IPv4 고갈 문제를 해결하기 위해 사용자 지정 네트워킹을 사용하기로 선택한 경우 IPv6에서는 더 이상 사용자 지정 네트워킹을 사용할 필요가 없습니다. 사용자 지정 네트워킹을 사용하여 보안 요구 사항(예: 노드와 파드를 위한 별도의 네트워크)을 충족하는 경우 [EKS 로드맵 요청](https://github.com/aws/containers-roadmap/issues)을 제출하는 것이 좋습니다.

### EKS/IPv6 클러스터의 파게이트 파드

EKS는 파게이트에서 실행되는 파드용 IPv6를 지원합니다. Fargate에서 실행되는 파드는 VPC CIDR 범위 (IPv4&IPv6) 에서 분할된 IPv6 및 VPC 라우팅 가능한 프라이빗 IPv4 주소를 사용합니다. 간단히 말해서 EKS/Fargate 파드 클러스터 전체 밀도는 사용 가능한 IPv4 및 IPv6 주소로 제한됩니다. 향후 성장에 대비하여 듀얼 스택 서브넷/vPC CIDR의 크기를 조정하는 것이 좋습니다. 기본 서브넷에 사용 가능한 IPv4 주소가 없으면 IPv6 사용 가능 주소와 상관없이 새 Fargate Pod를 예약할 수 없습니다.

### AWS 로드밸런서 컨트롤러 (LBC) 배포

**업스트림 인트리 쿠버네티스 서비스 컨트롤러는 IPv6을 지원하지 않습니다**. AWS 로드밸런서 컨트롤러 애드온의 [최신 버전](https://kubernetes-sigs.github.io/aws-load-balancer-controller)을 사용하는 것이 좋습니다.LBC는 `"alb.ingress.kubernetes.io/ip-address type: dualstack"` 및 `"alb.ingress.kubernetes.io/target-type: ip""라는 주석이 달린 해당 쿠버네티스 서비스/인그레스 정의를 사용하는 경우에만 이중 스택 NLB 또는 이중 스택 ALB를 배포합니다.

AWS 네트워크 로드밸런서는 듀얼 스택 UDP 프로토콜 주소 유형을 지원하지 않습니다. 지연 시간이 짧은 실시간 스트리밍, 온라인 게임 및 IoT에 대한 강력한 요구 사항이 있는 경우 IPv4 클러스터를 실행하는 것이 좋습니다.UDP 서비스의 상태 점검 관리에 대한 자세한 내용은 ["UDP 트래픽을 쿠버네티스로 라우팅하는 방법"](https://aws.amazon.com/blogs/containers/how-to-route-udp-traffic-into-kubernetes/)을 참조하십시오.

### IMDSv2에 대한 의존성

IPv6 모드의 EKS는 아직 IMDSv2 엔드포인트를 지원하지 않습니다. IMDSv2가 EKS/IPv6으로 마이그레이션하는 데 방해가 되는 경우 지원 티켓을 여십시오

search    exclude  true         IPv6 EKS           iframe width  560  height  315  src  https   www youtube com embed zdXpTT0bZXo  title  YouTube video player  frameborder  0  allow  accelerometer  autoplay  clipboard write  encrypted media  gyroscope  picture in picture  web share  allowfullscreen   iframe   IPv6     EKS      EKS                IPv4               EKS  IPv6     IPv4                        IPv4                                                      Kubernetes    IPv4 IPv6        https   kubernetes io docs concepts services networking dual stack                   EKS IPv6  IPv6 CIDR                                       CIDR                     2                              IPv6 EKS                     IPv4                    IPv6                    IPv4                                     IPv4                          Amazon EKS IPv6          VPC IPv6              VPC   IPv4    Prefix  CIDR         16    28             GUA                        56 IPv6    Prefix               VPC          64    Prefix                                            DNS        IPv4     IPv6    VPC                   VPC        VPC                              EK IPv6               IPv4 IPv6 VPC                  Dual Stack VPC  mandatory foundation for EKS cluster in IPv6 mode    eks ipv6 foundation png   IPv6                                       VPC      GUA      IPv6 CIDR         VPC  RFC 4193  fd00    8    fc00    8                   ULA   https   en wikipedia org wiki Unique local address            IPv6                                    IPv6 CIDR                      VPC                   EIGW                                                                                EKS IPv6         Pod IPv6                      Dual Stack VPC  EKS Cluster in IPv6 Mode  Pods in private subnets egressing to Internet IPv6 endpoints    eks egress ipv6 png   IPv6                   VPC         https   docs aws amazon com whitepapers latest ipv6 on aws IPv6 on AWS html                 IPv6 EKS                    IPv6           EKS         IPv6           ULA              IPv6            IPv6       ULA     CIDR  IPv4                                                  EKS IPv6                                           Dual Stack VPC  EKS Cluster in IPv6 Mode  control plane ULA  data plane IPv6 GUA for EC2   Pods    eks cluster ipv6 foundation png          EKS IPv6  Prefix     VPC CNI      ENI IP                    Prefix     https   aws github io aws eks best practices networking prefix mode index linux                      Prefix     Nitro    EC2               EKS IPv6                EC2 Nitro                                     IPv6 Prefix   80                10 14 IPv6                       IP                             IPv6 Prefix     EKS                                   IPv4                 VPC CNI       ipamd          API                                   EKS IPv4                                           VPC CNI                WARM IP ENI   MINIMUM IP   https   github com aws amazon vpc cni k8s warm ip target                                      IPv6       ENI                                  illustration of worker subnet  including primary ENI with multiple IPv6 Addresses    image 2 png      EKS            DNS        IPv4   IPv6                                       IPv4            IPv6     EKS                   IPv4        IPv4        AWS                            EKS  Pod  IPv4               VPC CNI                     CNI              CNI       169 254 172 0 22                            IPv4                    IPv4                                                    169 254 172 0 22                           1024       IPv4                                                IPv4             IPv6 Pod                EKS IPv6  IPv4 egress only flow    eks ipv4 snat cni png                           DNS           IPv4  A                       IPv4                    SNAT       EC2                                IPv4  VPC                 EK IPv6         IPv4                  IPv4                                                       IPv4             IPv6 Pod                             EKS IPv6  IPv4 Internet egress only flow    eks ipv4 snat cni internet png                           DNS           IPv4  A                       IPv4                    SNAT       EC2                                IPv4  VPC                      IPv4        IPv4  EC2    IP    IPv4 NAT                   EC2    IP                  IPv4     IP     NAT              IP                                 IPv6            VPC CNI  IPv4           IPv6        iptables                             IPv6           ULA   https   datatracker ietf org doc html rfc4193     IPv6         IP           IPv6       ULA     CIDR  EKS                                                                             EKS IPv6  IPv6 Pod to IPv6 k8s service  ClusterIP ULA  flow    Pod to service ipv6 png        AWS                                    IPv4   IPv6                           IPv6                       IPv4                  IPv4   IPv6                Amazon EKS                                                                                EKS IPv6                        IPv4                    IPv4      EKS IPv6              ipv4 internet to eks ipv6 png                     AWS                     https   kubernetes sigs github io aws load balancer controller                  EKS                         EKS            IPv4 IPv6              ENI  X eni                  kubelet   kube proxy                                             Kubelet  kube proxy                                           IPv4   IPv6                      API     IPv6     X ENI                              X ENI     API               API             IPv6              illustration of cluster including X ENIs    image 5 png                 IPv4 EKS API             EKS API  IPv4                           API               IPv6                        API                      1  IPv6  IPv4                    NAT64 DNS64     IPv6           2  IPv4                 DNS                                       IPv6 Prefix                                                  ENI   IP                  IPv6     POD                     m5 large                 Prefix             IP                         CPU                                              AMI ID                        EKS                                       IPv6 EKS                                                                                Prefix   1   16    2      3 ENIs    10 secondary IPs per ENI 1   16     2   460  real                                                                             EKS                                                           https   aws github io aws eks best practices networking custom networking                   Amazon EKS  IPv6                                 IPv4                                          IPv6                                                                                EKS         https   github com aws containers roadmap issues                      EKS IPv6                EKS                  IPv6         Fargate            VPC CIDR     IPv4 IPv6         IPv6   VPC              IPv4                    EKS Fargate                       IPv4   IPv6                                  vPC CIDR                                   IPv4         IPv6                  Fargate Pod                   AWS             LBC                                 IPv6               AWS                         https   kubernetes sigs github io aws load balancer controller                LBC    alb ingress kubernetes io ip address type  dualstack       alb ingress kubernetes io target type  ip                                                  NLB          ALB          AWS                   UDP                                                     IoT                      IPv4                    UDP                             UDP                        https   aws amazon com blogs containers how to route udp traffic into kubernetes                 IMDSv2          IPv6     EKS     IMDSv2                   IMDSv2  EKS IPv6