

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# IPVS 모드에서 kube-proxy 실행
<a name="ipvs"></a>

IP 가상 서버(IPVS) 모드의 EKS는 레거시 iptables 모드에서 실행되는 kube-proxy가 있는 1,000개 이상의 서비스로 대규모 클러스터를 실행할 때 자주 나타나는 [네트워크 지연 시간 문제를](https://docs.aws.amazon.com/eks/latest/best-practices/control-plane.html#reliability_cprunning_large_clusters) 해결합니다. 이 성능 문제는 각 패킷에 대한 iptables 패킷 필터링 규칙을 순차적으로 처리한 결과입니다. 이 지연 시간 문제는 iptables의 후속인 nftables에서 해결되었습니다. 그러나이 작성 시점을 기준으로 [kube-proxy는 여전히 nftables를 사용하기 위해 개발 중입니다](https://kubernetes.io/docs/reference/networking/virtual-ips/#proxy-mode-nftables). 이 문제를 해결하려면 IPVS 모드에서 실행되도록 클러스터`kube-proxy`를 구성할 수 있습니다.

## 개요
<a name="_overview"></a>

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

IPVS는 트래픽을 백엔드 포드로 분산하기 위한 몇 가지 옵션을 제공합니다. 각 옵션에 대한 자세한 내용은 [공식 Kubernetes 설명서](https://kubernetes.io/docs/reference/networking/virtual-ips/#proxy-mode-ipvs)에서 확인할 수 있지만 간단한 목록은 아래에 나와 있습니다. 라운드 로빈 및 최소 연결은 Kubernetes에서 IPVS 로드 밸런싱 옵션에 가장 많이 사용되는 옵션 중 하나입니다.

```
- rr (Round Robin)
- wrr (Weighted Round Robin)
- lc (Least Connections)
- wlc (Weighted Least Connections)
- lblc (Locality Based Least Connections)
- lblcr (Locality Based Least Connections with Replication)
- sh (Source Hashing)
- dh (Destination Hashing)
- sed (Shortest Expected Delay)
- nq (Never Queue)
```

### 구현
<a name="_implementation"></a>

EKS 클러스터에서 IPVS를 활성화하려면 몇 단계만 수행하면 됩니다. 먼저 EKS 작업자 노드 이미지에 Linux 가상 서버 관리 `ipvsadm` 패키지가 설치되어 있는지 확인해야 합니다. Amazon Linux 2023과 같은 Fedora 기반 이미지에이 패키지를 설치하려면 작업자 노드 인스턴스에서 다음 명령을 실행할 수 있습니다.

```
sudo dnf install -y ipvsadm
```

Ubuntu와 같은 Debian 기반 이미지에서 설치 명령은 다음과 같습니다.

```
sudo apt-get install ipvsadm
```

그런 다음 위에 나열된 IPVS 구성 옵션에 대한 커널 모듈을 로드해야 합니다. 이러한 모듈은 재부팅 후에도 유지되도록 `/etc/modules-load.d/` 디렉터리 내부의 파일에 쓰는 것이 좋습니다.

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

다음 명령을 실행하여 이미 실행 중인 시스템에 이러한 모듈을 로드할 수 있습니다.

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

**참고**  
[사용자 데이터 스크립트](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)를 통해 또는 사용자 지정 작업자 노드 AMI를 빌드하기 위해 실행된 빌드 스크립트에서 작업자 노드의 부트스트래핑 프로세스의 일부로 이러한 작업자 노드 단계를 실행하는 것이 좋습니다.

다음으로 IPVS 모드에서 실행되도록 클러스터의 `kube-proxy` DaemonSet를 구성합니다. 이는 예를 들어 라운드 로빈의 `rr` 경우 `ipvs`를 `kube-proxy` `mode` 로 설정하고 `ipvs scheduler`를 위에 나열된 로드 밸런싱 옵션 중 하나로 설정하여 수행됩니다.

**주의**  
이는 중단적인 변경이며 업무 외 시간에 수행해야 합니다. 영향을 최소화하려면 초기 EKS 클러스터 생성 중에 이러한 변경을 수행하는 것이 좋습니다.

`kube-proxy` EKS 추가 기능을 업데이트하여 AWS CLI 명령을 실행하여 IPVS를 활성화할 수 있습니다.

```
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` ConfigMap을 수정하여이 작업을 수행할 수 있습니다.

```
kubectl -n kube-system edit cm kube-proxy-config
```

아래에서 `scheduler` 설정을 찾고 값을 위에 나열된 ipvs 로드 밸런싱 옵션 중 하나로 `ipvs` 설정합니다. 예: `rr` for Round Robin. 기본값이 인 `mode` 설정을 찾아 값을 로 `iptables`변경합니다`ipvs`. 두 옵션의 결과는 아래 구성과 비슷해야 합니다.

```
  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 DaemonSet를 다시 시작해야 합니다.

```
kubectl -n kube-system rollout restart ds kube-proxy
```

### 검증
<a name="_validation"></a>

작업자 노드 중 하나에서 다음 명령을 실행하여 클러스터 및 작업자 노드가 IPVS 모드에서 실행 중인지 확인할 수 있습니다.

```
sudo ipvsadm -L
```

최소한 아래 결과와 비슷한 결과가 표시되며의 Kubernetes API Server 서비스 `10.100.0.1` 및의 CoreDNS 서비스에 대한 항목이 표시됩니다`10.100.0.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
```

**참고**  
이 예제 출력은 서비스 IP 주소 범위가 인 EKS 클러스터에서 가져옵니다`10.100.0.0/16`.