eks IPVS IPVS IPVS IP EKS iptables 1 000 iptables iptables nftables nftable kube proxy https kubernetes io docs reference networking virtual ips proxy mode nftables IPVS GA IPVS IPVS IPVS kube proxy

Answer:
# IPVS 모드에서 kube-proxy 실행

IPVS (IP 가상 서버) 모드의 EKS는 레거시 iptables 모드에서 실행되는 `kube-proxy`와 함께 1,000개 이상의 서비스가 포함된 대규모 클러스터를 실행할 때 흔히 발생하는 [네트워크 지연 문제](https://aws.github.io/aws-eks-best-practices/reliability/docs/controlplane/#running-large-clusters)를 해결합니다.이러한 성능 문제는 각 패킷에 대한 iptables 패킷 필터링 규칙을 순차적으로 처리한 결과입니다.이 지연 문제는 iptables의 후속 버전인 nftables에서 해결되었습니다.하지만 이 글을 쓰는 시점 현재, nftable을 활용하기 위한 [kube-proxy는 아직 개발 중] (https://kubernetes.io/docs/reference/networking/virtual-ips/#proxy-mode-nftables) 이다.이 문제를 해결하려면 IPVS 모드에서 `kube-proxy`가 실행되도록 클러스터를 구성할 수 있다.

## 개요

[쿠버네티스 버전 1.11](https://kubernetes.io/blog/2018/07/09/ipvs-based-in-cluster-load-balancing-deep-dive/) 부터 GA가 된 IPVS는 선형 검색이 아닌 해시 테이블을 사용하여 패킷을 처리하므로 수천 개의 노드와 서비스가 있는 클러스터에 효율성을 제공합니다.IPVS는 로드 밸런싱을 위해 설계되었으므로 쿠버네티스 네트워킹 성능 문제에 적합한 솔루션입니다.

IPVS는 트래픽을 백엔드 포드에 분산하기 위한 몇 가지 옵션을 제공합니다.각 옵션에 대한 자세한 내용은 [공식 쿠버네티스 문서](https://kubernetes.io/docs/reference/networking/virtual-ips/#proxy-mode-ipvs) 에서 확인할 수 있지만, 간단한 목록은 아래에 나와 있다.라운드 로빈과 최소 연결은 쿠버네티스의 IPVS 로드 밸런싱 옵션으로 가장 많이 사용되는 옵션 중 하나입니다.
```
- rr (라운드 로빈)
- wrr (웨이티드 라운드 로빈)
- lc (최소 연결)
- wlc (가중치가 가장 적은 연결)
- lblc (지역성 기반 최소 연결)
- lblcr (복제를 통한 지역성 기반 최소 연결)
- sh (소스 해싱)
- dh (데스티네이션 해싱)
- sed (최단 예상 지연)
- nq (줄 서지 마세요)
```

### 구현

EKS 클러스터에서 IPVS를 활성화하려면 몇 단계만 거치면 됩니다.가장 먼저 해야 할 일은 EKS 작업자 노드 이미지에 Linux 가상 서버 관리 `ipvsadm` 패키지가 설치되어 있는지 확인하는 것입니다.Amazon Linux 2023과 같은 Fedora 기반 이미지에 이 패키지를 설치하려면 작업자 노드 인스턴스에서 다음 명령을 실행할 수 있습니다.
```bash
sudo dnf install -y ipvsadm
```
Ubuntu와 같은 데비안 기반 이미지에서는 설치 명령이 다음과 같습니다.
```bash
sudo apt-get install ipvsadm
```

다음으로 위에 나열된 IPVS 구성 옵션에 대한 커널 모듈을 로드해야 합니다.재부팅해도 계속 작동하도록 이러한 모듈을 `/etc/modules-load.d/` 디렉토리 내의 파일에 기록하는 것이 좋습니다.
```bash
sudo sh -c 'cat << EOF > /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_lc
ip_vs_wlc
ip_vs_lblc
ip_vs_lblcr
ip_vs_sh
ip_vs_dh
ip_vs_sed
ip_vs_nq
nf_conntrack
EOF'
```
다음 명령을 실행하여 이미 실행 중인 시스템에서 이러한 모듈을 로드할 수 있습니다.
```bash
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_lc
sudo modprobe ip_vs_wlc
sudo modprobe ip_vs_lblc
sudo modprobe ip_vs_lblcr
sudo modprobe ip_vs_sh
sudo modprobe ip_vs_dh
sudo modprobe ip_vs_sed
sudo modprobe ip_vs_nq
sudo modprobe nf_conntrack
```
!!! note
    이러한 작업자 노드 단계는 [사용자 데이터 스크립트](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html) 를 통해 작업자 노드의 부트스트랩 프로세스의 일부로 실행하거나 사용자 지정 작업자 노드 AMI를 빌드하기 위해 실행되는 빌드 스크립트에서 실행하는 것이 좋습니다.

다음으로 IPVS 모드에서 실행되도록 클러스터의 `kube-proxy` DaemonSet를 구성합니다. 이는 `kube-proxy` `mode`를 `ipvs`로 설정하고 `ipvs scheduler`를 위에 나열된 로드 밸런싱 옵션 중 하나로 설정하면 됩니다(예: 라운드 로빈의 경우 `rr`).
!!! Warning
    이는 운영 중단을 야기하는 변경이므로 근무 시간 외 시간에 수행해야 합니다.영향을 최소화하려면 초기 EKS 클러스터 생성 중에 이러한 변경을 수행하는 것이 좋습니다.

`kube-proxy` EKS 애드온을 업데이트하여 AWS CLI 명령을 실행하여 IPVS를 활성화할 수 있습니다.
```bash
aws eks update-addon --cluster-name $CLUSTER_NAME --addon-name kube-proxy \
  --configuration-values '{"ipvs": {"scheduler": "rr"}, "mode": "ipvs"}' \
  --resolve-conflicts OVERWRITE
```
또는 클러스터에서 `kube-proxy-config` 컨피그맵을 수정하여 이 작업을 수행할 수 있습니다.
```bash
kubectl -n kube-system edit cm kube-proxy-config
```
`ipvs`에서 `scheduler` 설정을 찾아 값을 위에 나열된 IPVS 로드 밸런싱 옵션 중 하나로 설정합니다(예: 라운드 로빈의 경우 `rr`)
기본값이 `iptables`인 `mode` 설정을 찾아 값을 `ipvs`로 변경합니다.
두 옵션 중 하나의 결과는 아래 구성과 유사해야 합니다.
```yaml hl_lines="9 13"
  iptables:
    masqueradeAll: false
    masqueradeBit: 14
    minSyncPeriod: 0s
    syncPeriod: 30s
  ipvs:
    excludeCIDRs: null
    minSyncPeriod: 0s
    scheduler: "rr"
    syncPeriod: 30s
  kind: KubeProxyConfiguration
  metricsBindAddress: 0.0.0.0:10249
  mode: "ipvs"
  nodePortAddresses: null
  oomScoreAdj: -998
  portRange: ""
  udpIdleTimeout: 250ms
```

이러한 변경을 수행하기 전에 작업자 노드가 클러스터에 연결된 경우 kube-proxy 데몬셋을 다시 시작해야 합니다.
```bash
kubectl -n kube-system rollout restart ds kube-proxy
```

### 유효성 검사

작업자 노드 중 하나에서 다음 명령을 실행하여 클러스터 및 작업자 노드가 IPVS 모드에서 실행되고 있는지 확인할 수 있습니다.
```bash
sudo ipvsadm -L
```

최소한 쿠버네티스 API 서버 서비스에 대한 항목이 `10.100.0.1`이고 CoreDNS 서비스에 대한 항목이 `10.100.0.10`인 아래와 비슷한 결과를 볼 수 있을 것이다.
```hl_lines="4 7 10"
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  ip-10-100-0-1.us-east-1. rr
  -> ip-192-168-113-81.us-eas Masq        1      0          0
  -> ip-192-168-162-166.us-ea Masq        1      1          0
TCP  ip-10-100-0-10.us-east-1 rr
  -> ip-192-168-104-215.us-ea Masq        1      0          0
  -> ip-192-168-123-227.us-ea Masq        1      0          0
UDP  ip-10-100-0-10.us-east-1 rr
  -> ip-192-168-104-215.us-ea Masq        1      0          0
  -> ip-192-168-123-227.us-ea Masq        1      0          0
```
!!! note
    이 예제 출력은 서비스 IP 주소 범위가 `10.100.0.0/16`인 EKS 클러스터에서 가져온 것입니다

IPVS      kube proxy     IPVS  IP            EKS      iptables            kube proxy      1 000                                                    https   aws github io aws eks best practices reliability docs controlplane  running large clusters                             iptables                                     iptables         nftables                              nftable           kube proxy            https   kubernetes io docs reference networking virtual ips  proxy mode nftables                 IPVS       kube proxy                                           1 11  https   kubernetes io blog 2018 07 09 ipvs based in cluster load balancing deep dive      GA    IPVS                                                                      IPVS                                                    IPVS                                                                     https   kubernetes io docs reference networking virtual ips  proxy mode ipvs                                                        IPVS                                          rr            wrr                 lc           wlc                   lblc                  lblcr                         sh           dh               sed              nq                         EKS        IPVS                                     EKS             Linux           ipvsadm                          Amazon Linux 2023     Fedora                                                          bash sudo dnf install  y ipvsadm     Ubuntu                                       bash sudo apt get install ipvsadm                  IPVS                                                    etc modules load d                                bash sudo sh  c  cat    EOF    etc modules load d ipvs conf ip vs ip vs rr ip vs wrr ip vs lc ip vs wlc ip vs lblc ip vs lblcr ip vs sh ip vs dh ip vs sed ip vs nq nf conntrack EOF                                                        bash sudo modprobe ip vs  sudo modprobe ip vs rr sudo modprobe ip vs wrr sudo modprobe ip vs lc sudo modprobe ip vs wlc sudo modprobe ip vs lblc sudo modprobe ip vs lblcr sudo modprobe ip vs sh sudo modprobe ip vs dh sudo modprobe ip vs sed sudo modprobe ip vs nq sudo modprobe nf conntrack         note                                   https   docs aws amazon com AWSEC2 latest UserGuide user data html                                                   AMI                                             IPVS                   kube proxy  DaemonSet             kube proxy   mode    ipvs         ipvs scheduler                                                  rr        Warning                                                             EKS                                    kube proxy  EKS             AWS CLI          IPVS                  bash aws eks update addon   cluster name  CLUSTER NAME   addon name kube proxy       configuration values    ipvs     scheduler    rr     mode    ipvs          resolve conflicts OVERWRITE                kube proxy config                                  bash kubectl  n kube system edit cm kube proxy config      ipvs     scheduler                   IPVS                                      rr         iptables    mode             ipvs                                             yaml hl lines  9 13    iptables      masqueradeAll  false     masqueradeBit  14     minSyncPeriod  0s     syncPeriod  30s   ipvs      excludeCIDRs  null     minSyncPeriod  0s     scheduler   rr      syncPeriod  30s   kind  KubeProxyConfiguration   metricsBindAddress  0 0 0 0 10249   mode   ipvs    nodePortAddresses  null   oomScoreAdj   998   portRange       udpIdleTimeout  250ms                                           kube proxy                      bash kubectl  n kube system rollout restart ds kube proxy                                                           IPVS                              bash sudo ipvsadm  L                API                 10 100 0 1    CoreDNS              10 100 0 10                              hl lines  4 7 10  IP Virtual Server version 1 2 1  size 4096  Prot LocalAddress Port Scheduler Flags      RemoteAddress Port           Forward Weight ActiveConn InActConn TCP  ip 10 100 0 1 us east 1  rr      ip 192 168 113 81 us eas Masq        1      0          0      ip 192 168 162 166 us ea Masq        1      1          0 TCP  ip 10 100 0 10 us east 1 rr      ip 192 168 104 215 us ea Masq        1      0          0      ip 192 168 123 227 us ea Masq        1      0          0 UDP  ip 10 100 0 10 us east 1 rr      ip 192 168 104 215 us ea Masq        1      0          0      ip 192 168 123 227 us ea Masq        1      0          0         note                  IP         10 100 0 0 16   EKS


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

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

# Amazon VPC CNI

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

Amazon EKS는 [Amazon VPC 컨테이너 네트워크 인터페이스(VPC CNI)](https://github.com/aws/amazon-vpc-cni-k8s) 플러그인을 통해 클러스터 네트워킹을 구현합니다. CNI 플러그인을 사용하면 쿠버네티스 파드가 VPC 네트워크에서와 동일한 IP 주소를 가질 수 있습니다. 구체적으로는 파드 내부의 모든 컨테이너는 네트워크 네임스페이스를 공유하며 로컬 포트를 사용하여 서로 통신할 수 있습니다.

Amazon VPC CNI에는 두 가지 구성 요소가 있습니다.

* CNI 바이너리는 파드 간 통신을 활성화하는 파드 네트워크를 구성합니다. CNI 바이너리는 노드의 루트 파일 시스템에서 실행되며, 새 파드가 노드에 추가되거나 기존 파드가 노드에서 제거될 때 kubelet에 의해 호출됩니다.
* 오래 실행되는(long-running) 노드 로컬(node-local) IP 주소 관리 (IPAM) 데몬인 ipamd는 다음을 담당합니다.
  * 노드의 ENI 관리 및
  * 사용 가능한 IP 주소 또는 Prefix의 웜 풀 유지

인스턴스가 생성되면 EC2는 기본 서브넷과 연결된 기본 ENI를 생성하여 연결합니다. 기본 서브넷은 퍼블릭 또는 프라이빗일 수 있습니다. 호스트 네트워크 모드에서 실행되는 파드는 노드 기본 ENI에 할당된 기본 IP 주소를 사용하며 호스트와 동일한 네트워크 네임스페이스를 공유합니다.

CNI 플러그인은 노드의 [Elastic Network Interface (ENI)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html)를 관리합니다. 노드가 프로비저닝되면 CNI 플러그인은 노드의 서브넷에서 기본 ENI에 슬롯 풀(IP 또는 Prefix)을 자동으로 할당합니다. 이 풀을 *웜 풀*이라고 하며, 크기는 노드의 인스턴스 유형에 따라 결정됩니다. CNI 설정에 따라 슬롯은 IP 주소 또는 Prefix일 수 있습니다. ENI의 슬롯이 할당되면 CNI는 웜 슬롯 풀이 있는 추가 ENI를 노드에 연결할 수 있습니다. 이러한 추가 ENI를 보조 ENI라고 합니다. 각 ENI는 인스턴스 유형에 따라 특정 갯수의 슬롯만 지원할 수 있습니다. CNI는 필요한 슬롯 수를 기반으로 인스턴스에 더 많은 ENI를 연결합니다. 여기서 슬롯 갯수는 보통 파드 갯수에 해당합니다. 이 프로세스는 노드가 추가 ENI를 더 이상 제공할 수 없을 때까지 계속됩니다. 또한 CNI는 파드 시작 속도를 높이기 위해 '웜' ENI와 슬롯을 사전 할당합니다. 참고로, 각 인스턴스 유형에는 연결할 수 있는 최대 ENI 수가 존재합니다. 이 조건은 컴퓨팅 리소스와 더불어 파드 밀도(노드당 파드 수)에 대한 또 하나의 제약 조건입니다.

![flow chart illustrating procedure when new ENI delegated prefix is needed](./image.png)

최대 네트워크 인터페이스 수, 사용할 수 있는 최대 슬롯 수는 EC2 인스턴스 유형에 따라 다릅니다. 각 파드는 슬롯의 IP 주소를 사용하기 때문에 특정 EC2 인스턴스에서 실행할 수 있는 파드의 수는 연결할 수 있는 ENI의 수와 각 ENI가 지원하는 슬롯의 수에 따라 달라집니다. 인스턴스의 CPU 및 메모리 리소스가 고갈되지 않도록 EKS 사용 가이드에 따라 최대 파드를 설정할 것을 권장합니다. `hostNetwork`를 사용하는 파드는 이 계산에서 제외됩니다. 주어진 인스턴스 유형에 대한 EKS의 권장 최대 파드 개수를 계산하기 위해 [max-pod-calculator.sh](https://github.com/awslabs/amazon-eks-ami/blob/master/files/max-pods-calculator.sh)라는 스크립트를 사용할 수 있습니다.

## 개요

보조 IP 모드는 VPC CNI의 기본 모드입니다. 이 가이드에서는 보조 IP 모드가 활성화된 경우의 VPC CNI 동작에 대한 일반적인 개요를 제공합니다. ipamd의 기능(IP 주소 할당)은 VPC CNI의 구성 설정, 예를 들어 [Prefix 모드](../prefix-mode/index_linux.md), [파드당 보안 그룹 수](../sgpp/index.md), [사용자 지정 네트워킹](../custom-networking/index.md)에 따라 달라질 수 있습니다.

Amazon VPC CNI는 워커 노드에 aws-node라는 이름의 쿠버네티스 데몬셋으로 배포됩니다. 워커 노드가 프로비저닝되면 primary ENI라고 하는 기본 ENI가 연결됩니다. CNI는 노드의 기본 ENI에 연결된 서브넷에서 웜 풀의 ENI와 보조 IP 주소를 할당합니다. 기본적으로 ipamd는 노드에 추가 ENI를 할당하려고 시도합니다. 단일 파드가 스케줄되고 기본 ENI의 보조 IP 주소가 할당되면 IPAMD는 추가 ENI를 할당합니다. 이 “웜” ENI는 더 빠른 파드 네트워킹을 가능하게 합니다. 보조 IP 주소 풀이 부족해지면 CNI는 다른 ENI를 추가하여 더 많은 주소를 할당합니다.

풀의 ENI 및 IP 주소 수는 [WARM_ENI_TARGET, WARM_IP_TARGET, MINIMUM_IP_TARGET](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/eni-and-ip-target.md)이라는 환경 변수를 통해 구성됩니다. `aws-node` 데몬셋은 충분한 수의 ENI가 연결되어 있는지 주기적으로 확인합니다. `WARM_ENI_TARGET` 혹은 `WARM_IP_TARGET` 및 `MINIMUM_IP_TARGET` 조건이 충족되면 충분한 수의 ENI가 연결됩니다. 연결된 ENI가 충분하지 않은 경우 CNI는 `MAX_ENI` 한도에 도달할 때까지 EC2에 API를 호출하여 추가로 ENI를 연결합니다.

* `WARM_ENI_TARGET` - 정수 값, 값이 >0이면 요구 사항이 활성화된 것입니다.
  * 관리할 웜 ENI의 수입니다. ENI는 노드에 보조 ENI로 연결되면 “웜” 상태가 되지만, 어떤 파드에서도 사용되지 않습니다. 구체적으로 말하면 ENI의 IP 주소가 파드와 연결되지 않은 상태입니다.
  * 예: ENI가 2개이고 각 ENI가 5개의 IP 주소를 지원하는 인스턴스를 예로 들어 보겠습니다. WARM_ENI_TARGET은 1로 설정되어 있습니다. 인스턴스에 정확히 5개의 IP 주소가 연결된 경우 CNI는 인스턴스에 2개의 ENI를 연결한 상태로 유지합니다. 첫 번째 ENI가 사용 중이며 이 ENI에서 사용 가능한 5개 IP 주소가 모두 사용됩니다. 두 번째 ENI는 풀에 5개 IP 주소가 모두 있는 “웜” 상태입니다. 인스턴스에서 다른 파드를 시작하는 경우 6번째 IP 주소가 필요합니다. CNI는 이 6번째 파드에 두 번째 ENI 및 풀의 5개의 IP에서 IP 주소를 할당합니다. 이제 두 번째 ENI가 사용되며 더 이상 “웜” 상태가 아니게 됩니다. CNI는 최소 1개의 웜 ENI를 유지하기 위해 세 번째 ENI를 할당합니다.

!!! Note
    웜 ENI도 VPC의 CIDR에 있는 IP 주소를 사용합니다. IP 주소는 파드와 같은 워크로드에 연결되기 전까지는 “미사용” 또는 “웜” 상태가 됩니다.

* `WARM_IP_TARGET`, 정수, 값이 >0이면 요구 사항이 활성화된 것입니다.
  * 유지할 웜 IP 주소 수입니다. 웜 IP는 활성 연결된 ENI에서 사용할 수 있지만 파드에 할당되지는 않습니다. 즉, 사용 가능한 웜 IP의 수는 추가 ENI 없이 파드에 할당할 수 있는 IP의 수입니다.
  * 예: ENI가 1개이고 각 ENI가 20개의 IP 주소를 지원하는 인스턴스를 예로 들어 보겠습니다. WARM_IP_TARGET은 5로 설정되어 있습니다. WARM_ENI_TARGET은 0으로 설정되어 있습니다. 16번째 IP 주소가 필요할 때까지는 ENI 1개만 연결됩니다. 그 다음에는 CNI가 서브넷 CIDR의 가능한 주소 20개를 사용하여 두 번째 ENI를 연결합니다.
* `MINIMUM_IP_TARGET`, 정수, 값이 >0이면 요구 사항이 활성화된 것입니다.
  * 언제든지 할당할 수 있는 최소 IP 주소 수입니다. 이는 일반적으로 인스턴스 시작 시 여러 ENI 할당을 미리 불러오는 데 사용됩니다.
  * 예: 새로 시작한 인스턴스를 예로 들어보겠습니다. ENI는 1개이고 각 ENI는 10개의 IP 주소를 지원합니다. MINIMUM_IP_TARGET은 100으로 설정되어 있습니다. ENI는 총 100개의 주소에 대해 9개의 ENI를 즉시 추가로 연결합니다. 이는 `WARM_IP_TARGET` 또는 `WARM_ENI_TARGET`값과 상관없이 발생합니다.

이 프로젝트에는 [서브넷 계산기 Excel 문서](../subnet-calc/subnet-calc.xlsx)가 포함되어 있습니다. 이 문서는 `WARM_IP_TARGET` 및 `WARM_ENI_TARGET`과 같은 다양한 ENI 구성 옵션에 따라 지정된 워크로드의 IP 주소 사용을 시뮬레이션합니다.

![illustration of components involved in assigning an IP address to a pod](./image-2.png)

Kubelet이 파드 추가 요청을 받으면, CNI 바이너리는 ipamd에 사용 가능한 IP 주소를 쿼리하고, ipamd는 이를 파드에 제공합니다. CNI 바이너리는 호스트와 파드 네트워크를 연결합니다.

노드에 배포된 파드는 기본적으로 기본 ENI와 동일한 보안 그룹에 할당되며, 파드를 다른 보안 그룹으로 구성할 수도 있습니다.

![second illustration of components involved in assigning an IP address to a pod](./image-3.png)

IP 주소 풀이 고갈되면 플러그인은 자동으로 다른 Elastic Network Interface를 인스턴스에 연결하고 해당 인터페이스에 다른 보조 IP 주소 세트를 할당합니다. 이 프로세스는 노드가 더 이상 추가 Elastic Network Interface를 지원할 수 없을 때까지 계속됩니다.

![third illustration of components involved in assigning an IP address to a pod](./image-4.png)

파드가 삭제되면 VPC CNI는 파드의 IP 주소를 30초 쿨다운 캐시에 저장합니다. 쿨 다운 캐시의 IP는 신규 파드에 할당되지 않습니다. 쿨링오프 주기가 끝나면 VPC CNI는 파드 IP를 웜 풀로 다시 옮깁니다. 쿨링 오프 주기는 파드 IP 주소가 너무 이르게 재활용되는 것을 방지하고 모든 클러스터 노드의 kube-proxy가 iptables 규칙 업데이트를 완료할 수 있도록 합니다. IP 또는 ENI의 수가 웜 풀 설정 수를 초과하면 ipamd 플러그인은 VPC에 IP와 ENI를 반환합니다.

보조 IP 모드에서 앞서 설명한 바와 같이, 각 파드는 인스턴스에 연결된 ENI 중 하나로부터 하나의 보조 프라이빗 IP 주소를 수신합니다. 각 파드는 IP 주소를 사용하기 때문에 특정 EC2 인스턴스에서 실행할 수 있는 파드의 수는 연결할 수 있는 ENI의 수와 지원하는 IP 주소의 수에 따라 달라집니다. VPC CNI는 [limit](https://github.com/aws/amazon-vpc-resource-controller-k8s/blob/master/pkg/aws/vpc/limits.go)파일을 확인하여 각 인스턴스 유형에 허용되는 ENI와 IP 주소 수를 알아냅니다.

다음 공식을 사용하여 노드에 배포할 수 있는 최대 파드 수를 확인할 수 있습니다.

`(인스턴스 유형의 네트워크 인터페이스 수 × (네트워크 인터페이스당 IP 주소 수 - 1)) + 2`

+2는 kube-proxy 및 VPC CNI와 같은 호스트 네트워킹에서 필요한 파드를 나타냅니다. Amazon EKS에서는 각 노드에서 kube-proxy 및 VPC CNI가 작동해야 하며, 이러한 요구 사항은 max-pods 값에 반영됩니다. 추가 호스트 네트워킹 파드를 실행하려면 max-pods 값 업데이트를 고려해 보십시오.

+2는 kube-proxy 및 VPC CNI와 같은 호스트 네트워킹을 사용하는 쿠버네티스 파드를 나타냅니다. Amazon EKS는 모든 노드에서 kube-proxy와 VPC CNI를 실행해야 하며, 이는 max-pods 기준으로 계산됩니다. 더 많은 호스트 네트워킹 파드를 실행할 계획이라면 max-pods 값을 업데이트하는 것을 고려해 보십시오. 시작 템플릿에서 `--kubelet-extra-args "—max-pods=110"`을 사용자 데이터로 지정할 수 있습니다.

예를 들어, c5.large 노드 3개(ENI 3개, ENI당 최대 10개 IP)가 있는 클러스터에서 클러스터가 시작되고, CoreDNS 파드 2개가 있는 경우 CNI는 49개의 IP 주소를 사용하여 웜 풀에 보관합니다. 웜 풀을 사용하면 애플리케이션 배포 시 파드를 더 빠르게 시작할 수 있습니다.

노드 1 (CoreDNS 파드 포함): ENI 2개, IP 20개 할당

노드 2 (CoreDNS 파드 포함): ENI 2개, IP 20개 할당

노드 3 (파드 없음): ENI 1개, IP 10개 할당

주로 데몬셋으로 실행되는 인프라 파드는 각각 최대 파드 수에 영향을 미친다는 점을 고려합니다. 여기에는 다음이 포함될 수 있습니다.

* CoreDNS
* Amazon Elastic LoadBalancer
* metrics-server 운영용 Pods

이러한 파드들의 용량을 조합하여 인프라를 계획하는 것을 권장합니다. 각 인스턴스 유형에서 지원하는 최대 파드 수 목록은 GitHub의 [eni-max-Pods.txt](https://github.com/awslabs/amazon-eks-ami/blob/master/files/eni-max-pods.txt)를 참조합니다.

![illustration of multiple ENIs attached to a node](./image-5.png)

## 권장 사항

### VPC CNI 관리형 애드온 배포

클러스터를 프로비저닝하면 Amazon EKS가 자동으로 VPC CNI를 설치합니다. 그럼에도 불구하고 Amazon EKS는 클러스터가 컴퓨팅, 스토리지, 네트워킹과 같은 기본 AWS 리소스와 상호 작용할 수 있도록 하는 관리형 애드온을 지원합니다. VPC CNI를 비롯한 관리형 애드온을 사용하여 클러스터를 배포하는 것이 좋습니다.

Amazon EKS 관리형 애드온은 Amazon EKS 클러스터를 위한 VPC CNI 설치 및 관리를 제공합니다. Amazon EKS 애드온에는 최신 보안 패치, 버그 수정이 포함되어 있으며, Amazon EKS와 호환되는지 AWS의 검증을 거쳤습니다. VPC CNI 애드온을 사용하면 Amazon EKS 클러스터의 보안 및 안정성을 지속적으로 보장하고 추가 기능을 설치, 구성 및 업데이트하는 데 필요한 노력을 줄일 수 있습니다. 또한 관리형 애드온은 Amazon EKS API, AWS 관리 콘솔, AWS CLI 및 eksctl을 통해 추가, 업데이트 또는 삭제할 수 있습니다.

`kubectl get` 명령어와 함께 `--show-managed-fields` 플래그를 사용하여 VPC CNI의 관리형 필드를 찾을 수 있습니다.

```
kubectl get daemonset aws-node --show-managed-fields -n kube-system -o yaml
```

관리형 애드온은 15분마다 구성을 자동으로 덮어쓰는 것으로 구성 변동을 방지합니다. 즉, 애드온 생성 후 Kubernetes API를 통해 변경한 관리형 애드온은 자동화된 드리프트 방지 프로세스에 의해 덮어쓰여지고 애드온 업데이트 프로세스 중에도 기본값으로 설정됩니다.

EKS에서 관리하는 필드는 managedFields 하위에 나열되며 이 필드에 대한 관리자는 EKS입니다. EKS에서 관리하는 필드에는 서비스 어카운트, 이미지, 이미지 URL, liveness probe, readiness probe, 레이블, 볼륨 및 볼륨 마운트가 포함됩니다.

!!! Info
WARM_ENI_TARGET, WARM_IP_TARGET, MINIMUM_IP_TARGET과 같이 자주 사용되는 필드는 관리되지 않으며 조정되지 않습니다. 이러한 필드의 변경 사항은 애드온 업데이트 시에도 유지됩니다.

프로덕션 클러스터를 업데이트하기 전, 특정 구성의 비프로덕션 클러스터에서 애드온 동작을 테스트하는 것이 좋습니다. 또한 [애드온](https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html) 구성에 대해서는 EKS 사용자 가이드의 단계를 따라합니다.

#### 관리형 애드온으로 마이그레이션

자체 관리형 VPC CNI의 버전 호환성을 관리하고 보안 패치를 업데이트합니다. 자체 관리형 애드온을 업데이트하려면 [EKS 사용자 가이드](https://docs.aws.amazon.com/eks/latest/userguide/managing-vpc-cni.html#updating-vpc-cni-add-on)에 설명된 쿠버네티스 API와 안내 사항들을 활용해야 합니다. 기존 EKS 클러스터의 경우, 관리형 애드온으로 마이그레이션하는 것이 좋으며, 마이그레이션 전에 현재 CNI 설정을 백업해 둘 것을 권장합니다. 관리형 애드온을 구성하기 위해 Amazon EKS API, AWS 관리 콘솔 또는 AWS 명령줄 인터페이스를 활용할 수 있습니다.

```
kubectl apply view-last-applied daemonset aws-node -n kube-system > aws-k8s-cni-old.yaml
```

필드 기본 설정에 관리형으로 표시된 경우 Amazon EKS는 CNI 구성 설정을 대체합니다. 관리형 필드를 수정하지 않도록 주의합니다. 애드온은 *웜* 환경 변수 및 CNI 모드와 같은 구성 필드를 조정하지 않습니다. 파드와 애플리케이션은 관리형 CNI로 마이그레이션하는 동안 계속 실행됩니다.

#### 업데이트 전 CNI 설정 백업

VPC CNI는 고객의 데이터 플레인(노드)에서 실행되므로 Amazon EKS는 신규 버전이 출시되거나 [클러스터를 업데이트](https://docs.aws.amazon.com/eks/latest/userguide/update-cluster.html)한 후에 신규 쿠버네티스 마이너 버전으로 (관리형 및 자체 관리형)애드온을 자동으로 업데이트하지 않습니다. 기존 클러스터의 애드온을 업데이트하려면 update-addon API를 사용하거나 EKS 콘솔에서 애드온용 지금 업데이트(Update Now) 링크를 클릭하여 업데이트를 트리거해야 합니다. 자체 관리형 애드온을 배포한 경우 [자체 관리형 VPC CNI 애드온 업데이트](https://docs.aws.amazon.com/eks/latest/userguide/managing-vpc-cni.html#updating-vpc-cni-add-on)에 안내된 단계를 따르도록 합니다.

마이너 버전은 한 번에 하나씩 업데이트하는 것이 좋습니다. 예를 들어 현재 마이너 버전이 `1.9`이고 `1.11`로 업데이트할 경우, 먼저 `1.10`의 최신 패치 버전으로 업데이트한 다음 `1.11`의 최신 패치 버전으로 업데이트해야 합니다.

Amazon VPC CNI를 업데이트하기 전에 AWS 노드 데몬셋 검사를 수행합니다. 기존 설정을 백업합니다. 관리형 애드온을 사용하는 경우 Amazon EKS에서 재정의할 수 있는 설정을 업데이트하지 않았는지 확인합니다. 고객의 자동화 워크플로의 업데이트 훅을 적용하거나 혹은 애드온 업데이트 후 수동 적용 단계를 추가할 것을 권장합니다.

```
kubectl apply view-last-applied daemonset aws-node -n kube-system > aws-k8s-cni-old.yaml
```

자체 관리형 애드온의 경우 백업을 GitHub의 `releases` 내용과 비교하여 사용 가능한 버전을 확인하고 업데이트하려는 버전의 변경 사항을 숙지합니다. 자체 관리형 애드온을 관리하기 위해 헬름(Helm)을 사용하는 것을 권장하며, values 파일을 활용하여 설정을 적용하는 것을 권장합니다. 데몬셋 삭제와 관련된 모든 업데이트 작업은 애플리케이션 다운타임으로 이어지므로 피해야 합니다.

### 보안 컨텍스트 이해

VPC CNI를 효율적으로 관리하기 위해 구성된 보안 컨텍스트를 이해하는 것이 좋습니다. Amazon VPC CNI에는 CNI 바이너리와 ipamd(aws-node) 데몬셋이라는 두 가지 구성 요소가 있습니다. CNI는 노드에서 바이너리로 실행되며 노드 루트 파일 시스템에 액세스할 수 있으며, 노드 수준에서 iptables를 처리하므로 privileged 접근에 대한 권한도 갖습니다. CNI 바이너리는 파드가 추가되거나 제거될 때 kubelet에 의해 호출됩니다.

aws-node 데몬셋은 노드 수준에서 IP 주소 관리를 담당하는 장기 실행 프로세스입니다. aws-node는 `hostNetwork` 모드에서 실행되며 루프백 디바이스 및 동일한 노드에 있는 다른 파드의 네트워크 활동에 대한 액세스를 허용합니다. aws-node의 초기화 컨테이너는 privileged 모드에서 실행되며 CRI 소켓을 마운트하여 데몬셋이 노드에서 실행되는 파드의 IP 사용을 모니터링할 수 있도록 합니다. Amazon EKS는 aws-node의 초기화 컨테이너의 privileged 요구 조건을 제거하기 위해 노력하고 있습니다. 또한 aws-node는 NAT 엔트리를 업데이트하고 iptables 모듈을 로드해야 하므로 NET_ADMIN 권한으로 실행해야 합니다.

Amazon EKS는 파드 및 네트워킹 설정의 IP 관리를 위해 aws-node 매니페스트에서 정의한 대로 보안 정책을 배포할 것을 권장합니다. 최신 버전의 VPC CNI로 업데이트하는 것을 고려합니다. 또한 특정 보안 요구 사항이 있는 경우 [GitHub 이슈](https://github.com/aws/amazon-vpc-cni-k8s/issues)를 확인합니다.

### CNI에 별도의 IAM 역할 사용

AWS VPC CNI에는 AWS 자격 증명 및 액세스 관리(IAM) 권한이 필요합니다. IAM 역할을 사용하려면 먼저 CNI 정책을 설정해야 합니다. IPv4 클러스터용 AWS 관리형 정책인 [`AmazonEKS_CNI_Policy`](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy%24jsonEditor)를 사용할 수 있습니다. Amazon EKS의 CNI 관리형 정책에는 IPv4 클러스터에 대한 권한만 존재합니다. [이 링크](https://docs.aws.amazon.com/eks/latest/userguide/cni-iam-role.html#cni-iam-role-create-ipv6-policy)에 표시된 권한을 사용하여 IPv6 클러스터에 대해 별도의 IAM 정책을 생성해야 합니다.

기본적으로 VPC CNI는 (관리형 노드 그룹과 자체 관리형 노드 그룹 모두)[Amazon EKS 노드 IAM 역할](https://docs.aws.amazon.com/eks/latest/userguide/create-node-role.html)을 상속합니다.

Amazon VPC CNI에 대한 관련 정책을 사용하여 별도의 IAM 역할을 구성하는 것을 **강력하게** 권장합니다. 그렇지 않은 경우 Amazon VPC CNI의 파드는 노드 IAM 역할에 할당된 권한을 얻고 노드에 할당된 인스턴스 프로필에 접근할 수 있습니다.

VPC CNI 플러그인은 aws-node라는 서비스 어카운트를 생성하고 구성합니다. 기본적으로 서비스 어카운트는 Amazon EKS CNI 정책이 연결된 Amazon EKS 노드의 IAM 역할에 바인딩됩니다. 별도의 IAM 역할을 사용하려면 Amazon EKS CNI 정책이 연결된 [신규 서비스 어카운트를 생성](https://docs.aws.amazon.com/eks/latest/userguide/cni-iam-role.html#cni-iam-role-create-role)하는 것이 좋습니다. 신규 서비스 어카운트를 사용하려면 [CNI 파드 재배포](https://docs.aws.amazon.com/eks/latest/userguide/cni-iam-role.html#cni-iam-role-redeploy-pods)를 진행해야 합니다. 신규 클러스터를 생성할 때 VPC CNI 관리형 애드온에 `--service-account-role-arn`을 지정하는 것을 고려합니다. 이 때 Amazon EKS 노드의 IAM 역할에서 IPv4와 IPv6 모두에 대한 Amazon EKS CNI 정책을 반드시 제거해야 합니다.

보안 침해의 피해 범위를 최소화하기 위해 [인스턴스 메타데이터 접근을 차단](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)하는 것을 권장합니다.

### Liveness/Readiness Probe 실패 처리

프로브 실패로 인해 애플리케이션의 파드가 컨테이너 생성 상태에서 멈추는 것을 방지하기 위해 EKS 1.20 버전 이상 클러스터의 liveness 및 readiness probe의 타임아웃 값 (기본값 `TimeoutSeconds: 10`)을 높일 것을 권장합니다. 해당 이슈는 데이터 집약적인 배치 처리 클러스터에서 발견되었습니다. CPU를 많이 사용하면 aws-node 프로브 상태 장애가 발생하여 Pod CPU 리소스 요청이 충족되지 않을 수 있습니다. 프로브 타임아웃을 수정하는 것 외에도 aws-node에 대한 CPU 리소스 요청(기본값 `CPU: 25m`)이 올바르게 구성되었는지 확인합니다. 노드에 문제가 있는 경우가 아니면 설정을 업데이트하지 않는 것을 권장합니다.

Amazon EKS 지원을 받는 동안 노드에서 sudo `bash /opt/cni/bin/aws-cni-support.sh`를 실행할 것을 권장합니다. 이 스크립트는 노드의 kubelet 로그와 메모리 사용률을 평가하는 데 도움이 됩니다. 스크립트를 실행하기 위해 Amazon EKS 워커 노드에 SSM 에이전트를 설치하는 것을 고려합니다.

### 비 EKS 최적화 AMI 인스턴스에서 IPtables 전달 정책 구성

사용자 지정 AMI를 사용하는 경우 [kubelet.service](https://github.com/awslabs/amazon-eks-ami/blob/master/files/kubelet.service#L8)에서 iptables 전달 정책을 ACCEPT로 설정해야 합니다. 많은 시스템에서 iptables 전달 정책이 DROP으로 설정됩니다. [HashiCorp Packer](https://packer.io/intro/why.html)를 사용하여 사용자 지정 AMI를, [AWS GitHub의 Amazon EKS AMI 저장소](https://github.com/awslabs/amazon-eks-ami)에서 리소스 및 구성 스크립트를 사용하여 빌드 사양을 생성할 수 있습니다. [kubelet.service](https://github.com/awslabs/amazon-eks-ami/blob/master/files/kubelet.service#L8)를 업데이트하고 [이 링크](https://aws.amazon.com/premiumsupport/knowledge-center/eks-custom-linux-ami/)에 설명된 안내에 따라 사용자 지정 AMI를 생성할 수 있습니다.

### 정기적인 CNI 버전 업그레이드

VPC CNI는 이전 버전과 호환됩니다. 최신 버전은 모든 Amazon EKS에서 지원하는 쿠버네티스 버전과 호환됩니다. 또한 VPC CNI는 EKS 애드온으로 제공됩니다(위의 “VPC CNI 관리형 애드온 배포” 참조). EKS 애드온은 애드온 업그레이드를 관리하지만 CNI와 같은 애드온은 데이터 플레인에서 실행되므로 자동으로 업그레이드되지 않습니다. 관리형 및 자체 관리형 워커 노드 업그레이드 후에는 VPC CNI 애드온을 업그레이드해야 합니다.

search    exclude  true         Amazon VPC CNI   iframe width  560  height  315  src  https   www youtube com embed RBE3yk2UlYA  title  YouTube video player  frameborder  0  allow  accelerometer  autoplay  clipboard write  encrypted media  gyroscope  picture in picture  web share  allowfullscreen   iframe   Amazon EKS   Amazon VPC                 VPC CNI   https   github com aws amazon vpc cni k8s                             CNI                      VPC             IP                                                                                Amazon VPC CNI                        CNI                                      CNI                                                               kubelet                      long running        node local  IP        IPAM      ipamd                     ENI                 IP       Prefix                     EC2                 ENI                                                                        ENI         IP                                        CNI            Elastic Network Interface  ENI   https   docs aws amazon com AWSEC2 latest UserGuide using eni html                      CNI                    ENI       IP    Prefix                                                            CNI            IP       Prefix          ENI           CNI                ENI                         ENI     ENI          ENI                                     CNI                            ENI                                                    ENI                              CNI                       ENI                                             ENI                                                                     flow chart illustrating procedure when new ENI delegated prefix is needed    image png                                      EC2                             IP                 EC2                                 ENI       ENI                              CPU                     EKS                                  hostNetwork                                          EKS                        max pod calculator sh  https   github com awslabs amazon eks ami blob master files max pods calculator sh                                 IP     VPC CNI                        IP              VPC CNI                        ipamd     IP         VPC CNI                Prefix        prefix mode index linux md                    sgpp index md                    custom networking index md                   Amazon VPC CNI         aws node                                         primary ENI         ENI         CNI         ENI                 ENI     IP                  ipamd         ENI                               ENI     IP          IPAMD     ENI               ENI                             IP             CNI     ENI                           ENI   IP        WARM ENI TARGET  WARM IP TARGET  MINIMUM IP TARGET  https   github com aws amazon vpc cni k8s blob master docs eni and ip target md                       aws node              ENI                         WARM ENI TARGET      WARM IP TARGET     MINIMUM IP TARGET                  ENI             ENI             CNI   MAX ENI              EC2  API           ENI             WARM ENI TARGET              0                               ENI        ENI         ENI                                                  ENI  IP                               ENI  2      ENI  5   IP                             WARM ENI TARGET  1                       5   IP            CNI        2   ENI                      ENI           ENI          5  IP                    ENI     5  IP                                            6   IP            CNI    6            ENI      5   IP   IP                    ENI                             CNI     1     ENI               ENI              Note       ENI  VPC  CIDR     IP            IP                                                      WARM IP TARGET           0                               IP            IP         ENI                                         IP        ENI                 IP               ENI  1      ENI  20   IP                             WARM IP TARGET  5             WARM ENI TARGET  0              16   IP              ENI 1                 CNI      CIDR         20             ENI            MINIMUM IP TARGET           0                                          IP                                ENI                                                      ENI  1      ENI  10   IP            MINIMUM IP TARGET  100              ENI    100          9   ENI                    WARM IP TARGET      WARM ENI TARGET                                   Excel        subnet calc subnet calc xlsx                     WARM IP TARGET     WARM ENI TARGET          ENI                     IP                     illustration of components involved in assigning an IP address to a pod    image 2 png   Kubelet                 CNI       ipamd         IP           ipamd                CNI                                                  ENI                                                  second illustration of components involved in assigning an IP address to a pod    image 3 png   IP                          Elastic Network Interface                             IP                                   Elastic Network Interface                         third illustration of components involved in assigning an IP address to a pod    image 4 png            VPC CNI      IP     30                          IP                                 VPC CNI     IP                             IP                                      kube proxy  iptables                         IP    ENI                    ipamd       VPC  IP  ENI             IP                                    ENI                     IP                  IP                 EC2                                 ENI          IP                  VPC CNI   limit  https   github com aws amazon vpc resource controller k8s blob master pkg aws vpc limits go                          ENI  IP                                                                                IP        1     2    2  kube proxy   VPC CNI                               Amazon EKS           kube proxy   VPC CNI                      max pods                                 max pods                     2  kube proxy   VPC CNI                                     Amazon EKS          kube proxy  VPC CNI              max pods                                         max pods                                    kubelet extra args   max pods 110                                 c5 large    3  ENI 3   ENI     10  IP                         CoreDNS    2         CNI  49   IP                                                                      1  CoreDNS         ENI 2   IP 20         2  CoreDNS         ENI 2   IP 20         3          ENI 1   IP 10                                                                                CoreDNS   Amazon Elastic LoadBalancer   metrics server     Pods                                                                     GitHub   eni max Pods txt  https   github com awslabs amazon eks ami blob master files eni max pods txt             illustration of multiple ENIs attached to a node    image 5 png                 VPC CNI                           Amazon EKS       VPC CNI                   Amazon EKS                               AWS                                      VPC CNI                                         Amazon EKS          Amazon EKS          VPC CNI                 Amazon EKS                                  Amazon EKS        AWS             VPC CNI           Amazon EKS                                                                                Amazon EKS API  AWS        AWS CLI   eksctl                               kubectl get             show managed fields            VPC CNI                          kubectl get daemonset aws node   show managed fields  n kube system  o yaml               15                                                Kubernetes API                                                                               EKS            managedFields                        EKS     EKS                                URL  liveness probe  readiness probe                                Info WARM ENI TARGET  WARM IP TARGET  MINIMUM IP TARGET                                                                                https   docs aws amazon com eks latest userguide eks add ons html           EKS                                                    VPC CNI                                                    EKS          https   docs aws amazon com eks latest userguide managing vpc cni html updating vpc cni add on             API                       EKS                                                   CNI                                      Amazon EKS API  AWS          AWS                             kubectl apply view last applied daemonset aws node  n kube system   aws k8s cni old yaml                             Amazon EKS  CNI                                                        CNI                                          CNI                                     CNI        VPC CNI                          Amazon EKS                            https   docs aws amazon com eks latest userguide update cluster html                                                                                update addon API        EKS                   Update Now                                                       VPC CNI           https   docs aws amazon com eks latest userguide managing vpc cni html updating vpc cni add on                                                                         1 9     1 11                 1 10                        1 11                           Amazon VPC CNI            AWS                                                  Amazon EKS                                                                                kubectl apply view last applied daemonset aws node  n kube system   aws k8s cni old yaml                         GitHub   releases                                                                            Helm                 values                                                                                VPC CNI                                           Amazon VPC CNI   CNI       ipamd aws node                           CNI                                                    iptables        privileged                  CNI                       kubelet             aws node              IP                            aws node   hostNetwork                                                                 aws node            privileged           CRI                              IP                      Amazon EKS  aws node            privileged                              aws node  NAT             iptables              NET ADMIN                 Amazon EKS                IP        aws node                                            VPC CNI                                          GitHub     https   github com aws amazon vpc cni k8s issues               CNI      IAM        AWS VPC CNI   AWS                IAM             IAM              CNI               IPv4       AWS           AmazonEKS CNI Policy   https   console aws amazon com iam home  policies arn aws iam  aws policy AmazonEKS CNI Policy 24jsonEditor               Amazon EKS  CNI          IPv4                            https   docs aws amazon com eks latest userguide cni iam role html cni iam role create ipv6 policy                IPv6              IAM                      VPC CNI                               Amazon EKS    IAM     https   docs aws amazon com eks latest userguide create node role html           Amazon VPC CNI                     IAM                                       Amazon VPC CNI         IAM                                               VPC CNI       aws node                                         Amazon EKS CNI         Amazon EKS     IAM                 IAM           Amazon EKS CNI                           https   docs aws amazon com eks latest userguide cni iam role html cni iam role create role                                 CNI         https   docs aws amazon com eks latest userguide cni iam role html cni iam role redeploy pods                            VPC CNI             service account role arn                      Amazon EKS     IAM      IPv4  IPv6        Amazon EKS CNI                                                               https   aws github io aws eks best practices security docs iam  restrict access to the instance profile assigned to the worker node                   Liveness Readiness Probe                                                           EKS 1 20             liveness   readiness probe               TimeoutSeconds  10                                                       CPU          aws node                 Pod CPU                                              aws node     CPU             CPU  25m                                                                   Amazon EKS                sudo  bash  opt cni bin aws cni support sh                             kubelet                                            Amazon EKS        SSM                                EKS     AMI        IPtables                  AMI           kubelet service  https   github com awslabs amazon eks ami blob master files kubelet service L8    iptables        ACCEPT                     iptables        DROP           HashiCorp Packer  https   packer io intro why html               AMI    AWS GitHub  Amazon EKS AMI      https   github com awslabs amazon eks ami                                            kubelet service  https   github com awslabs amazon eks ami blob master files kubelet service L8                 https   aws amazon com premiumsupport knowledge center eks custom linux ami                      AMI                         CNI           VPC CNI                          Amazon EKS                            VPC CNI  EKS                 VPC CNI                  EKS                       CNI                                                                          VPC CNI


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

# VPC 및 서브넷 고려 사항

EKS 클러스터를 운영하려면 쿠버네티스 네트워킹 외에도 AWS VPC 네트워킹에 대한 지식이 필요합니다.

VPC를 설계하거나 기존 VPC에 클러스터를 배포하기 전에 EKS 컨트롤 플레인 통신 메커니즘을 이해할 것을 권장합니다.

EKS에서 사용할 VPC와 서브넷을 설계할 때는 [클러스터 VPC 고려 사항](https://docs.aws.amazon.com/eks/latest/userguide/network_reqs.html) 및 [Amazon EKS 보안 그룹 고려 사항](https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html)을 참조합니다.

## 개요

### EKS 클러스터 아키텍처

EKS 클러스터는 두 개의 VPC로 구성됩니다.

* 쿠버네티스 컨트롤 플레인을 호스팅하는 AWS 관리형 VPC. 이 VPC는 고객 계정에 표시되지 않습니다.
* 쿠버네티스 노드를 호스팅하는 고객 관리형 VPC. 여기에서 컨테이너는 물론 클러스터에서 사용하는 로드 밸런서와 같은 기타 고객 관리형 AWS 인프라가 실행됩니다. 이 VPC는 고객 계정에 표시됩니다. 클러스터를 생성하기 전, 고객 관리형 VPC를 생성해야 합니다. 사용자가 VPC를 제공하지 않을 경우 eksctl이 VPC를 생성합니다.

고객 VPC의 노드는 AWS VPC의 관리형 API 서버 엔드포인트에 연결할 수 있어야 합니다. 이를 통해 노드가 쿠버네티스 컨트롤 플레인에 등록되고 애플리케이션 파드를 실행하라는 요청을 수신할 수 있습니다.

노드는 (a) EKS 퍼블릭 엔드포인트 또는 (b) EKS에서 관리하는 교차 계정 [Elastic Network Interface](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html)(X-ENI)를 통해 EKS 컨트롤 플레인에 연결됩니다. 클러스터를 생성할 때는 최소 두 개의 VPC 서브넷을 지정해야 합니다. EKS는 클러스터 생성 시 지정된 각 서브넷(클러스터 서브넷이라고도 함)에 X-ENI를 배치합니다. 쿠버네티스 API 서버는 이러한 교차 계정 ENI를 사용하여 고객 관리형 클러스터 VPC 서브넷에 배포된 노드와 통신합니다.

![general illustration of cluster networking, including load balancer, nodes, and pods.](./image.png)

노드를 시작하면 EKS 부트스트랩 스크립트가 실행되고 쿠버네티스 노드 구성 파일이 설치됩니다. 각 인스턴스의 부팅 프로세스의 일부로써 컨테이너 런타임 에이전트, kubelet 및 쿠버네티스 노드 에이전트가 시작됩니다.

노드를 등록하기 위해 kubelet은 쿠버네티스 클러스터 엔드포인트에 접속합니다. VPC 외부의 퍼블릭 엔드포인트 또는 VPC 내의 프라이빗 엔드포인트와의 연결을 설정합니다. Kubelet은 API 명령을 수신하고 엔드포인트에 상태 업데이트 및 하트비트를 정기적으로 제공합니다.

### EKS 컨트롤 플레인 통신

EKS에는 [클러스터 엔드포인트](https://docs.aws.amazon.com/eks/latest/userguide/cluster-endpoint.html)에 대한 접근을 제어하는 두 가지 방법이 있습니다. 엔드포인트 접근 제어를 통해 엔드포인트가 퍼블릭 인터넷을 통해 접근할 수 있는지 아니면 VPC를 통해서만 접근할 수 있는지 여부를 선택할 수 있습니다. 퍼블릭 엔드포인트(기본값), 프라이빗 엔드포인트 또는 둘 다를 한 번에 활성화 할 수 있습니다.

클러스터 API 엔드포인트의 구성은 노드가 컨트롤 플레인과 통신하기 위한 경로를 결정합니다. 참고로 이러한 엔드포인트 설정은 EKS 콘솔 또는 API를 통해 언제든지 변경할 수 있습니다.

#### 퍼블릭 엔드포인트

해당 구성은 신규 Amazon EKS 클러스터의 기본 동작입니다. 클러스터의 퍼블릭 엔드포인트만 활성화된 경우 클러스터의 VPC 내에서 시작된 쿠버네티스 API 요청(예: 워커노드에서 컨트롤 플레인으로의 통신)은 VPC 외부로 가지만 Amazon 네트워크 외부로는 가지 않습니다. 노드가 컨트롤 플레인에 연결되려면 퍼블릭 IP 주소 및 인터넷 게이트웨이에 대한 경로 또는 NAT 게이트웨이의 퍼블릭 IP 주소를 사용할 수 있는 NAT 게이트웨이에 대한 경로가 있어야 합니다.

#### 퍼블릭 및 프라이빗 엔드포인트

퍼블릭 엔드포인트와 프라이빗 엔드포인트가 모두 활성화되면 VPC 내의 쿠버네티스 API 요청이 VPC 내의 X-ENI를 통해 컨트롤 플레인과 통신합니다. 클러스터 API 서버는 인터넷에서 액세스할 수 있습니다.

#### 프라이빗 엔드포인트

프라이빗 엔드포인트만 활성화된 경우 인터넷에서 API 서버에 공개적으로 액세스할 수 없습니다. 클러스터 API 서버로 향하는 모든 트래픽은 클러스터의 VPC 또는 연결된 네트워크 안에서 들어와야 합니다. 노드는 VPC 내의 X-ENI를 통해 API 서버와 통신합니다. 단, 클러스터 관리 도구는 프라이빗 엔드포인트에 액세스할 수 있어야 합니다. [Amazon VPC 외부에서 프라이빗 Amazon EKS 클러스터 엔드포인트에 연결하는 방법](https://aws.amazon.com/premiumsupport/knowledge-center/eks-private-cluster-endpoint-vpc/)에 대해 자세히 알아봅니다.

참고로 클러스터의 API 서버 엔드포인트는 퍼블릭 DNS 서버에서 VPC의 프라이빗 IP 주소로 리졸브됩니다. 과거에는 VPC 내에서만 엔드포인트를 리졸브할 수 있었습니다.

### VPC 구성

Amazon VPC는 IPv4 및 IPv6 주소를 지원합니다. Amazon EKS는 기본적으로 IPv4를 지원합니다. VPC에는 IPv4 CIDR 블록이 연결되어 있어야 합니다. 선택적으로 여러 IPv4 [Classless Inter-Domain Routing](http://en.wikipedia.org/wiki/CIDR_notation)(CIDR) 블록과 여러 IPv6 CIDR 블록을 VPC에 연결할 수 있습니다. VPC를 생성할 경우 [RFC 1918](http://www.faqs.org/rfcs/rfc1918.html)에 지정된 프라이빗 IPv4 주소 범위에서 VPC에 대한 IPv4 CIDR 블록을 지정해야 합니다. 허용되는 블록 크기는 `/16` Prefix(65,536개의 IP 주소)와 `/28` Prefix(16개의 IP 주소) 사이입니다.

신규 VPC를 만들 때는 하나의 IPv6 CIDR 블록을 연결할 수 있으며, 기존 VPC를 변경할 때는 최대 5개까지 연결할 수 있습니다. IPv6 VPC의 CIDR 블록의 Prefix 길이는 [1조 개 이상의 IP 주소](https://www.ripe.net/about-us/press-centre/understanding-ip-addressing#:~:text=IPv6%20Relative%20Network%20Sizes%20%20%20%2F128%20,Minimum%20IPv6%20allocation%20%201%20more%20rows%20)를 가진 /64로 고정됩니다. Amazon에서 관리하는 IPv6 주소 풀에서 IPv6 CIDR 블록을 요청할 수 있습니다.

Amazon EKS 클러스터는 IPv4와 IPv6를 모두 지원합니다. 기본적으로 EKS 클러스터는 IPv4 IP를 사용합니다. 클러스터 생성 시 IPv6을 지정하면 IPv6 클러스터를 사용할 수 있습니다. IPv6 클러스터에는 듀얼 스택 VPC와 서브넷이 필요합니다.

Amazon EKS는 클러스터를 생성하는 동안 서로 다른 가용 영역에 있는 서브넷을 두 개 이상 사용할 것을 권장합니다. 클러스터를 생성할 때 전달하는 서브넷을 클러스터 서브넷이라고 합니다. 클러스터를 생성할 때 Amazon EKS는 지정한 서브넷에 최대 4개의 교차 계정(x-account 또는 x-ENIs) ENI를 생성합니다.x-ENI는 항상 배포되며 로그 전송, 실행 및 프록시와 같은 클러스터 관리 트래픽에 사용됩니다. 전체 [VPC 및 서브넷 요구 사항](https://docs.aws.amazon.com/eks/latest/userguide/network_reqs.html#network-requirements-subnets) 세부 정보는 EKS 사용자 가이드를 참조합니다.

쿠버네티스 워커 노드는 클러스터 서브넷에서 실행할 수 있지만 권장되지는 않습니다. [클러스터 업그레이드](https://aws.github.io/aws-eks-best-practices/upgrades/#verify-available-ip-addresses) 중에 Amazon EKS는 클러스터 서브넷에 추가 ENI를 프로비저닝합니다. 클러스터가 확장되면 워커 노드와 파드가 클러스터 서브넷에서 가용 IP를 사용할 수 있습니다. 따라서 사용 가능한 IP를 충분히 확보하려면 /28 넷마스크가 있는 전용 클러스터 서브넷 사용을 고려할 수 있습니다.

쿠버네티스 워커 노드는 퍼블릭 또는 프라이빗 서브넷에서 실행할 수 있습니다. 서브넷이 퍼블릭인지 프라이빗인지는 서브넷 내의 트래픽이 [인터넷 게이트웨이](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)를 통해 라우팅되는지 여부를 뜻합니다. 퍼블릭 서브넷에는 인터넷 게이트웨이를 통해 인터넷으로 라우팅되는 라우트 테이블 항목이 있지만 프라이빗 서브넷에는 없습니다.

다른 곳에서 시작하여 노드에 도착하는 트래픽을 *인그레스(ingress)*라고 합니다. 노드에서 시작하여 네트워크 외부로 가는 트래픽을 *이그레스(egress)*라고 합니다. 인터넷 게이트웨이로 구성된 서브넷 내에 퍼블릭 또는 Elastic IP Address(EIP)를 가진 노드는 VPC 외부로부터의 인그레스를 허용합니다. 프라이빗 서브넷에는 일반적으로 [NAT 게이트웨이](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)가 포함되어 있는데, 이 게이트웨이는 노드로부터의 트래픽이 VPC를 나가는 것(*이그레스*)은 허용하면서 VPC 내에서 노드로의 인그레스 트래픽만 허용합니다.

IPv6 환경에서는 모든 주소를 인터넷으로 라우팅할 수 있습니다. 노드 및 파드와 연결된 IPv6 주소는 퍼블릭입니다. 프라이빗 서브넷은 VPC에 [egress-only internet gateways (EIGW)](https://docs.aws.amazon.com/vpc/latest/userguide/egress-only-internet-gateway.html)를 구성하여 아웃바운드 트래픽을 허용하는 동시에 들어오는 트래픽은 모두 차단하는 방식으로 지원됩니다. IPv6 서브넷 구현의 모범 사례는 [VPC 사용자 가이드](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html)에서 확인할 수 있습니다.

### 다음과 같은 세 가지 방법으로 VPC와 서브넷을 구성할 수 있습니다.

#### 퍼블릭 서브넷만 사용

동일한 퍼블릭 서브넷에서 노드와 인그레스 리소스(예: 로드 밸런서)가 모두 생성됩니다. 퍼블릭 서브넷에 [`kubernetes.io/role/elb`](http://kubernetes.io/role/elb) 태그를 지정하여 인터넷에 연결된 로드 밸런서를 구성합니다. 해당 구성에서는 클러스터 엔드포인트를 퍼블릭, 프라이빗 또는 둘 다 (퍼블릭 및 프라이빗)로 구성할 수 있습니다.

#### 프라이빗 및 퍼블릭 서브넷 사용

노드는 프라이빗 서브넷에서 생성되는 반면, 인그레스 리소스는 퍼블릭 서브넷에서 인스턴스화됩니다. 클러스터 엔드포인트에 대한 퍼블릭, 프라이빗 또는 둘 다(퍼블릭 및 프라이빗) 액세스를 사용하도록 설정할 수 있습니다. 클러스터 엔드포인트의 구성에 따라 노드 트래픽은 NAT 게이트웨이 또는 ENI를 통해 들어옵니다.

#### 프라이빗 서브넷만 사용

노드와 인그레스 모두 프라이빗 서브넷에서 생성됩니다. [`kubernetes.io/role/internal-elb`](http://kubernetes.io/role/internal-elb:1) 서브넷 태그를 사용하여 내부용 로드 밸런서를 구성합니다. 클러스터의 엔드포인트에 접근하려면 VPN 연결이 필요합니다. EC2와 모든 Amazon ECR 및 S3 리포지토리에 대해 [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-service.html)를 활성화해야 합니다. 클러스터의 프라이빗 엔드포인트만 활성화해야 합니다. 프라이빗 클러스터를 프로비저닝하기 전 [EKS 프라이빗 클러스터 요구 사항](https://docs.aws.amazon.com/eks/latest/userguide/private-clusters.html)을 읽어볼 것을 권장합니다.

### VPC간 통신

여러 개의 VPC와 이러한 VPC에 배포된 별도의 EKS 클러스터들이 필요한 경우가 많이 있습니다.

[Amazon VPC Lattice](https://aws.amazon.com/vpc/lattice/)를 사용하면 여러 VPC와 계정에서 서비스를 일관되고 안전하게 연결할 수 있습니다(VPC 피어링, AWS PrivateLink 또는 AWS Transit Gateway와 같은 서비스에서 추가 연결을 제공할 필요 없음). [여기](https://aws.amazon.com/blogs/networking-and-content-delivery/build-secure-multi-account-multi-vpc-connectivity-for-your-applications-with-amazon-vpc-lattice/)에서 자세한 내용을 확인할 수 있습니다.

![Amazon VPC Lattice, traffic flow](./vpc-lattice.gif)

Amazon VPC Lattice는 IPv4 및 IPv6의 링크 로컬 주소 공간에서 작동하며, IPv4 주소가 겹칠 수 있는 서비스 간의 연결을 제공합니다. 운영 효율성을 위해 EKS 클러스터와 노드를 겹치지 않는 IP 범위에 배포할 것을 권장합니다. 인프라에 IP 범위가 겹치는 VPC가 포함된 경우에는 그에 맞게 네트워크를 설계해야 합니다. 라우팅 가능한 RFC1918 IP 주소를 유지하면서 중복되는 CIDR 문제를 해결하기 위해 [프라이빗 NAT 게이트웨이](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html#nat-gateway-basics) 또는 [사용자 지정 네트워킹](../custom-networking/index.md) 모드에서 [transit gateway](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/aws-transit-gateway.html)와 함께 VPC CNI를 사용하여 EKS의 워크로드를 통합하는 것을 권장합니다.

![Private Nat Gateway with Custom Networking, traffic flow](./private-nat-gw.gif)

서비스 제공자이고 별도의 계정으로 고객 VPC와 쿠버네티스 서비스 및 인그레스(ALB 또는 NLB)를 공유하려는 경우, 엔드포인트 서비스라고도 불리는 [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-share-your-services.html) 활용을 고려합니다.

### 여러 계정에서의 VPC 공유

많은 기업에서 AWS 조직 내 여러 AWS 계정의 네트워크 관리를 간소화하고, 비용을 절감하고, 보안을 개선하기 위한 수단으로 공유 Amazon VPC를 도입합니다. 이들은 AWS Resource Access Manager(RAM)를 활용하여 지원되는 [AWS 리소스](https://docs.aws.amazon.com/ram/latest/userguide/shareable.html)를 개별 AWS 계정, 조직 단위(OU) 또는 전체 AWS 조직과 안전하게 공유합니다.

AWS RAM을 사용하여 다른 AWS 계정의 공유용 VPC 서브넷에 Amazon EKS 클러스터, 관리형 노드 그룹 및 기타 지원 AWS 리소스(예: 로드밸런서, 보안 그룹, 엔드포인트 등)를 배포할 수 있습니다. 아래 그림은 상위 수준 아키텍처의 예를 보여줍니다. 이를 통해 중앙 네트워크 팀은 VPC, 서브넷 등과 같은 네트워킹 구조를 제어하고, 동시에 애플리케이션 또는 플랫폼 팀은 각자의 AWS 계정에 Amazon EKS 클러스터를 배포할 수 있습니다. 이 시나리오에 대한 전체 설명은 이 [github 저장소](https://github.com/aws-samples/eks-shared-subnets)에서 확인할 수 있습니다.

![Deploying Amazon EKS in VPC Shared Subnets across AWS Accounts.](./eks-shared-subnets.png)

#### 공유 서브넷 사용 시 고려 사항

* Amazon EKS 클러스터와 워커 노드는 모두 동일한 VPC의 공유 서브넷 내에서 생성할 수 있습니다. Amazon EKS는 여러 VPC에서의 클러스터 생성을 지원하지 않습니다.

* Amazon EKS는 AWS VPC 보안 그룹(SG)을 사용하여 쿠버네티스 컨트롤 플레인과 클러스터의 워커 노드 사이의 트래픽을 제어합니다. 또한 보안 그룹은 워커 노드, 기타 VPC 리소스 및 외부 IP 주소 간의 트래픽을 제어하는 데에도 사용됩니다. 애플리케이션/참여자(participant) 계정에서 이러한 보안 그룹을 생성해야 합니다. 파드에 사용할 보안 그룹도 참여자 계정에 있는지 확인합니다. 보안 그룹 내에서 인바운드 및 아웃바운드 규칙을 구성하여 중앙 VPC 계정에 있는 보안 그룹에서 송수신되는 필요한 트래픽을 허용할 수 있습니다.

* Amazon EKS 클러스터가 있는 참여자 계정 내에 IAM 역할 및 관련 정책을 생성합니다. 이러한 IAM 역할 및 정책은 Amazon EKS에서 관리하는 쿠버네티스 클러스터와 Fargate에서 실행되는 노드 및 파드에 필요한 권한을 부여하기 위해 반드시 필요합니다. 이 권한을 통해 Amazon EKS는 사용자를 대신하여 다른 AWS 서비스를 호출할 수 있습니다.

* 다음 접근 방식에 따라 쿠버네티스 파드에서 Amazon S3 버킷, Dynamodb 테이블 등과 같은 AWS 리소스의 계정 간 액세스를 허용할 수 있습니다.
    * **리소스 기반 정책 접근 방식**: AWS 서비스가 리소스 정책을 지원하는 경우 적절한 리소스 기반 정책을 추가하여 쿠버네티스 파드에 할당된 IAM 역할에 대한 계정 간 액세스를 허용할 수 있습니다. 이 시나리오에서는 OIDC 공급자, IAM 역할 및 권한 정책이 애플리케이션 계정에 존재하게 됩니다. 리소스 기반 정책을 지원하는 AWS 서비스를 찾으려면 [IAM과 함께 작동하는 AWS 서비스](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)를 참조하고 리소스 기반 열에서 '예'라고 표시된 서비스를 찾아보십시오.

    * **OIDC 공급자 접근 방식**: OIDC 공급자, IAM 역할, 권한 및 신뢰 정책과 같은 IAM 리소스는 리소스가 있는 다른 참여자 AWS 계정에서 생성됩니다. 이러한 역할은 애플리케이션 계정의 쿠버네티스 파드에 할당되어 계정 간 리소스에 액세스할 수 있도록 합니다. 이 접근 방식에 대한 자세한 내용은 [쿠버네티스 서비스 어카운트를 위한 교차 계정 간 IAM 역할](https://aws.amazon.com/blogs/containers/cross-account-iam-roles-for-kubernetes-service-accounts/) 블로그를 참조합니다.

* Amazon Elastic Loadbalancer(ELB) 리소스(ALB 또는 NLB)를 배포하여 애플리케이션 또는 중앙 네트워킹 계정의 쿠버네티스 파드로 트래픽을 라우팅할 수 있습니다. 중앙 네트워킹 계정에 ELB 리소스를 배포하는 방법에 대한 자세한 안내는 [교차 계정 로드 밸런서를 통해 Amazon EKS 파드 노출](https://aws.amazon.com/blogs/containers/expose-amazon-eks-pods-through-cross-account-load-balancer/)안내를 참조합니다. 이 옵션은 로드 밸런서 리소스의 보안 구성에 대한 모든 권한을 중앙 네트워킹 계정에 부여하므로 유연성이 향상됩니다.

* Amazon VPC CNI의 `사용자 지정 네트워킹 기능(custom networking feature)`을 사용하는 경우 중앙 네트워킹 계정에 나열된 가용 영역(AZ) ID 매핑을 사용하여 각각의 `ENIConfig`를 생성해야 합니다. 이는 물리적 AZ를 각 AWS 계정의 AZ 이름에 무작위로 매핑하기 때문입니다.

### 보안 그룹

[*보안 그룹*](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)은 연결된 리소스에 들어오거나 나가는 것이 허용되는 트래픽을 제어합니다. Amazon EKS는 보안 그룹을 사용하여 [컨트롤 플레인과 노드](https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html)간의 통신을 관리합니다. 클러스터를 생성하면 Amazon EKS는 `eks-cluster-sg-my-cluster-uniqueID`라는 보안 그룹을 생성합니다. EKS는 이러한 보안 그룹을 관리형 ENI 및 노드에 연결합니다. 기본 규칙을 사용하면 클러스터와 노드 간에 모든 트래픽이 자유롭게 전달되고, 모든 아웃바운드 트래픽이 모든 목적지로 전달되도록 허용합니다.

클러스터를 생성할 때 자체 보안 그룹을 지정할 수 있습니다. 자체 보안 그룹을 지정하는 경우 [보안 그룹 권장 사항](https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html)을 참조합니다.

## 권장 사항

### 다중 AZ 배포 고려

AWS 리전은 물리적으로 분리되고 격리된 여러 가용 영역(AZ)을 제공하며, 이러한 가용 영역은 지연 시간이 짧고 처리량이 높으며 중복성이 높은 네트워킹으로 연결됩니다. 가용 영역을 활용하여 가용 영역 간에 중단 없이 자동으로 장애 조치되는 애플리케이션을 설계하고 운영할 수 있습니다. Amazon EKS는 EKS 클러스터를 여러 가용 영역에 배포할 것을 강력히 권장합니다. 클러스터를 생성할 때 최소 두 개의 가용 영역에 서브넷을 지정하는 것을 고려합니다.

노드에서 실행되는 Kubelet은 [`topology.kubernetes.io/region=us-west-2`, `topology.kubernetes.io/zone=us-west-2d`](http://topology.kubernetes.io/region=us-west-2,topology.kubernetes.io/zone=us-west-2d)와 같은 레이블을 노드 오브젝트에 자동으로 추가합니다. 노드 레이블을 [Pod topology spread constraints](https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/)와 함께 사용하여 파드가 여러 영역에 분산되는 방식을 제어할 것을 권장합니다. 이러한 힌트를 통해 쿠버네티스 [스케줄러](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-scheduler/)가 예상 가용성을 높이기 위해 파드를 배치하여 상관 관계가 있는 장애가 전체 워크로드에 영향을 미칠 위험을 줄일 수 있습니다. 노드 셀렉터 및 AZ 분산 제약 조건의 예를 보려면 [파드에 노드 할당](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector)을 참조합니다.

노드를 생성할 때 서브넷 또는 가용 영역을 정의할 수 있습니다. 서브넷이 구성되지 않은 경우 노드는 클러스터 서브넷에 배치됩니다. 관리형 노드 그룹에 대한 EKS 지원은 가용 용량을 기준으로 여러 가용 영역에 노드를 자동으로 분산합니다. 워크로드가 topology spread constraints를 정의하는 경우 [Karpenter](https://karpenter.sh/)는 노드를 지정된 AZ로 확장하여 AZ 분산 배치를 준수합니다.

AWS Elastic Loadbalancer는 쿠버네티스 클러스터의 AWS 로드 밸런서 컨트롤러에 의해 관리됩니다. 쿠버네티스 인그레스 리소스를 위한 애플리케이션 로드 밸런서(ALB)와 로드밸런서 유형의 쿠버네티스 서비스를 위한 네트워크 로드 밸런서(NLB)를 프로비저닝합니다. Elastic Loadbalancer 컨트롤러는 [태그](https://aws.amazon.com/premiumsupport/knowledge-center/eks-vpc-subnet-discovery/)를 사용하여 서브넷을 검색합니다. ELB 컨트롤러가 인그레스 리소스를 성공적으로 프로비저닝하려면 최소 두 개의 가용 영역 (AZ)이 필요합니다. 지리적 이중화의 안전성과 안정성을 활용하기 위해 최소 두 개의 AZ에 서브넷을 설정할 것을 권장합니다.

### 프라이빗 서브넷에 노드 배포

프라이빗 서브넷과 퍼블릭 서브넷을 모두 포함하는 VPC는 쿠버네티스 워크로드를 EKS에 배포하는 데 가장 적합한 방법입니다. 서로 다른 두 가용 영역에 최소 두 개의 퍼블릭 서브넷과 두 개의 프라이빗 서브넷을 설정할 것을 고려합니다. 퍼블릭 서브넷의 라우팅 테이블에는 인터넷 게이트웨이에 대한 경로가 포함되어 있습니다. 파드는 NAT 게이트웨이를 통해 인터넷과 상호작용할 수 있습니다. IPv6 환경(EIGW)에서의 프라이빗 서브넷은 [외부 전용 인터넷 게이트웨이](https://docs.aws.amazon.com/vpc/latest/userguide/egress-only-internet-gateway.html)를 통해 지원됩니다.

프라이빗 서브넷에서 노드를 인스턴스화하면 노드에 대한 트래픽 제어를 최대화 할 수 있으며 대부분의 쿠버네티스 애플리케이션에 적합합니다. 인그레스 리소스(예: 로드 밸런서)는 퍼블릭 서브넷에서 인스턴스화되고 프라이빗 서브넷에서 작동하는 파드로 트래픽을 라우팅합니다.

엄격한 보안 및 네트워크 격리가 필요한 경우 프라이빗 전용 모드를 고려합니다. 이 구성에서는 세 개의 프라이빗 서브넷이 AWS 리전 내 VPC의 서로 다른 가용 영역에 배포됩니다. 서브넷에 배포된 리소스는 인터넷에 액세스할 수 없으며 인터넷에서 서브넷의 리소스로도 액세스할 수 없습니다. 쿠버네티스 애플리케이션이 다른 AWS 서비스에 액세스할 수 있으려면 PrivateLink 인터페이스 및/또는 게이트웨이 엔드포인트를 구성해야 합니다. AWS 로드 밸런서 컨트롤러를 사용하여 내부 로드 밸런서가 트래픽을 파드로 리디렉션하도록 설정할 수 있습니다. 컨트롤러가 로드 밸런서를 프로비저닝하려면 프라이빗 서브넷에 ([``kubernetes.io/role/internal-elb: 1`](http://kubernetes.io/role/internal-elb)) 태그를 지정해야 합니다. 노드를 클러스터에 등록하려면 클러스터 엔드포인트를 프라이빗 모드로 설정해야 합니다. 전체 요구 사항 및 고려 사항은 [프라이빗 클러스터 가이드](https://docs.aws.amazon.com/eks/latest/userguide/private-clusters.html)를 참조합니다.

### 클러스터 엔드포인트의 퍼블릭 및 프라이빗 모드 고려

Amazon EKS는 퍼블릭 전용, 퍼블릭 및 프라이빗, 프라이빗 전용 클러스터 엔드포인트 모드를 제공합니다. 기본 모드는 퍼블릭 전용이지만 클러스터 엔드포인트를 퍼블릭 및 프라이빗 모드로 구성하는 것을 권장합니다. 이 옵션을 사용하면 클러스터 VPC 내에서의 쿠버네티스 API 호출(예: 노드와 컨트롤 플레인 간 통신)에 프라이빗 VPC 엔드포인트를 활용하고 트래픽이 클러스터의 VPC 내에 유지되도록 할 수 있습니다. 반면 클러스터 API 서버는 인터넷을 통해 연결할 수 있습니다. 하지만 퍼블릭 엔드포인트를 사용할 수 있는 CIDR 블록은 제한하는 것이 좋습니다. [CIDR 블록 제한을 포함하여 퍼블릭 및 프라이빗 엔드포인트 액세스를 구성하는 방법을 알아봅니다.](https://docs.aws.amazon.com/eks/latest/userguide/cluster-endpoint.html#modify-endpoint-access)

보안 및 네트워크 격리가 필요한 경우 프라이빗 전용 엔드포인트를 사용하는 것을 권장합니다. [EKS 사용자 가이드](https://docs.aws.amazon.com/eks/latest/userguide/cluster-endpoint.html#private-access)에 제시된 옵션 중 하나를 사용하여 API 서버에 프라이빗하게 연결할 것을 권장합니다.

### 보안 그룹을 신중하게 구성

Amazon EKS는 사용자 지정 보안 그룹 사용을 지원합니다. 모든 사용자 지정 보안 그룹은 노드와 쿠버네티스 컨트롤 플레인 간의 통신을 허용해야 합니다. 조직 내에서 개방형 통신을 허용하지 않는 경우 [포트 요구 사항](https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html)을 확인하고 규칙을 수동으로 구성합니다.

EKS는 클러스터 생성 중에 제공하는 사용자 지정 보안 그룹을 관리형 인터페이스(X-ENI)에 적용합니다. 하지만 사용자 지정 보안그룹이 노드와 즉시 연결되지는 않습니다. 노드 그룹을 생성할 때는 수동으로 [사용자 지정 보안 그룹을 연결](https://eksctl.io/usage/schema/#nodeGroups-securityGroups)할 것을 권장합니다. 노드 오토스케일링 중 사용자 지정 보안 그룹의 Karpenter 노드 템플릿 검색을 활성화하려면 [securityGroupSelectorTerms](https://karpenter.sh/docs/concepts/nodeclasses/#specsecuritygroupselectorterms)를 활성화할 것을 고려합니다.

모든 노드 간 통신 트래픽을 허용하는 보안 그룹을 생성하는 것을 강력히 권장합니다. 부트스트랩 프로세스 중에 노드가 클러스터 엔드포인트에 액세스하려면 아웃바운드 인터넷 연결이 필요합니다. 온프레미스 연결 및 컨테이너 레지스트리 액세스와 같은 외부 액세스 요구 사항을 평가하고 규칙을 적절하게 설정합니다. 변경 사항을 프로덕션에 적용하기 전에 개발 환경에서 네트워크 연결을 주의 깊게 확인할 것을 권장합니다.

### 각 가용 영역에 NAT 게이트웨이 배포

프라이빗 서브넷(IPv4 및 IPv6)에 노드를 배포하는 경우 각 가용 영역(AZ)에 NAT 게이트웨이를 생성하여 가용 영역에 독립적인 아키텍처를 보장하고 AZ 간 비용을 절감하는 것을 고려합니다. AZ의 각 NAT 게이트웨이는 이중화로 구현됩니다.

### Cloud9을 사용하여 프라이빗 클러스터에 액세스

AWS Cloud9는 AWS Systems Manager를 사용하여 인그레스 액세스 없이 프라이빗 서브넷에서 안전하게 실행할 수 있는 웹 기반 IDE입니다. Cloud9 인스턴스에서 이그레스를 비활성화할 수도 있습니다. [Cloud9를 사용하여 프라이빗 클러스터와 서브넷에 액세스하는 방법에 대해 자세히 알아보십시오.](https://aws.amazon.com/blogs/security/isolating-network-access-to-your-aws-cloud9-environments/)

![illustration of AWS Cloud9 console connecting to no-ingress EC2 instance.](./image-2.jpg)

search    exclude  true         VPC              EKS                            AWS VPC                      VPC           VPC                EKS                                 EKS       VPC                    VPC        https   docs aws amazon com eks latest userguide network reqs html     Amazon EKS              https   docs aws amazon com eks latest userguide sec group reqs html                      EKS            EKS            VPC                                  AWS     VPC    VPC                                              VPC                                                 AWS               VPC                                     VPC                 VPC             eksctl  VPC             VPC      AWS VPC      API                                                                                a  EKS               b  EKS               Elastic Network Interface  https   docs aws amazon com AWSEC2 latest UserGuide using eni html  X ENI      EKS                                      VPC                EKS                                       X ENI               API               ENI                   VPC                         general illustration of cluster networking  including load balancer  nodes  and pods     image png            EKS                                                                              kubelet                                      kubelet                           VPC                  VPC                            Kubelet  API                                                   EKS             EKS                https   docs aws amazon com eks latest userguide cluster endpoint html                                                                               VPC                                                                                API                                                              EKS       API                                                 Amazon EKS                                                VPC               API                              VPC         Amazon                                           IP                          NAT            IP              NAT                                                                                VPC          API     VPC    X ENI                          API                                                                    API                             API                       VPC                               VPC    X ENI     API                                                        Amazon VPC           Amazon EKS                      https   aws amazon com premiumsupport knowledge center eks private cluster endpoint vpc                             API               DNS      VPC       IP                  VPC                                VPC     Amazon VPC  IPv4   IPv6            Amazon EKS        IPv4         VPC   IPv4 CIDR                            IPv4  Classless Inter Domain Routing  http   en wikipedia org wiki CIDR notation  CIDR         IPv6 CIDR     VPC              VPC          RFC 1918  http   www faqs org rfcs rfc1918 html            IPv4         VPC     IPv4 CIDR                             16  Prefix 65 536   IP        28  Prefix 16   IP                 VPC            IPv6 CIDR                   VPC            5                IPv6 VPC  CIDR     Prefix      1        IP     https   www ripe net about us press centre understanding ip addressing    text IPv6 20Relative 20Network 20Sizes 20 20 20 2F128 20 Minimum 20IPv6 20allocation 20 201 20more 20rows 20       64         Amazon        IPv6        IPv6 CIDR                  Amazon EKS       IPv4  IPv6                  EKS       IPv4 IP                   IPv6       IPv6                   IPv6              VPC               Amazon EKS                                                                                Amazon EKS              4         x account    x ENIs  ENI        x ENI                                                      VPC              https   docs aws amazon com eks latest userguide network reqs html network requirements subnets         EKS                                                                              https   aws github io aws eks best practices upgrades  verify available ip addresses     Amazon EKS               ENI                                                IP                         IP             28                                                                                https   docs aws amazon com vpc latest userguide VPC Internet Gateway html                                                                                ingress                                           egress                                       Elastic IP Address EIP          VPC                                       NAT        https   docs aws amazon com vpc latest userguide vpc nat gateway html                                  VPC                       VPC                            IPv6                                              IPv6                       VPC   egress only internet gateways  EIGW   https   docs aws amazon com vpc latest userguide egress only internet gateway html                                                          IPv6                 VPC          https   docs aws amazon com vpc latest userguide VPC Scenario2 html                                        VPC                                                                                kubernetes io role elb   http   kubernetes io role elb                                                                                NAT          ENI                                                                kubernetes io role internal elb   http   kubernetes io role internal elb 1                                                     VPN            EC2     Amazon ECR   S3            AWS PrivateLink  https   docs aws amazon com vpc latest userguide endpoint service html                                                                 EKS                  https   docs aws amazon com eks latest userguide private clusters html                       VPC            VPC      VPC          EKS                            Amazon VPC Lattice  https   aws amazon com vpc lattice            VPC                                 VPC      AWS PrivateLink    AWS Transit Gateway                                   https   aws amazon com blogs networking and content delivery build secure multi account multi vpc connectivity for your applications with amazon vpc lattice                            Amazon VPC Lattice  traffic flow    vpc lattice gif    Amazon VPC Lattice  IPv4   IPv6                      IPv4                                          EKS                  IP                        IP         VPC                                         RFC1918 IP                CIDR                   NAT        https   docs aws amazon com vpc latest userguide vpc nat gateway html nat gateway basics                      custom networking index md        transit gateway  https   docs aws amazon com whitepapers latest aws vpc connectivity options aws transit gateway html      VPC CNI       EKS                          Private Nat Gateway with Custom Networking  traffic flow    private nat gw gif                         VPC                   ALB    NLB                               AWS PrivateLink  https   docs aws amazon com vpc latest privatelink privatelink share your services html                           VPC             AWS         AWS                                                   Amazon VPC             AWS Resource Access Manager RAM              AWS      https   docs aws amazon com ram latest userguide shareable html      AWS           OU        AWS                  AWS RAM          AWS         VPC      Amazon EKS                         AWS                                                                                VPC                                                    AWS     Amazon EKS                                        github      https   github com aws samples eks shared subnets                   Deploying Amazon EKS in VPC Shared Subnets across AWS Accounts     eks shared subnets png                             Amazon EKS                     VPC                         Amazon EKS     VPC                            Amazon EKS  AWS VPC       SG                                                                       VPC          IP                                       participant                                                                                VPC                                              Amazon EKS                    IAM                        IAM          Amazon EKS                    Fargate                                                     Amazon EKS               AWS                                             Amazon S3     Dynamodb           AWS                                                       AWS                                                        IAM                                        OIDC      IAM                                                  AWS            IAM          AWS      https   docs aws amazon com IAM latest UserGuide reference aws services that work with iam html                                                   OIDC              OIDC      IAM                    IAM                     AWS                                                                                IAM     https   aws amazon com blogs containers cross account iam roles for kubernetes service accounts                  Amazon Elastic Loadbalancer ELB      ALB    NLB                                                                      ELB                                            Amazon EKS        https   aws amazon com blogs containers expose amazon eks pods through cross account load balancer                                                                                Amazon VPC CNI                  custom networking feature                                  AZ  ID               ENIConfig                    AZ    AWS     AZ                                            https   docs aws amazon com vpc latest userguide VPC SecurityGroups html                                          Amazon EKS                            https   docs aws amazon com eks latest userguide sec group reqs html                          Amazon EKS   eks cluster sg my cluster uniqueID                  EKS                 ENI                                                                                https   docs aws amazon com eks latest userguide sec group reqs html                             AZ        AWS                             AZ                                                                                Amazon EKS  EKS                                                                                Kubelet    topology kubernetes io region us west 2    topology kubernetes io zone us west 2d   http   topology kubernetes io region us west 2 topology kubernetes io zone us west 2d                                         Pod topology spread constraints  https   kubernetes io docs concepts scheduling eviction topology spread constraints                                                                      https   kubernetes io docs reference command line tools reference kube scheduler                                                                                AZ                              https   kubernetes io docs concepts scheduling eviction assign pod node  nodeselector                                                                                EKS                                                 topology spread constraints           Karpenter  https   karpenter sh            AZ       AZ                AWS Elastic Loadbalancer              AWS                                                         ALB                                       NLB             Elastic Loadbalancer            https   aws amazon com premiumsupport knowledge center eks vpc subnet discovery                     ELB                                               AZ                                             AZ                                                                       VPC              EKS                                                                                NAT                              IPv6    EIGW                                 https   docs aws amazon com vpc latest userguide egress only internet gateway html                                                                                AWS      VPC                                                                                AWS                  PrivateLink                                   AWS                                                                                kubernetes io role internal elb  1   http   kubernetes io role internal elb                                                                                https   docs aws amazon com eks latest userguide private clusters html                                             Amazon EKS                                                                                VPC            API                               VPC                        VPC                            API                                                 CIDR                    CIDR                                                    https   docs aws amazon com eks latest userguide cluster endpoint html modify endpoint access                                                       EKS          https   docs aws amazon com eks latest userguide cluster endpoint html private access                     API                                                Amazon EKS                                                                                https   docs aws amazon com eks latest userguide sec group reqs html                          EKS                                          X ENI                                                                                https   eksctl io usage schema  nodeGroups securityGroups                                       Karpenter                    securityGroupSelectorTerms  https   karpenter sh docs concepts nodeclasses  specsecuritygroupselectorterms                                                                                NAT                    IPv4   IPv6                       AZ   NAT                                    AZ                      AZ    NAT                         Cloud9                       AWS Cloud9  AWS Systems Manager                                                 IDE     Cloud9                              Cloud9                                                 https   aws amazon com blogs security isolating network access to your aws cloud9 environments      illustration of AWS Cloud9 console connecting to no ingress EC2 instance     image 2 jpg